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

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

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

Регистрация: Feb 2009
Сообщений: 57
По умолчанию цикл проверки столкновений

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

Код AS3:
for (i = 0; i < tankContainer.numChildren; i++)
{
	var movingTankA:tankMc = tankContainer.getChildAt(i) as tankMc;
 
	for (j = 0; j < tankContainer.numChildren; j++)
	{
	var movingTankB:tankMc = tankContainer.getChildAt(j) as tankMc;
	      if (movingTankA.hitTestPoint(movingTankB.x,movingTankB.y,true))
	      {
	      movingTankA.y += 24;
	      }
	      break;//завершаем цикл
        }
}
если 1 танк налез например на 2-й танк, то надо его отодвинуть назад или вперед безразници
но в место этого, я получаю скорость в 24 пикселя, и танк просто проносится по экрану..
не могу понять, почему условие не становится в false? Прошу помощи..

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

модератор форума
Регистрация: Jul 2004
Адрес: Питер
Сообщений: 1,653
Записей в блоге: 1
Отправить сообщение для Gaen с помощью ICQ Отправить сообщение для Gaen с помощью Skype™
У вас внутренний цикл идет по всем танкам, на одной из его итераций tankB == tankA, и танк проверяется на пересечение с самим собой. В итоге гарантированно сдвигаются все танки.
Поменяйте начальное значение j c 0 на i + 1.
__________________
тонкий тролль, осеянный благодатью

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

Регистрация: Oct 2010
Сообщений: 1,049
Отправить сообщение для bav с помощью ICQ
На первой итерации внешнего цикла переменной movingTankA становиться танк с индексом 0. Во вложенном цикле, на первой же итерации, переменной movingTankB становиться танк с индексом 0, то есть тот же самый, на который ссылается и movingTankA. Разумеется при проверке столкновения танка с его же координатами мы будем получать true.

Старый 18.02.2011, 13:27
TexHuK вне форума Посмотреть профиль Отправить личное сообщение для TexHuK Найти все сообщения от TexHuK
  № 4  
Ответить с цитированием
TexHuK

Регистрация: Feb 2009
Сообщений: 57
ага, ясно, спасибо
А объясните мне еще такую вещь, как лучше проверять спрайты на столкновения, т. е. проверить не наложился ли спрайт на спрайт? hitTestPoint или hitTestObject?

GAIKER, кстати, поменял, все равно некоторые танки налазят друг на друга


Последний раз редактировалось TexHuK; 18.02.2011 в 13:44. Причина: сделал проверку
Старый 15.04.2011, 12:25
TexHuK вне форума Посмотреть профиль Отправить личное сообщение для TexHuK Найти все сообщения от TexHuK
  № 5  
Ответить с цитированием
TexHuK

Регистрация: Feb 2009
Сообщений: 57
Извините, что поднимаю эту тему, но всетеки объясните пожалуйста в чем причина?
Делаю маленькую игру, и не могу понять почему столкновения так некорректно работают
вот пример работы игры, нужно щелкнуть мышкой в любом месте, и уведите результат.
Проблема следующая, шары не долетают друг до друга, и срабатывает столкновение.

http://webexpa.co.cc/ballc.swf

Не могу понять, как организовываются правильно столкновения??

вот примерный код энтерфрейма
если flagColl становится труе, то идет увеличение шара
Код AS3:
private function onEnterFrame(e:Event):void 
		{
			for (var i:int = 0; i < continers.numChildren; i++)
			{
				var chas:Chastica = continers.getChildAt(i) as Chastica;
 
				chas.x += chas.dx;
				chas.y += chas.dy;
 
				if (chas.x + ballRadius > rightWall)
				{
					overshot = (chas.x + ballRadius) - rightWall;
					chas.x -= overshot * 2;
					if (chas.rightWallF)
					{
						chas.dx = Math.random() * 3;
 
						chas.rightWallF = false;
					}
					chas.dx *= -1;
 
				}
 
				if (chas.x - ballRadius < leftWall)
				{
					overshot = leftWall - (chas.x - ballRadius);
					chas.x += overshot * 2;
					if (chas.leftWallF)
					{
						chas.dx = Math.random() * 3;
 
						chas.leftWallF = false;
					}
 
					chas.dx *= -1;
				}
 
				if (chas.y + ballRadius > downWall)
				{
					overshot = (chas.y + ballRadius) - downWall;
					chas.y -= overshot * 2;
					if (chas.downWallF)
					{
						chas.dy = Math.random() * 3;
 
 
						chas.downWallF = false;
					}
 
					chas.dy *= -1;
				}
 
				if (chas.y - ballRadius < upWall)
				{
					overshot = upWall - (chas.y - ballRadius);
					chas.y += overshot * 2;
					if (chas.upWallF)
					{
						chas.dy = Math.random() * 3;
 
						chas.upWallF = false;
					}
					chas.dy *= -1;
				}
 
				for (var j:int = 0; j < continersP.numChildren; j++)
				{
					var posBall:Chastica = continersP.getChildAt(j) as Chastica;
 
					if (posBall.hitTestObject(chas))
					{
						chas.flagColl = true;
					}
				}
 
				for (var k:int = i+1; k < continers.numChildren; k++)
				{
					var chas2:Chastica = continers.getChildAt(k) as Chastica;
 
					if (chas2.hitTestObject(chas) && chas.flagColl)
					{
						chas2.flagColl = true;
					}
				}
			}
 
			if (!flagPos)
			{
				chasP.flagColl = true;
			}
		}

Старый 15.04.2011, 14:24
Cornford вне форума Посмотреть профиль Отправить личное сообщение для Cornford Найти все сообщения от Cornford
  № 6  
Ответить с цитированием
Cornford

Регистрация: Oct 2009
Сообщений: 174
Скорее всего дело в hitTestObject

Старый 15.04.2011, 15:46
Anton Riot вне форума Посмотреть профиль Отправить личное сообщение для Anton Riot Посетить домашнюю страницу Anton Riot Найти все сообщения от Anton Riot
  № 7  
Ответить с цитированием
Anton Riot

Регистрация: Sep 2008
Адрес: Москва
Сообщений: 291
Отправить сообщение для Anton Riot с помощью ICQ
столкновение кругов просто проверить без hitTest'а - вычислив расстояние от центра одного до центра другого. Если оно меньше суммы радиусов - круги столкнулись.

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

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

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


 


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


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