Piotr Danielewicz

Piotr Danielewicz front-end developer,
Media 4 U

Temat: Problem z rotacją obiektu poruszającego się za myszką

Cześć
Mam problem z rotowaniem obiektu, który porusza się za myszką.
Chodzi o to, że jeśli obiekt osiągnie 180 lub -180 stopni wtedy jego rotacja wywraca się do góry nogami ;)

Samo zobaczcie (kursor myszki poruszajcie po lewej stronie strzałki):
http://galaxykits.com/_move/

A teraz kod

stage.addEventListener(Event.ENTER_FRAME, moveIt);
function moveIt(e:Event) {
var dir:Number = Math.atan2(stage.mouseY-myStage.y,stage.mouseX-myStage.x)*180/Math.PI;
myStage.rotation = myStage.rotation+(dir-myStage.rotation)/5;
myStage.x += Math.cos(dir*Math.PI/180)*2;
myStage.y += Math.sin(dir*Math.PI/180)*2;
}


Próbowałem już na kilka sposobów zrobić warunki ale lipa.

Dzięki za pomoc

konto usunięte

Wypowiedzi autora zostały ukryte. Pokaż autora
Piotr Danielewicz

Piotr Danielewicz front-end developer,
Media 4 U

Temat: Problem z rotacją obiektu poruszającego się za myszką

Odpoczywaj, ja w tym czasie sam sobie odpowiem ;)

if (Math.round(dir) > myStage.rotation + 180) dir -= 360;
if (Math.round(dir) < myStage.rotation - 180) dir += 360;

:)
Tomasz Fołtyn

Tomasz Fołtyn Programista
aplikacji oraz
testów
automatycznych

Temat: Problem z rotacją obiektu poruszającego się za myszką

Tu masz fragment kodu który załatwia wszystko w 2 linijkach.


var rad:Number = Math.atan2(container.mouseY - object.x, container.mouseX - object.y);
object.rotation = rad * (180 / Math.PI) + 90;



"+90" jeżeli obiekt jest domyślnie skierowany w górę. Jeżeli obiekt jest skierowany w prawo nie musimy dodawać niczego.

konto usunięte

Wypowiedzi autora zostały ukryte. Pokaż autora
Piotr Danielewicz

Piotr Danielewicz front-end developer,
Media 4 U

Temat: Problem z rotacją obiektu poruszającego się za myszką

Dzięki wielkie Panowie za pomoc :)

Jednak muszę dodawać jeśli chcę mieć płynną animację. Przy animacji bez opóźnienia wszystko działa poprawnie.
Przy okazji w kodzie Tomasza był błąd. y powinien byc odejmowany od Y, a x od X ;)
Krzysztof Michalak

Krzysztof Michalak Front-end / Drupal

Temat: Problem z rotacją obiektu poruszającego się za myszką

http://www.adobe.com/devnet/flashplayer/articles/nativ...
Piotr Danielewicz

Piotr Danielewicz front-end developer,
Media 4 U

Temat: Problem z rotacją obiektu poruszającego się za myszką

Dzięki Krzysiek, ale link raczej nie na temat ;)
Krzysztof Michalak

Krzysztof Michalak Front-end / Drupal

Temat: Problem z rotacją obiektu poruszającego się za myszką

to w kwestii płynnej animacji ;) natywny kursor chodzi lepiej.
pzdr
Piotr Danielewicz

Piotr Danielewicz front-end developer,
Media 4 U

Temat: Problem z rotacją obiektu poruszającego się za myszką

Nie nie, tu nie chodzi o zastąpienie kursora jakimś MC czy czymś wbudowanym. Chodziło o to by strzałka MC wskazywała i poruszała się w stronę kursora i robiła to płynnie, z opóźnieniem.
Rotację możnaby było zrobić za pomocą TweenLite i shortRotation, ale nie chciałem używać czegoś aż tak dużego kiedy mogę całość zamknąć w kilku linijkach kodu :)
Jerzy Wierzchowski

Jerzy Wierzchowski Senior Software
Developer

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

Następna dyskusja:

.width i .height obiektu za...




Wyślij zaproszenie do