Форум 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=198763)

GrafMine 04.05.2013 20:52

Правильное вращение объекта
 
Столкнулся с проблемой правильного вращения объекта по координатам мыши :
Код AS3:

var dx:Number = mousePositionX - hero.x;
var dy:Number = mousePositionY - hero.y;
hero.rotation = Math.atan2(dy, dx) * 180 / Math.PI;

данный пример стоит и не работает, есть у кого готовая формула для правильного вращения по координатам мыши ?

caseyryan 04.05.2013 22:02

проблема не в этом коде

GrafMine 04.05.2013 22:14

Цитата:

Сообщение от caseyryan (Сообщение 1132186)
проблема не в этом коде

я пробовал менять менять формулу было местами где-то похожее на правильное реагирование, но так как есть сейчас объект вращается "как-то вообще не понятно" , не делая даже 360 градусов. :o
P.S.вращение объекта только тут присваиваться

NikolyA 04.05.2013 23:26

так все же? что надо и что у вас есть?

bav 04.05.2013 23:35

Вложений: 1
Проблема в переменных mousePositionX и mousePositionY. Вот набросал рабочий пример.
TestProject.swf   (1.5 Кб)

Код AS3:

package 
{
        import flash.display.Graphics;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
 
        /**
        * ...
        * @author bav
        */

        [Frame(factoryClass="Preloader")]
        public class Main extends Sprite
        {
                private var hero:Sprite;
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
 
                        hero = new Sprite();
                        var g:Graphics = hero.graphics;
                        g.lineStyle(1);
                        g.beginFill(0xFFFF00);
                        g.moveTo( -10, -10);
                        g.lineTo(10, 0);
                        g.lineTo(-10, 10);
                        g.lineTo( -10, -10);
                        g.endFill();
 
                        hero.x = stage.stageWidth / 2;
                        hero.y = stage.stageHeight / 2;
                        addChild(hero);
 
                        stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
                }
 
                private function mouseMoveHandler(e:MouseEvent):void
                {
                        var dx:Number = e.stageX - hero.x;
                        var dy:Number = e.stageY - hero.y;
                        hero.rotation = Math.atan2(dy, dx) * 180 / Math.PI;
 
                        var g:Graphics = this.graphics;
                        g.clear();
                        g.lineStyle(2, 0xFF0000);
                        g.moveTo(hero.x, hero.y);
                        g.lineTo(e.stageX, e.stageY);
                }
 
        }
 
}


GrafMine 04.05.2013 23:41

Цитата:

Сообщение от NikolyA (Сообщение 1132189)
так все же? что надо и что у вас есть?

Надо чтоб герой вращался в указанную сторону мышкой , а при данной формуле он "смотрит" только в правый нижний угол игрового поля, и в зависимости где мышка иногда может повернуться на 30-40 градусов ниже или выше
А есть у меня вот такой вот код :) :
Код AS3:

// create hero 
hero = new Sprite;
hero.graphics.beginFill(0xff0000, 1);
hero.graphics.drawRect( -15, -15, 30, 50);
hero.graphics.endFill();
hero.x = 200;
hero.y = 200;
addChild(hero);
 
 
 
private function mouseMoveHandler(event:MouseEvent):void {// может тут что-то не правильно...
                        if(event.stageX > gameWidth * .1 && event.stageX < gameWidth * .9) {
                                mousePositionX = event.stageX;
                        }
                        if(event.stageY > gameHeight * .5 && event.stageY < gameHeight * .9) {
                                mousePositionY = event.stageY;
                        }
                }
 
 
private function enterFrameHandler(event:Event):void {
var dx:Number = mousePositionX - hero.x;
var dy:Number = mousePositionY - hero.y;
hero.rotation =Math.atan2(dy, dx) * 180 / Math.PI;
}


expl 05.05.2013 00:01

Может просто координаты героя в глобальной системе вовсе не (200, 200)?
Плюс не факт, что mouseMoveHandler срабатывает
Напишите надёжнее:
Код AS3:

var dx:Number = stage.mouseX - hero.x;
var dy:Number = stage.mouseY - hero.y;

Или даже так:
Код AS3:

var heroXY:Point = hero.localToGlobal(new Point());
var dx:Number = stage.mouseX - heroXY.x;
var dy:Number = stage.mouseY - heroXY.y;


GrafMine 05.05.2013 00:13

Цитата:

Сообщение от bav (Сообщение 1132191)
Проблема в переменных mousePositionX и mousePositionY. Вот набросал рабочий пример.

впринцепи нечем не отличается ну я все равно поставил ваш пример, теперь вращается ну присутствует косяк .
Косяк в том что примерно ровно 90 градусов между тем куда смотрит герой и куда поидеи он "должен смотреть на мышку"... все перепроверил 1000 раз не могу понять...

Цитата:

Сообщение от expl (Сообщение 1132194)
Может просто координаты героя в глобальной системе вовсе не (200, 200)?
Плюс не факт, что mouseMoveHandler срабатывает
Напишите надёжнее:

ну в компилированом приложении он в таких примерно координатах и стоит, а как проверить в глобальной ситеме ?
попробовал даже ваш :
Код AS3:

var heroXY:Point = hero.localToGlobal(new Point());
var heroXX:Point = hero.localToGlobal(new Point());
var dx:Number = event.stageX - heroXX.x;
var dy:Number = event.stageY - heroXY.y;
hero.rotation = Math.atan2(dy, dx) * 180 / Math.PI;

все равно, вот 90 градусов как буд-то не хватает...

Wolsh 05.05.2013 00:17

Так может нарисовать героя надо было смотрящим в нужную сторону (на 3 часа, а не на 0)? :)
Ну или просто доворачивать его на 90.

GrafMine 05.05.2013 00:29

Цитата:

Сообщение от Wolsh (Сообщение 1132196)
Так может нарисовать героя надо было смотрящим в нужную сторону (на 3 часа, а не на 0)? :)
Ну или просто доворачивать его на 90.

поставил треугольник что на форуме, понял что да неправильно нарисован, но когда начал стрелять то стрелять начал боком( то есть где раньше было лицо) т.е. все-таки правильно все было?
Код AS3:

bullet.rotation = hero.rotation;

все проблема решена так :
Код AS3:

hero.rotation = (Math.atan2(dy, dx) * 180 / Math.PI)-90;

Спасибо большое за помощь :)


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

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