![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Oct 2013
Сообщений: 23
|
Доброго времени суток, форумчане.
Есть 2-х мерная аркадная покатушка. Точки проверки столкновений будут располагаться на всех автомобилях подобным образом. Сам алгоритм движения и проверки столкновений на данный момент таков(двигается не сам автомобиль, а фон): public function Movement(event:Event):void{ var pos_x,pos_y:int; var fpn,bpn,rpn,lpn:int; //Счетчики точек отталкивания if ((Up == true) && (speed >=(-maxspeed))){speed -= power;} //Если нажата кнопка вперед if ((Down == true) && (speed <=(maxspeed/5))) {speed += power; }//Если нажата кнопка назад if ((Left == true) && (Math.abs(speed) >=1 )) //Если нажата кнопка влево if (speed<0) car_test.rotation -= angle else if (speed>0) car_test.rotation += angle; if ((Right == true) && (Math.abs(speed) >=1 )) //Если нажата кнопка вправо if (speed<0) car_test.rotation += angle else if (speed>0) car_test.rotation -= angle; /*Проверка передних точек*/ for (fpn=0;fpn<3;fpn++){ var _forward:Point = new Point(car_test['fp'+fpn].x,car_test['fp'+fpn].y); var _forwardG:Point = new Point(); _forwardG = car_test.localToGlobal(_forward); if (map_c.wall.hitTestPoint(_forwardG.x,_forwardG.y,true)){ if (Math.abs(speed)<5) speed *= (-1) else { speed = (speed/2)*(-1); trace('/4'); } break; } } /*Проверка задних точек*/ for (bpn=0;bpn<3;bpn++){ var _back:Point = new Point(car_test['bp'+bpn].x,car_test['bp'+bpn].y); var _backG:Point = new Point(); _backG = car_test.localToGlobal(_back); if (map_c.wall.hitTestPoint(_backG.x,_backG.y,true)){ if (Math.abs(speed)<5) speed *= (-1) else { speed = (speed/2)*(-1); } break; } } /*Проверка точек справа*/ for (rpn=0;rpn<3;rpn++){ var _turnR:Point = new Point(car_test['rp'+rpn].x,car_test['rp'+rpn].y); var _turnRG:Point = new Point(); _turnRG = car_test.localToGlobal(_turnR); if (map_c.wall.hitTestPoint(_turnRG.x,_turnRG.y,true)){ if ((speed<0) && (Math.abs(speed)>1)) car_test.rotation -= angle*2; else if (speed>0) car_test.rotation += angle*2; break; } } /*Проверка точек слева*/ for (lpn=0;lpn<3;lpn++){ var _turnL:Point = new Point(car_test['lp'+lpn].x,car_test['lp'+lpn].y); var _turnLG:Point = new Point(); _turnLG = car_test.localToGlobal(_turnL); if (map_c.wall.hitTestPoint(_turnLG.x,_turnLG.y,true)){ if ((speed<0) && (Math.abs(speed)>1)) car_test.rotation += angle*2; else if ((speed>0) && (Math.abs(speed)>1)) car_test.rotation -= angle*2; break; } } speed *= friction;//Добавление трения /*Нахождение следующей точки положения автомобиля*/ pos_x = speed*Math.cos(car_test.rotation * Math.PI/180); pos_y = speed*Math.sin(car_test.rotation * Math.PI/180); map_c.x -= pos_x; map_c.y -= pos_y; map_s.x -= pos_x; map_s.y -= pos_y; map_p.x -= pos_x; map_p.y -= pos_y; } ![]() Проблема явно случается при одновременном соприкосновении торцовой и боковой точки с непроходимым объектом. Подскажите как можно было бы с этим бороться. PS: Игра достаточно проста, чтобы не использовать продвинутые физ. движки. |
|
|||||
|
Регистрация: Oct 2013
Сообщений: 23
|
Вы имеете в виду, проблема в том, что положение точек является числом с плавающей точкой?
|
|
|||||
|
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Вы машину передвигаете на большие расстоянии, вот Вам и посоветовали передвигать по одному пикселю.
Или ещё можно находить вектор и выталкивать машину по нему. |
|
|||||
|
Цитата:
Просто проверять столкнется ли машина с чем-то, нужно еще до, того как происходит смещение. То есть, образно говоря: Автору: как уже верно подметили, код ужасен. Но так как вы новичок, не буду сильно углубляться в исправления, скажу только, что названия переменных и функций всегда пишутся с маленькой буквы, а названия классов с большой. У вас же тут вообще каша. Часть переменных с большой, часть с маленькой, часть с нижнего подчеркивания. Чтобы себе голову не захламлять неправильными концепциями, очень советую ознакомиться с конвенциями написания кода на ас3, и писать строго в соответствии с ними. |
|
|||||
|
Lorem ipsum
|
Автору настоятельно рекомендую срочно прекратить изобретение велосипеда, взять в разработку Nape и начать таки делать игру.
__________________
Поймай яблоко 2! |
|
|||||
|
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Цитата:
private function stage_enterFrame(event:Event):void { for (var i:int = 0; i < _speed; i++) { this.move(); } } А ещё может не плюс надо, а минус, в зависимости от стороны.. Лучше Nape ![]() |
|
|||||
|
Цитата:
Цитата:
А в целях обучения, я бы советовал все-таки самому понаступать на разные грабли, и поизобретать велосипеды. А нейп, бокс2д и тому подобное, оставить на потом. |
![]() |
![]() |
Часовой пояс GMT +4, время: 10:57. |
|
|
« Предыдущая тема | Следующая тема » |
| Теги |
| hitTestPoint , алгоритмы , физика |
|
|