content( flash, ios, …rest );

FlashPunk. 4.Обработка столкновений.

Привет!

Если вы прочитали уроки Основы и События клавиатуры и мыши, то знаете как сделать так, чтобы ваши игровые объекты стали управляемыми. Теперь мы узнаем, как объекты в игре могут взаимодействовать друг с другом. FlashPunk имеет набор полезных функций, которые будут рассмотрены в данном уроке.

  1. Создание хитбокса.
    (Вы уж извините, не знаю как правильно и красиво перевести на русский язык слово hitbox, обозначающее область игрового объекта, с заданными размерами и формой, которой он взаимодействует с другими игровыми объектами)
    FlashPunk использует прямоугольники для всех основных пересечений с другими объектами. Вы определяете прямоугольную область для своего объекта, называемую hitbox, и затем используете функции FlashPunk для того, чтобы определить, пересекается ли хитбокс вашего объекта с другими игровыми объектами. Итак, у нас есть объект Player, и мы можем в нем определить параметры хитбокса:

    package
    {
    	import net.flashpunk.Entity;
    
    	public class Player extends Entity
    	{
    		public function Player()
    		{
    			// Здесь устанавливаются параметры width и height хитбокса с использованием функции setHitbox.
    			setHitbox(50, 50);
    
    			// А здесь мы напрямую указываем значения параметров хитбокса.
    			width = 50;
    			height = 50;
    		}
    	}
    }

    В примере выше используются два разных подхода к определению хитбокса. Оба они работают совершенно одинаково, поэтому используйте тот, который вам больше нравится.
    Сейчас у нас есть объект Player с заданным хитбоксом и теперь мы можем добавить другой объект, с которым он будет пересекаться. Назовём этот объект Bullet:

    package
    {
    	import net.flashpunk.Entity;
    
    	public class Bullet extends Entity
    	{
    		public function Bullet()
    		{
    			setHitbox(10, 10);
    		}
    	}
    }
  2. Типы столкновений.
    Итак, мы сделали объект Bullet с хитбоксом с размерами 10×10 пикселей, но теперь мы должны добавить одну строку, пржде чем начнем проверять взаимодействие объектов:

    package
    {
    	import net.flashpunk.Entity;
    
    	public class Bullet extends Entity
    	{
    		public function Bullet()
    		{
    			setHitbox(10, 10);
    			type = "bullet";
    		}
    	}
    }

    Здесь мы указали тип объекта Bullet, присвоив ему значение «bullet». Таким образом, мы в дальнейшем сможем проверить столкновение объектов используя тип.
    Заметьте, что тип объекта должен иметь строковое значение и его значение не привязывается строго к одному классу, вы можете описать тип с одним и тем же именем в разных классах. Также, вполне естественно что тип «solid» не одно и то же с типом «SOLID».
    Теперь, когда экземпляр класса Bullet будет добавлен в мир, он сразу же будет добавлен в группу «bullet». В следующем шаге мы увидим как проверить пересекается ли объект Player с объектом Bullet, используя указанный тип.

  3. Пересечение объектов.
    Вернемся в класс Player и напишем проверку пересечения:

    package
    {
    	import net.flashpunk.Entity;
    
    	public class Player extends Entity
    	{
    		public function Player()
    		{
    			setHitbox(50, 50);
    		}
    
    		override public function update():void
    		{
    			if (collide("bullet", x, y))
    			{
    				// Объект Player пересекается с объектом, принадлежащим типу "bullet".
    			}
    		}
    	}
    }

    Здесь мы используем функцию collide() для проверки пересечения с любым «bullet» объектом в координатах x и y.
    Теперь мы можем сделать более специфичное поведение объектов. Добавим в класс Bullet функцию destroy():

    package
    {
    	import net.flashpunk.Entity;
    	import net.flashpunk.FP;
    
    	public class Bullet extends Entity
    	{
    		public function Bullet()
    		{
    			setHitbox(10, 10);
    			type = "bullet";
    		}
    
    		public function destroy():void
    		{
    			// Здесь мы можем поместить специфическое поведение объекта Bullet при его уничтожении.
    			FP.world.remove(this);
    		}
    	}
    }

    Теперь мы можем использовать эту функцию для удаления объекта Bullet из мира при пересечении его с объектом Player:

    package
    {
    	import net.flashpunk.Entity;
    
    	public class Player extends Entity
    	{
    		public function Player()
    		{
    			setHitbox(50, 50);
    		}
    
    		override public function update():void
    		{
    			// Создаём ссылку на объект класса Bullet, с которым произошло пересечение.
    			var b:Bullet = collide("bullet", x, y) as Bullet;
    
    			// Проверяем, получена ли ссылка на объект.
    			if (b)
    			{
    				// Вызываем функцию destroy() класса Bullet.
    				b.destroy();
    			}
    		}
    	}
    }

    Здесь мы присваиваем пересекаемый объект переменной. Функция collide() проверяет мир на наличие пересечений с «bullet» объектами, и если находит хотя бы один, то возвращает ссылку на экземпляр этого объекта. Если же не было найдено ни одного пересечения, то будет возвращено значение null. Соответственно, мы производим проверку с помощью if(), чтобы не попытаться вызвать метод destroy() у несуществующего объекта.

    На этом пока всё, начинайте писать игру! :-)

This entry was posted in FlashPunk. Bookmark the permalink.

2 Responses to FlashPunk. 4.Обработка столкновений.

  1. alx says:

    > не знаю как правильно и красиво перевести…

    да в принципе нормально ))) если соответствующего термина не находится — используют иностранный в транслитерации: чекбокс, автомобиль, маркшейдер…

    а вот вспомнил: «но панталоны, фрак, жилет — всех этих слов на русском нет!» (не уверен в точности цитаты, лень смотреть)

    спасибо за переводы!

  2. val111 says:

    Смотрел примеры на старых библиотеках punk.*. Там есть MapCollider для коллизий с плитками. У меня не работали размеры прокручиваемых спрайтов там. А в новых net.flashpunk пока не смотрел. Может кто видел уже реализацию? net.flashpunk в сравнении с punk достаточно переделана.
    Пробовал прикручивать с SFS, прикрутил но весьма интересным способом.
    Может Red5 кто пробовал?

Добавить комментарий