Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 26.01.2018, 12:15
Alexey25 вне форума Посмотреть профиль Отправить личное сообщение для Alexey25 Найти все сообщения от Alexey25
  № 1  
Ответить с цитированием
Alexey25

Регистрация: Mar 2016
Сообщений: 34
По умолчанию Столкновение объектов

При столкновении двух шаров один отскакивает на несколько пикселе. Например первый шар это герой второй противник. Герой перемещается к противнику и когда он с ним сталкивается то противник почему-то отскакивает.
Вот код, подскажите пожалуйста в чем может быть проблема? На всякий случай я прикрепил исходный файл. ball.rar
Код 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;
}

Старый 26.01.2018, 12:32
ZergMaster вне форума Посмотреть профиль Отправить личное сообщение для ZergMaster Найти все сообщения от ZergMaster
  № 2  
Ответить с цитированием
ZergMaster
 
Аватар для ZergMaster

Регистрация: May 2008
Адрес: Питер
Сообщений: 385
Отправить сообщение для ZergMaster с помощью ICQ Отправить сообщение для ZergMaster с помощью Skype™
Это не проблема, это прописано в коде в конструкции
Код 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;
__________________
while(live()) { hope(); }

Старый 26.01.2018, 13:35
Alexey25 вне форума Посмотреть профиль Отправить личное сообщение для Alexey25 Найти все сообщения от Alexey25
  № 3  
Ответить с цитированием
Alexey25

Регистрация: Mar 2016
Сообщений: 34
Все равно не работает как надо. Может я просто не правильно код добавил?
Код 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;
	}

Старый 26.01.2018, 18:02
ZergMaster вне форума Посмотреть профиль Отправить личное сообщение для ZergMaster Найти все сообщения от ZergMaster
  № 4  
Ответить с цитированием
ZergMaster
 
Аватар для ZergMaster

Регистрация: May 2008
Адрес: Питер
Сообщений: 385
Отправить сообщение для ZergMaster с помощью ICQ Отправить сообщение для ZergMaster с помощью Skype™
ну, потому что 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);
}
Очень рекомендую, если вы работает с кодом, соблюдать аккуратность, красоту и лаконичность. В частности, следить за отступами, называть переменные и функции так, чтоб было понятно, что это. Иначе будете вечно путаться делать много багов.

Эта то жи самая что песать без занкав припинания и пастаяными ашибками ризультат налицо давольна сложна панять что я имею ввиду особена если эта длиные придлажения а если целыи абзацы то вааще атас
__________________
while(live()) { hope(); }


Последний раз редактировалось ZergMaster; 26.01.2018 в 18:12.
Старый 26.01.2018, 22:06
Alexey25 вне форума Посмотреть профиль Отправить личное сообщение для Alexey25 Найти все сообщения от Alexey25
  № 5  
Ответить с цитированием
Alexey25

Регистрация: Mar 2016
Сообщений: 34
В этом и есть основная задумка, чтобы главный объект сдвигал второстепенный, но это должно происходить плавно без прыжков.

Создать новую тему Ответ Часовой пояс GMT +4, время: 11:37.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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