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

Riki 17.09.2012 23:21

Столкновения
 
Вложений: 1
Проблема в том, что когда player врезается в wall(Down, Left, Up, Right),то он не останавливается а продолжает проезжать, но как бы рывками, внизу вложен swf файл, подскажите что нужно изменить, что бы код заработал, Заранее благодарен.
Код AS3:

import flash.display.MovieClip;
        import flash.events.Event;
        import flash.events.KeyboardEvent;
        import flash.ui.Keyboard;
        import flash.display.DisplayObject;
        import net.flashpunk.graphics.Text;
 
                var player:MovieClip;
 
                var playerSpeed:Number = 4;
 
                var movingUp:Boolean = false;
                var movingDown:Boolean = false;
                var movingLeft:Boolean = false;
                var movingRight:Boolean = false;                       
 
                        stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);                       
                        stage.addEventListener(KeyboardEvent.KEY_DOWN, myOnPress);
                        stage.addEventListener(KeyboardEvent.KEY_UP, myOnRelease);       
                        this.addEventListener(Event.ENTER_FRAME, chekim);               
 
                function enterFrameHandler(event:Event):void
                {
                        if ( movingLeft && !movingRight )
                        {
                                player.x -= playerSpeed;
                        }
                        if ( movingRight && !movingLeft )
                        {
                                player.x += playerSpeed;
                        }
                        if ( movingUp && !movingDown )
                        {
                                player.y -= playerSpeed;
                        }
                        if ( movingDown && !movingUp )
                        {
                                player.y += playerSpeed;
                        }
                }
 
                function myOnPress(event:KeyboardEvent):void
                {
                        switch( event.keyCode )
                        {
                                case Keyboard.UP:
                                        movingUp = true;
                                        movingDown = false;
                                        movingLeft = false;
                                        movingRight = false;
                                        break;
 
                                case Keyboard.DOWN:
                                        movingUp = false;
                                        movingDown = true;
                                        movingLeft = false;
                                        movingRight = false;
                                        break;
 
                                case Keyboard.LEFT:
                                        movingUp = false;
                                        movingDown = false;
                                        movingLeft = true;
                                        movingRight = false;
                                        break;
 
                                case Keyboard.RIGHT:
                                        movingUp = false;
                                        movingDown = false;
                                        movingLeft = false;
                                        movingRight = true;
                                        break;
                        }
                }
 
                function myOnRelease(event:KeyboardEvent):void
                {
                        switch( event.keyCode )
                        {
                                case Keyboard.UP:
                                        movingUp = false;
                                        break;
                                case Keyboard.DOWN:
                                        movingDown = false;
                                        break;
                                case Keyboard.LEFT:
                                        movingLeft = false;
                                        break;
                                case Keyboard.RIGHT:
                                        movingRight = false;
                                        break;
                        }
                }
 
 
function chekim (e:Event):void
{
if (wallUp.hitTestObject(player as DisplayObject))
{
movingUp = false;
}else if (wallDown.hitTestObject(player as DisplayObject)){
        movingDown = false;
} else if (wallRight.hitTestObject(player as DisplayObject)){
        movingRight = false;
} else if (wallLeft.hitTestObject(player as DisplayObject)){
        movingLeft = false;
}
}


caseyryan 18.09.2012 07:11

решение просто - надо проверять столкновение до того, как добавлять какие-либо значения к x и y

Riki 19.09.2012 00:37

Спасибо, помогло, но выявилась проблема другого характера, теперь квадрат останавливается только при некоторых стенах, и некоторые простно игнорит, хотя название у стен одинаковое wallLeft(чисто как пример), что тут может быть????

caseyryan 19.09.2012 07:30

Цитата:

хотя название у стен одинаковое wallLeft(чисто как пример),
Этого быть не должно. Все названия должны быть уникальны.

Hauts 19.09.2012 07:40

Лучше бы проверяли с использованием растровой карты уровня, тогда стены хоть кисточкой рисовать можно и не нужно городить кучу "hitTestObject".

Riki 19.09.2012 18:36

Цитата:

Сообщение от Hauts (Сообщение 1096514)
Лучше бы проверяли с использованием растровой карты уровня, тогда стены хоть кисточкой рисовать можно и не нужно городить кучу "hitTestObject".

А можно пример, а то я не очень Вас понял. Как в данной ситуации это использовать?

Hauts 19.09.2012 18:46

Берете положение и размеры вашего движущегося квадратика и с этими же свойствами отрисовываете кусочек карты под ним в битмапдату. Потом с помощью BitmapData.getColorBoundsRect проверяете, есть ли непрозрачные пиксели. В итоге, если есть (то есть квадратик наехал на стенку), вы получите Rectangle области пересечения, а значит будете знать, с какой стороны пересечение и насколько "глубоко".

Вот еще есть схожая тема: http://xitri.com/2008/09/29/simple-e...iew-part2.html

Riki 19.09.2012 18:57

Цитата:

Сообщение от Hauts (Сообщение 1096634)
Берете положение и размеры вашего движущегося квадратика и с этими же свойствами отрисовываете кусочек карты под ним в битмапдату. Потом с помощью BitmapData.getColorBoundsRect проверяете, есть ли непрозрачные пиксели. В итоге, если есть (то есть квадратик наехал на стенку), вы получите Rectangle области пересечения, а значит будете знать, с какой стороны пересечение и насколько "глубоко".

Вот еще есть схожая тема: http://xitri.com/2008/09/29/simple-e...iew-part2.html

Не хочется быть навязчивым, но не могли бы вы показать реализацию "этого" на моем примере?

Добавлено через 38 часов 4 минуты
Up Up


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

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