Temat: Problem z rotacją obiektu poruszającego się za myszką
o to chodzi?
http://blogtest.flamaniac.pl/MissilesTest/
Pamiętaj aby liczyć rotacje na zmiennej lokalnej a nie na włąściwości obiektu bo to setter i np jak przypisujesz 270 stopni to nie znaczy że tyle odczytasz za z niego w kolejnej linii ( sprowadzi do przedziału <-180;180>) - można się naciąć.
package test {
import flash.geom.Point;
import flash.display.Sprite;
/**
* @author JerzyW
*/
public class MissleTestClip extends Sprite
{
private var moveSpeedMax:Number = 80;
private var rotateSpeedMax:Number = 15;
private var decay:Number = .96;
private var _isActive:Boolean = false;
private var dx:Number = 0;
private var dy:Number = 0;
private var vx:Number = 0;
private var vy:Number = 0;
private var trueRotation:Number = 0;
private var target : Point;
public function MissleTestClip(target:Point)
{
this.target=target;
graphics.beginFill(0x00ff00);
graphics.drawRect(-10, -20, 20, 40);
graphics.endFill();
}
public function update():void{
updatePosition();
updateRotation();
}
/**
* Calculate Rotation
*/
private function updateRotation():void
{
// calculate rotation
dx = x - target.x;
dy = y - target.y;
// which way to rotate
var rotateTo:Number = getDegrees(getRadians(dx, dy)- .5 *Math.PI); // keep rotation positive, between 0 and 360 degrees
if (rotateTo > rotation + 180) rotateTo -= 360;
if (rotateTo < rotation - 180) rotateTo += 360;
// ease rotation
trueRotation = (rotateTo - rotation) / rotateSpeedMax;
// update rotation
rotation += trueRotation; }
/**
* Calculate Position
*/
private function updatePosition():void
{
// check if mouse is down
if (_isActive)
{
// update velocity
vx += (target.x ) / moveSpeedMax;
vy += (target.y ) / moveSpeedMax;
}
else
{
// when mouse is not down, update velocity half of normal speed
vx += (target.x - x) / moveSpeedMax * .25;
vy += (target.y - y) / moveSpeedMax * .25;
} // apply decay (drag)
vx *= decay;
vy *= decay;
// if close to target, slow down turn speed
if (getDistance(dx, dy) < 50)
{
trueRotation *= .5;
} // update position
x += vx;
y += vy;
}
/**
* Get distance
* @param delta_x
* @param delta_y
* @return
*/
public function getDistance(delta_x:Number, delta_y:Number):Number
{
return Math.sqrt((delta_x*delta_x)+(delta_y*delta_y));
}
/**
* Get radians
* @param delta_x
* @param delta_y
* @return
*/
public function getRadians(delta_x:Number, delta_y:Number):Number
{
var r:Number = Math.atan2(delta_y, delta_x);
if (delta_y < 0)
{
r += (2 * Math.PI);
}
return r;
}
/**
* Get degrees
* @param radians
* @return
*/
public function getDegrees(radians:Number):Number
{
return Math.floor(radians/(Math.PI/180));
}
}
}
Ten post został edytowany przez Autora dnia 14.06.13 o godzinie 22:23