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

al0ne 25.11.2010 21:48

Персонаж некорректно передвигается.
 
Вообщем как обычно, после долгих часов раздумий, обращаюсь за помощью.
Весь код перерыл, но так и не дошло до меня в чем же проблема.
Короче, персонаж двигается согласно заданным параметрам,но после возвращается в прежнее положение.
Код AS3:

package
{
 
        import flash.display.*;
    import flash.events.*;
    import flash.ui.*;
    import flash.utils.*;
 
        public class ScotlandCheer extends MovieClip
        {
                public var ground:Ground;
                public var army:Array;
                public var alien:Alien;
                public var gameTimer:Timer;
                public var archibald:Archibald;
                public var grounded:Boolean;
                public var downKeyIsBeingPressed:Boolean;
                public var upKeyIsBeingPressed:Boolean;
                public var leftKeyIsBeingPressed:Boolean;
                public var rightKeyIsBeingPressed:Boolean;
 
 
 
                public function ScotlandCheer()
                {
                        leftKeyIsBeingPressed = false;
                        rightKeyIsBeingPressed = false;
                        downKeyIsBeingPressed = false;
                        upKeyIsBeingPressed = false;
 
 
 
                        ground = new Ground();
                        addChild(ground);
 
                        army = new Array();
                        var newAlien = new Alien (200,50);
                        army.push (newAlien);
                        addChild(newAlien);
 
 
 
                        archibald = new Archibald();
                        addChild(archibald);
                        archibald.x = mouseX;
                        archibald.y = mouseY;
 
 
                        gameTimer = new Timer(25);
                        gameTimer.addEventListener (TimerEvent.TIMER,onTick);
                        gameTimer.start();
                        grounded = true;
                        addEventListener( Event.ADDED_TO_STAGE, onAddToStage );
                        return;
 
 
 
 
 
 
 
                }
 
 
 
 
 
 
                public function onTick(timerEvent:TimerEvent):void
                {
 
                        if (Math.random() <0.01)
                        {
                        var randomX:Number = Math.random()* 550;
                        var newAlien = new Alien (randomX,50);
                        army.push (newAlien);
                        addChild(newAlien);
                        }
                        archibald.x = 400;
                        archibald.y = 500;
 
                        for each( var alien:Alien in army)
 
                        if (grounded) alien.MoveABit();
 
                        if(alien.hitTestObject(ground))
                        {
                                alien.MoveABit();
                                grounded = false;
 
                        }
                        if (leftKeyIsBeingPressed)
                        {
                                archibald.moveABit(-3,0);
                        }
 
                        // ГраницаЭкрана
 
                        if (archibald.x <(archibald.width / 2))
                        {
                                archibald.x = archibald.width / 2;
                        }
                        else if (archibald.x > 800 - (archibald.width / 2))
                                        {
                                                archibald.x = 800 - (archibald.width / 2)
                                        }
 
 
                }//Конец функции
 
                public function onKeyPress(event:KeyboardEvent):void
                {
                        if (event.keyCode == Keyboard.LEFT)
                        {
                                leftKeyIsBeingPressed = true;
                        }
                        else if (event.keyCode == Keyboard.RIGHT)
                        {
                                rightKeyIsBeingPressed = true;
                        }
                        else if (event.keyCode == Keyboard.DOWN)
                        {
                                downKeyIsBeingPressed = true;
                        }
                        else if (event.keyCode == Keyboard.UP)
                        {
                                upKeyIsBeingPressed = true;
                        }
                        return;
                }
                public function onAddToStage( event:Event ):void
{
        stage.addEventListener( KeyboardEvent.KEY_DOWN, onKeyPress );
        stage.addEventListener( KeyboardEvent.KEY_UP, onKeyRelease );
        return;
}
 
                        public function onKeyRelease(event:KeyboardEvent):void
                {
                        if (event.keyCode == Keyboard.LEFT)
                        {
                                leftKeyIsBeingPressed = false;
                        }
                        else if (event.keyCode == Keyboard.RIGHT)
                        {
                                rightKeyIsBeingPressed = false;
                        }
                        else if (event.keyCode == Keyboard.DOWN)
                        {
                                downKeyIsBeingPressed = false;
                        }
                        else if (event.keyCode == Keyboard.UP)
                        {
                                upKeyIsBeingPressed = false;
                        }
                        return;
                }
 
 
 
 
        }
 
 
}

