Новый nape. Hello world.

1
Новый nape:
1. Новый nape. Hello world. (Его вы сейчас читаете)
2. Новый nape. Обработка событий
3. Новый nape. Testbed. И немного теории
4. Новый nape. Создание тел, материалы, фильтрация столкновений
5. Новый nape. Соединение тел
6. Новый nape. Приложение сил к телам и raycast

Все, наверное, слышали про физический 2d движок nape, как и про то, что уже некоторое время его автор делает новую версию, с другим API и внутри тоже другую. Я понемногу ковыряюсь в том, как этой новой версией пользоваться, и решил написать небольшое введение.

Сайт автора движка: deltaluca.me.uk/
Документация и ссылки на скачивание: deltaluca.me.uk/docnew/
Форум: deltaluca.me.uk/forum/

Вот как работает движок: (щелкайте next и prev)


Для начала надо скачать последнюю версию из раздела документации: deltaluca.me.uk/docnew/
На момент написания это 6.1 r58. Писать я буду про as3, поэтому скачать надо соответствующую debug версию для flash player 10. Так рекомендует автор движка.

Я использую FlashDevelop. Создать новый проект наверное все умеют. Потом нужно скопировать в папку проекта скачанный swc, во FlashDevelop найти этот файл, и щелкнуть на нем Add To Library.

Потом написать немного кода :-)

В проекте использующем nape нужно обязательно до запуска всего остального сделать так:
new Boot();

Это нужно для работы библиотек haxe, на котором написан nape.

Все физические объекты и все такое прочее в nape существует внутри мира — Space.
public var space:Space = new Space(new Vec2(0, 100));

Первый и единственный параметр конструктора — гравитация. В nape все единицы измерения из системы СИ, кроме размеров — они в пикселях. Т.е. если у нас метр равен 10 пикселям, то ускорение 10 метров на секунду в квадрате (примерно такое ускорение свободного падения на этой планете) будет 100 пикселей на секунду в квадрате.

Добавим в мир что-нибудь. В nape физическое тело — это Body, к нему можно приделать сколько угодно геометрических фигур Shape.
var body:Body = new Body(BodyType.DYNAMIC, new Vec2(400, 300)); // Новое тело
body.shapes.add(new Circle(50, new Vec2(0, 0), Material.wood())); // Добавим фигуру
body.align(); // Нужно совместить центр фигуры и ее центр масс, иначе будут глюки
body.space = space; // Добавим тело в мир


Добавим еще землю. Все аналогично.
var ground:Body = new Body(BodyType.STATIC); // Земля
ground.shapes.add(new Polygon(Polygon.rect(0, 580, 800, 100), Material.rubber()));
ground.space = space;


Кроме того надо же еще все как-то рисовать на экран. Можно конечно сразу заморочиться своей отрисовкой, все равно это придется сделать, но для начала проще воспользоваться имеющейся возможностью отладочного вывода nape. Для этого есть аж два класса ShapeDebug и BitmapDebug. Возьмем для начала ShapeDebug.
public var debug:Debug = new ShapeDebug(800, 600, 0xFFFFFF);
addChild(debug.display);


Кроме того добавим обработчик события ENTER_FRAME, в котором обновим мир и отрисуем его на экран.
private function enterFrame(e:Event):void 
{
	space.step(1 / 30.0);
	debug.clear();
	debug.draw(space);
}


Итого получится такой вот код:
package 
{
	import flash.Boot;
	import flash.display.*;
	import flash.events.*;
	import nape.geom.*;
	import nape.phys.*;
	import nape.shape.*;
	import nape.space.*;
	import nape.util.*;
	
	public class Main extends Sprite 
	{
		
		public var space:Space = new Space(new Vec2(0, 100)); // Мир
		public var debug:Debug = new ShapeDebug(800, 600, 0xFFFFFF); // Отладочный вывод
		
		public function Main():void 
		{
			new Boot(); // Обязательно нужно для работы nape
			
			
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			
			var body:Body = new Body(BodyType.DYNAMIC, new Vec2(400, 300)); // Новое тело
			body.shapes.add(new Circle(50, new Vec2(0, 0), Material.wood())); // Добавим фигуру
			body.align(); // Нужно совместить центр фигуры и ее центр масс, иначе будут глюки
			body.space = space; // Добавим тело в мир
			
			var ground:Body = new Body(BodyType.STATIC); // Земля
			ground.shapes.add(new Polygon(Polygon.rect(0, 580, 800, 100), Material.rubber()));
			ground.space = space;			

			addChild(debug.display);
			
			addEventListener(Event.ENTER_FRAME, enterFrame);
		}
		
		private function enterFrame(e:Event):void 
		{
			space.step(1 / 30.0); 
			debug.clear();
			debug.draw(space);
		}
	}
}

Если его запустить, то посреди экрана должен возникнуть круг и упасть на землю.
  • +21

Комментарии (10)

0
Полезно, спасибо
0
Безусловно для многих полезно, но хотелось бы услышать побольше о новых возможностях Nape, особенно учитывая название поста.
0
Пока я планирую именно описание базовых функций и как их использовать. Честно говоря даже не могу сказать, какие именно возможности нового Nape новые :-) так как старый подробно не изучал.
0
Там еще не все старые реализованы. Особенность нового Nape в том, что по коду движок стал совсем-совсем другим. Понятные конструкции, нормальное название объектов, внутри полностью переписан. В принципе, через часа два, после начала работы с ним, становится все понятно и логично.
Правда меня лично бесят jointы, потому что в документации написано что releative координаты у них, а в реальности global или наоборот?)). В общем с нетерпением жду статью:).
0
Если уже разобрался, то чего особо ждать? :-)
0
Забыл уже все :). Было в начале лета дело, сейчас по уши в работе, а так статью прочту, сразу все вспомню.
0
Вроде как из нововведений добавилась только физика жидкости и marching squares. А все остальное это переработка движка под ноль для большей производительности. Как уже сказали выше, многие возможности из старой версии еще не реализованы в новой: определение пересечений, некоторые виды ограничений. ИМХО если юзать для разработки игры, то лучше старую версию, если посмотреть что да как(поковырять ради интереса), то лучше новую.
0
Были marching squares: deltaluca.me.uk/doc/pckg/nape/geom/Geom.html
Вода ИМХО не должна вызвать вопросов по использованию, если с остальным разобраться.
0
Про marching squares ошибся:) А вообще я имел ввиду то, что deltaluca вроде как больше пол года пилит его. И кто его знает когда закончит его делать. Сейчас конечно почаще начал milestone делать. Вода не должна вызвать вопросов — согласен.
+3
Что значит закончит? Нет предела совершенству.
ИМХО уже сейчас можно делать на новой версии игру. Если найдешь баг — Лука их правит быстро.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.