Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   hitTestObject проскакивает (http://www.flasher.ru/forum/showthread.php?t=149683)

Arbis 29.01.2011 23:56

hitTestObject проскакивает
 
Здравствуйте уважаемые флешеры :)
Что-то глючит у меня метод hitTestObject(), все работает, но почему-то глючит... а именно: может не сработать в первые три секунды после запуска приложения и автомобильчик мой проскочит сквозь стену, и при последующей работе тоже иногда не срабатывает, это случается очень редко, но все же хотелось бы устранить сей недостаток. Собственно кусок кода из моего творения:
Код AS3:

                private function gameRun(){
                        Car.addEventListener(Event.ENTER_FRAME, drive); // Car это и есть автомобиль
                        stage.addEventListener(KeyboardEvent.KEY_DOWN, addspeed);
                        stage.addEventListener(KeyboardEvent.KEY_UP, keyflush);
                }
                private function addspeed(e:KeyboardEvent){
                        if(e.keyCode == 38){
                                run = 1;
                        } else if(e.keyCode == 40){
                                run = 2;
                        }
                }
                private function keyflush(e:KeyboardEvent){
                        if((e.keyCode == 38) || (e.keyCode == 40)){
                                run = 0;
                        }
                }
                //В коде ниже Car.car.bump и Car.car.bump2 передний и задний бампера
                private function drive(e:Event){
                        if(run == 1){ // Если нажата клавиша "Вверх" то проверяется условие на столкновение переднего бампера
                                if(Car.car.bump.hitTestObject(wall1) || Car.car.bump.hitTestObject(wall2) || Car.car.bump.hitTestObject(wall3) || Car.car.bump.hitTestObject(wall4)){
                                        speed = 0;
                                } else {
                                        speed += (speed<maxspeed)?stepspeed:0;
                                }
                        } else if(run == 2){ // Если нажата клавиша "Вниз" то проверяется условие на столкновение заднего бампера
                                if(Car.car.bump2.hitTestObject(wall1) || Car.car.bump2.hitTestObject(wall2) || Car.car.bump2.hitTestObject(wall3) || Car.car.bump2.hitTestObject(wall4)){
                                        speed = 0
                                } else {
                                        speed -= (speed>-maxspeed)?stepspeed:0;
                                }
                        } else { // Иначе, если клавиши не нажаты, но скорость автомобиля еще не погашена, то проверяется условие на столкновение и переднего и заднего бампера
                                if(Car.car.bump2.hitTestObject(wall1) || Car.car.bump2.hitTestObject(wall2) || Car.car.bump2.hitTestObject(wall3) || Car.car.bump2.hitTestObject(wall4)){
                                        speed = 0
                                } else if(Car.car.bump.hitTestObject(wall1) || Car.car.bump.hitTestObject(wall2) || Car.car.bump.hitTestObject(wall3) || Car.car.bump.hitTestObject(wall4)){
                                        speed = 0;
                                } else {
                                        speed +=(speed>0)?-stepspeed:(speed<0)?stepspeed:0;
                                }
                        }
                        //Ну а дальше, если написать грубо
                        Car.y+=speed;
                }

Я что-то делаю не так? :confused:

andrew911 30.01.2011 01:25

Какая ширина у бампера и какая максимальная скорость автомобиля?
Если скорость > ширины бампера, то есть вероятность, что вы ее пролетите (в один момент бампер перед стеной, во второй за стеной - пересечения нет)

samana 30.01.2011 01:26

Не знаю, может скорость бывает слишком большая и машина просто пролетает сквозь стены.
p.s. представляю код, когда у вас будет стен 20

Arbis 30.01.2011 06:20

Хмм... а ведь точно, не подумал... толщина бампера 5, а максимальная скорость 10, спасибо :)
Уменьшил максимальную скорость и увеличил частоту кадров, проблема пропала, еще раз спасибо за помощь :)
Цитата:

p.s. представляю код, когда у вас будет стен 20
а еще круче, если 200 :D
Этот феерический код с if(a||b) я просто написал для наглядности :)

f.g.programmer 30.01.2011 11:51

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

Arbis 31.01.2011 15:33

Цитата:

Возможно лучше проверять выход верхней точки переднего бампера за некоторую верхнюю границу, и, соответственно, нижней точки заднего за нижнюю границу.
При выходе за границы области "где можно ездить", это само собой, так и делаю.
А при определении столкновения с объектами, которые могут встретиться по ходу движения?

Tails 31.01.2011 18:33

Двигать машинку циклом с шагом в 1px.

КорДум 31.01.2011 19:23

Цитата:

Сообщение от Tails (Сообщение 969332)
Двигать машинку циклом с шагом в 1px.

И каждый шаг делать проверку? Накладненько по ресурсам будет.


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

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