Вообщем-то вот. Ума не приложу, в чем же тут проблема?

bav 25.11.2010 22:54

У вас в функции onTick, которая вызывается каждые 25 миллисекунд, ясно сказано:
Код AS3:

archibald.x = 400;
archibald.y = 500;

Если вы хотели, чтобы Арчибальд возвращался в исходное положение только 1% случаев, вам нужно поставить эти две строки в соответствующий блок кода.
Код AS3:

if (Math.random() <0.01)
{
    archibald.x = 400;
    archibald.y = 500;
    ...
}

Добавлено через 4 минуты
Еще нужно определить фигурными скобками границы цикла:
Код AS3:

for each( var alien:Alien in army)
{
    ...
}


al0ne 25.11.2010 23:05

Хм.Что-то после предыдущих действий с падающими объектами арчи вообще уже не ходит=)
Мне нужно сделать так, чтобы он вообще не возвращался в исходное положение.

bav 25.11.2010 23:12

Бедный Арчи...
Попробуйте перенести логику движения Арчибальда в его собственный класс, чтобы он не путался с кем попало в одной функции.

al0ne 25.11.2010 23:16

Дык логика движений внутри класса персонажа.

bav 25.11.2010 23:54

Написал следующее:
Класс Main:
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.KeyboardEvent;
        import flash.events.TimerEvent;
        import flash.utils.Timer;
        import flash.ui.Keyboard;
 
        public class Main extends Sprite
        {
                public var ground:Ground;
                public var army:Array;
                public var alien:Alien;
                public var gameTimer:Timer;
                public var archibald:Archibald;
                public var downKeyIsBeingPressed:Boolean;
                public var upKeyIsBeingPressed:Boolean;
                public var leftKeyIsBeingPressed:Boolean;
                public var rightKeyIsBeingPressed:Boolean;
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
                private function init(event:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
 
                        leftKeyIsBeingPressed = false;
                        rightKeyIsBeingPressed = false;
                        downKeyIsBeingPressed = false;
                        upKeyIsBeingPressed = false;
 
                        ground = new Ground(stage.stageWidth, 100);
                        ground.y = stage.stageHeight - ground.height;
                        addChild(ground);
 
                        army = new Array();
                        var newAlien:Alien = new Alien(200, 50);
                        army.push(newAlien);
                        addChild(newAlien);
 
                        archibald = new Archibald();
                        addChild(archibald);
                        archibald.x = mouseX;
                        archibald.y = mouseY;
 
                        gameTimer = new Timer(25);
                        gameTimer.addEventListener(TimerEvent.TIMER, onTick);
                        gameTimer.start();
 
                        stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyPress);
                        stage.addEventListener(KeyboardEvent.KEY_UP, onKeyRelease);
                }
 
                public function onTick(timerEvent:TimerEvent):void
                {
                        if (Math.random() < 0.01)
                        {
                                var randomX:Number = Math.random() * stage.stageWidth;
                                var newAlien:Alien = new Alien (randomX, 50);
                                army.push(newAlien);
                                addChild(newAlien);
                        }
 
                        for each(var alien:Alien in army)
                        {
                                if (alien.grounded && alien.hitTestObject(ground)) alien.grounded = false;
                                alien.grounded ? alien.moveABit(0,3) : alien.moveABit(3,0);
                        }
                        if (leftKeyIsBeingPressed)
                        {
                                archibald.moveABit(-3,0);
                        }
 
                        if (archibald.x < (archibald.width / 2))
                        {
                                archibald.x = archibald.width / 2;
                        }
                        else if (archibald.x > (stage.stageWidth - (archibald.width / 2)))
                        {
                                archibald.x = stage.stageWidth - (archibald.width / 2);
                        }
                }
 
                public function onKeyPress(event:KeyboardEvent):void
                {
                        if (event.keyCode == Keyboard.LEFT)
                        {
                                leftKeyIsBeingPressed = true;
                        }
                        else if (event.keyCode == Keyboard.RIGHT)
                        {
                                rightKeyIsBeingPressed = true;
                        }
                        else if (event.keyCode == Keyboard.DOWN)
                        {
                                downKeyIsBeingPressed = true;
                        }
                        else if (event.keyCode == Keyboard.UP)
                        {
                                upKeyIsBeingPressed = true;
                        }
                        return;
                }
 
                public function onKeyRelease(event:KeyboardEvent):void
                {
                        if (event.keyCode == Keyboard.LEFT)
                        {
                                leftKeyIsBeingPressed = false;
                        }
                        else if (event.keyCode == Keyboard.RIGHT)
                        {
                                rightKeyIsBeingPressed = false;
                        }
                        else if (event.keyCode == Keyboard.DOWN)
                        {
                                downKeyIsBeingPressed = false;
                        }
                        else if (event.keyCode == Keyboard.UP)
                        {
                                upKeyIsBeingPressed = false;
                        }
                }
        }
}

