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

Alexey25 26.01.2018 12:15

Столкновение объектов
 
Вложений: 1
При столкновении двух шаров один отскакивает на несколько пикселе. Например первый шар это герой второй противник. Герой перемещается к противнику и когда он с ним сталкивается то противник почему-то отскакивает.
Вот код, подскажите пожалуйста в чем может быть проблема? На всякий случай я прикрепил исходный файл. Вложение 33128
Код AS3:

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;
}


ZergMaster 26.01.2018 12:32

Это не проблема, это прописано в коде в конструкции
Код AS3:

if (distance < minDist)
        { ... }

Добавлено через 22 минуты
чтобы он останавливался, достаточно перед изменением запоминать значения speedy и speedx, и если они сталкиваются (if (distance < minDist)), то возвращать шарику эти значения в состояние до изменения.
То есть до изменения
Код AS3:

        var tempSpeedy:Number = bl.speedy;
        var tempSpeedx:Number = bl.speedx;

а если столкнулись
Код AS3:

       b1.speedx = tempSpeedx;
      b1.speedy = tempSpeedy;


Alexey25 26.01.2018 13:35

Все равно не работает как надо. Может я просто не правильно код добавил?
Код AS3:

...
 
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;
        }


ZergMaster 26.01.2018 18:02

ну, потому что b2 не надо трогать, вы ведь не хотите, чтоб он сдвигался

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

if (distance < minDist)
        { ... }

и оставить только то, что нужно

Добавлено через 6 минут
и, кстати, вам не нужно два разных метода на KEY_DOWN и KEY_UP
Можно это нагромождение заменить одной функцией
Код AS3:

//сначала добавляем листенеры, ссылающиеся на одну функцию
        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);
}

Очень рекомендую, если вы работает с кодом, соблюдать аккуратность, красоту и лаконичность. В частности, следить за отступами, называть переменные и функции так, чтоб было понятно, что это. Иначе будете вечно путаться делать много багов.

Эта то жи самая что песать без занкав припинания и пастаяными ашибками ризультат налицо давольна сложна панять что я имею ввиду особена если эта длиные придлажения а если целыи абзацы то вааще атас

Alexey25 26.01.2018 22:06

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


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

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