|
|
|||||
Регистрация: Mar 2016
Сообщений: 34
|
Столкновение объектов
При столкновении двух шаров один отскакивает на несколько пикселе. Например первый шар это герой второй противник. Герой перемещается к противнику и когда он с ним сталкивается то противник почему-то отскакивает.
Вот код, подскажите пожалуйста в чем может быть проблема? На всякий случай я прикрепил исходный файл. ball.rar import flash.events.Event; import flash.events.KeyboardEvent; var b1:ball1; var b2:ball2; var dist_x, dist_y, minDist, distance; var midpointX, midpointY; var up, left, right, down; createBalls(); var accelerator = 5; function createBalls () { b1 = new ball1(); addChild(b1); b1.x = 300; b1.y = 100; b1.speedx = b1.x; b1.speedy = b1.y; b2 = new ball2(); addChild(b2); b2.x = 100; b2.y = 100; b1.addEventListener(Event.ENTER_FRAME, onEF); stage.addEventListener(KeyboardEvent.KEY_DOWN, onKD); stage.addEventListener(KeyboardEvent.KEY_UP, onKU); } function onKD(e:KeyboardEvent) { if(e.keyCode==87) { up = true; } if(e.keyCode==83) { down = true; } if(e.keyCode==65) { left = true; } if(e.keyCode==68) { right = true; } } function onKU(e:KeyboardEvent) { if(e.keyCode==87) { up = false; } if(e.keyCode==83) { down = false; } if(e.keyCode==65) { left = false; } if(e.keyCode==68) { right = false; } } function onEF(e:Event) { var bl:ball1 = e.currentTarget as ball1; if(up) { bl.speedy -= accelerator; } if(left) { bl.speedx -= accelerator; } if(down) { bl.speedy += accelerator; } if(right) { bl.speedx += accelerator; } dist_x = b2.x-bl.x; dist_y = b2.y-bl.y; minDist = (bl.width + b2.width) / 2; distance = Math.sqrt(dist_x*dist_x+dist_y*dist_y); var normalX = dist_x / distance; var normalY = dist_y / distance; if (distance < minDist) { midpointX = (bl.x+b2.x)/2; midpointY = (bl.y+b2.y)/2; minDist = minDist - b2.width/2; //50 b2.x = (midpointX+normalX*minDist); b2.y = (midpointY+normalY*minDist); } bl.x = bl.speedx; bl.y = bl.speedy; } |
|
|||||
Это не проблема, это прописано в коде в конструкции
Добавлено через 22 минуты чтобы он останавливался, достаточно перед изменением запоминать значения speedy и speedx, и если они сталкиваются (if (distance < minDist)), то возвращать шарику эти значения в состояние до изменения. То есть до изменения а если столкнулись
__________________
while(live()) { hope(); } |
|
|||||
Регистрация: Mar 2016
Сообщений: 34
|
Все равно не работает как надо. Может я просто не правильно код добавил?
... var bl:ball1 = e.currentTarget as ball1; var tempSpeedy:Number = bl.speedy; var tempSpeedx:Number = bl.speedx; if(up) { bl.speedy -= accelerator; } if(left) { bl.speedx -= accelerator; } if(down) { bl.speedy += accelerator; } if(right) { bl.speedx += accelerator; } ... if (distance < minDist) { midpointX = (bl.x+b2.x)/2; midpointY = (bl.y+b2.y)/2; minDist = minDist - b2.width/2; //50 b2.x = (midpointX+normalX*minDist); b2.y = (midpointY+normalY*minDist); b1.speedx = tempSpeedx; b1.speedy = tempSpeedy; } |
|
|||||
ну, потому что b2 не надо трогать, вы ведь не хотите, чтоб он сдвигался
Добавлено через 1 минуту нужно внимательно посмотреть на код внутри и оставить только то, что нужно Добавлено через 6 минут и, кстати, вам не нужно два разных метода на KEY_DOWN и KEY_UP Можно это нагромождение заменить одной функцией //сначала добавляем листенеры, ссылающиеся на одну функцию stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownUpHandler); stage.addEventListener(KeyboardEvent.KEY_UP, keyDownUpHandler); //.... //потом обрабатываем function keyDownUpHandler(event:KeyboardEvent) { if(event.keyCode==87) up = (event.type == KeyboardEvent.KEY_DOWN); if(event.keyCode==83) down = (event.type == KeyboardEvent.KEY_DOWN); if(event.keyCode==65) left = (event.type == KeyboardEvent.KEY_DOWN); if(event.keyCode==68) right = (event.type == KeyboardEvent.KEY_DOWN); } Эта то жи самая что песать без занкав припинания и пастаяными ашибками ризультат налицо давольна сложна панять что я имею ввиду особена если эта длиные придлажения а если целыи абзацы то вааще атас
__________________
while(live()) { hope(); } Последний раз редактировалось ZergMaster; 26.01.2018 в 18:12. |
|
|||||
Регистрация: Mar 2016
Сообщений: 34
|
В этом и есть основная задумка, чтобы главный объект сдвигал второстепенный, но это должно происходить плавно без прыжков.
|
Часовой пояс GMT +4, время: 11:37. |
|
« Предыдущая тема | Следующая тема » |
|
|