Класс Archibald:
Код AS3:

package  
{
        import flash.display.Sprite;
 
        public class Archibald extends Sprite
        {
                public function Archibald()
                {
                        graphics.lineStyle(1, 0x000000);
                        graphics.beginFill(0xFF0000);
                        graphics.drawCircle(0, 0, 25);
                        graphics.endFill();
                }
 
                public function moveABit(_x:int, _y:int):void
                {
                        x += _x;
                        y += _y;
                }
        }
}

Класс Alien:
Код AS3:

package  
{
        import flash.display.Sprite;
 
        public class Alien extends Sprite
        {
                public var grounded:Boolean = true;
                public function Alien(_x:int, _y:int)
                {
                        graphics.lineStyle(1, 0x000000);
                        graphics.beginFill(0x00FF00);
                        graphics.drawCircle(0, 0, 25);
                        graphics.endFill();
                        x = _x;
                        y = _y;
                }
 
                public function moveABit(_x:int, _y:int):void
                {
                        x += _x;
                        y += _y;
                }
        }
}

Класс Ground:
Код AS3:

package  
{
        import flash.display.Sprite;
        public class Ground extends Sprite
        {
                public function Ground(w:int, h:int)
                {
                        graphics.lineStyle(1, 0x000000);
                        graphics.beginFill(0x666666);
                        graphics.drawRect(0, 0, w, h);
                        graphics.endFill();
                }
        }
}

Арчибальд бодро реагирует на клавишу LEFT. Видимо у вас была ошибка в строчке
Код AS3:

else if (archibald.x > 800 - (archibald.width / 2))

надо, видимо, так:
Код AS3:

else if (archibald.x > (800 - (archibald.width / 2)))

Добавлено через 1 минуту
Еще в сточке
Код AS3:

var newAlien = new Alien (randomX,50);

у переменной newAlien не объявлен тип (var newAlien:Alien = new Alien (randomX,50))

Добавлено через 14 минут
Хотя, нет. Строчка с else if (...) если и была ошибочной, то на перемещение Арчи в данной реализации никак не влияет, потому что он пока может ходить только влево.

al0ne 26.11.2010 00:43

Мде. Впринципе все работало, просто после GameTimer.start стоял флаг. Вот изза него ничего и не работало.
Мне вот что не понятно:
Код AS3:

public function Main():void 
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
                private function init(event:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);

Зачем это?И как это работает?

Добавлено через 17 минут
Вот еще вопрос. Скажем, в mc с Арчи есть анимация(прыгает приседает бегает и тд.)
Как к ней обращаться?В самом mc то знаю как проигрывать и останавливать анимацию, а вот в .as файле - нет.
Как обратиться к фрейму посредством нажатия клавиши?

bav 26.11.2010 01:03

Это проверка на случай, если нашу флешку будут добавлять в другую флешку. И если мы сразу собираемся обращаться к stage, например вешать на него каких-нибудь слушателей.
Код AS3:

public function Main():void 
{
    // Смотрим, добавлены ли мы на stage
    // (в данном случае stage – то же что this.stage,
    // то есть ссылка на [Object Stage])
    if (stage) init();
    // если нет, ждем пока нас добавят.
    else addEventListener(Event.ADDED_TO_STAGE, init);
}
// Здесь, параметр event должен иметь значение по-умолчанию,
// чтобы мы могли вызвать функцию init() без генерации события.
// Или можно отказаться от использования значения по-умолчанию
// и вызывать init(null);
private function init(event:Event = null):void
{
    removeEventListener(Event.ADDED_TO_STAGE, init);
    ...
}



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

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