Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   "Примагнищивающийся" к мышке объект (http://www.flasher.ru/forum/showthread.php?t=126068)

silin 10.06.2009 21:40

Код AS3:

speedX = maxSpeed * Math.exp( -k * (objX - mouseX) * (objX - mouseX));


Яски 11.06.2009 04:36

А как вам такой вариант?

Код AS3:

package {
 
        import flash.display.*;
        import flash.events.Event;
        import flash.geom.*;
 
        public class SnapToMouse extends Sprite {
 
                private var object:DisplayObject;
                private const snapAreaWidth:Number = 50;
                private const fixedCoords:Point = new Point(150, 150);
 
                public function SnapToMouse() {
                        var sp:Shape = new Shape();
                        sp.graphics.beginFill(0xFF00);
                        sp.graphics.drawRect(-20, -5, 40, 10);
                        addChild(sp);
                        sp.x = fixedCoords.x;
                        sp.y = fixedCoords.y;
                        object = sp;
                        stage.scaleMode = StageScaleMode.NO_SCALE;
                        stage.align = StageAlign.TOP_LEFT;
                        stage.frameRate = 30;
 
                        addEventListener(Event.ENTER_FRAME, onEnterFrame);
                }
 
                private function onEnterFrame(e:Event):void {
                        var mx:Number = stage.mouseX;
                        var my:Number = stage.mouseY;
                        var dx:Number;
                        var dy:Number;
                        if (pointInSnapArea(mx, my)) {
                                dx = mx - object.x;
                                dy = my - object.y;
                                if ((dx*dx + dy*dy) < 0.1) {
                                        object.x = mx;
                                        object.y = my;
                                } else {
                                        // Изинг, можно делить на любое другое число
                                        dx /= 5;
                                        dy /= 5;
                                        object.x += dx;
                                        object.y += dy;
                                }
                        } else {
                                // Изинг обратно
                                dx = fixedCoords.x - object.x;
                                dy = fixedCoords.y - object.y;
                                if ((dx*dx + dy*dy) < 0.1) {
                                        object.x = fixedCoords.x;
                                        object.y = fixedCoords.y;
                                } else {
                                        // Изинг, можно делить на любое другое число
                                        dx /= 3;
                                        dy /= 3;
                                        object.x += dx;
                                        object.y += dy;
                                }
                        }
                }
 
                private function pointInSnapArea(pointX:Number, pointY:Number):Boolean {
                        var boundsRect:Rectangle = object.getBounds(stage);
                        // Фигура типа в фиксированных координатах, т.е. не двигается
                        boundsRect.x = fixedCoords.x;
                        boundsRect.y = fixedCoords.y;
                        // Фигура симетричная по двум осям,
                        // поэтому нормируем координаты относительно центра в одну четверть
                        var halfW:Number = boundsRect.width/2;
                        var halfH:Number = boundsRect.height/2;
                        pointX -= boundsRect.x + halfW;
                        pointY -= boundsRect.y + halfH;
                        pointX = (pointX < 0) ? -pointX : pointX;
                        pointY = (pointY < 0) ? -pointY : pointY;
                        if (pointX >= halfW) {
                                if (pointY > halfH) {
                                        pointX -= halfW;
                                        pointY -= halfH;
                                        return Math.sqrt(pointX*pointX + pointY*pointY) <= snapAreaWidth;
                                } else {
                                        return (pointX - halfW) <= snapAreaWidth;
                                }
                        } else {
                                return (pointY - halfH) <= snapAreaWidth;
                        }
                }
 
        }
}



Часовой пояс GMT +4, время: 14:25.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.