Используем Nape. Старая версия.

govnoproger.ru > as3 > Используем Nape. Старая версия.

Sorry, either Adobe flash is not installed or you do not have it enabled

Нашёл довольно производительный и простой движок.

Скачать его можно отсюда http://code.google.com/p/nape/wiki/Downloads?tm=2

Качаете версию для 10 flash player — Compiled swc (AS3 use).
Скачанный файл мне пришлось переименовать в swc.

В fla файле нажимаете publish settings -> далее там где action script 3.0 жмёте settings.

Дальше просто добавляете эту swc в свой проект.

Вот очень простой код примера. Будет понятен любому новичку:

package 
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.Boot;
import flash.events.MouseEvent;
import flash.events.Event;
import flash.display.MovieClip;
	
import nape.space.Space;
import nape.space.UniformSleepSpace;
import nape.geom.AABB;
import nape.geom.Vec2;
import nape.phys.PhysObj;
import nape.phys.Material;
import nape.constraint.SlideJoint;
import nape.util.Tools;
import nape.callbacks.Callback; 
import nape.constraint.PivotJoint; 
	
public class Main extends MovieClip
{
	private var timeStep:Number = 1/30.0; // см enterframe
	private var space:UniformSleepSpace;// наше пространство (мир)
	private var gravity:Vec2;//гравитация
	public var fps:FPS=new FPS(stage,0,0);//на это не обращаем внимания - это просто счётчик фпс. Сотрите его.

	function Main()
	{
		new Boot();// загружаем Nape
			
		gravity = new Vec2(0, 250); //создаём вектор гравитации
		space = new UniformSleepSpace(new AABB(0,0, 800, 600), 40, gravity);//создаём мир, тут его размеры. Тела в этом мире могут засыпать. Это экономит ресурсы.
		createGround();
		createBox();
			
		addEventListener(Event.ENTER_FRAME, update);
		stage.addEventListener(MouseEvent.MOUSE_DOWN, md); //на это не обращаем внимания - это  чтобы таскать объекты мышкой
		stage.addEventListener(MouseEvent.MOUSE_UP, mu);//на это не обращаем внимания - это  чтобы таскать объекты мышкой

	}
		
	function createGround()
	{
		var groundMc:MovieClip;
		var Box:nape.phys.PhysObj; //тело для нашего мувиклипа
			
		groundMc=new Ground(); // берём мувик из библиотеки - нашу землю
		groundMc.x=250;
		groundMc.y=300;
		Box = Tools.createBox(groundMc.x+2, groundMc.y+2, groundMc.width-2, groundMc.height-2, 1, 1, 1, true, Material.Steel);//задаём телу параметры мувиклипа, с разницей в 2 пикселя (для реализма), параметр true - указывает что обьект статический.
		Box.assignGraphic(groundMc); // тут понятно - цепляем графику к телу
		space.addObject(Box); // добавляем объект в пространство
		addChild(Box.graphic); // отображаем
	}
		
	function createBox()
	{
		var Box:nape.phys.PhysObj;
		var mov:MovieClip;
		
		for (var i:int=0;i<30;i++)// тут просто создадим 29 кубиков
		{
			mov= new BoxX();
			mov.x=randomRange(140,300);
			mov.width=randomRange(20,50);
			mov.height=randomRange(20,50);
			mov.y=0;
			Box = Tools.createBox(mov.x, mov.y, mov.width, mov.height, 1, 1, 1, false, Material.Wood);
			Box.assignGraphic(mov);    
			space.addObject(Box);
			addChild(Box.graphic);
			
			Box.cbHideDef = Box.cbOutOfBoundsDef = Box.cbShowDef = Box.cbWakeDef = Box.cbSleepDef = false;//отключим все события по умолчанию
			Box.cbHide = Box.cbOutOfBounds = Box.cbShow = Box.cbWake = Box.cbSleep = true;//включим возможность обрабатывать их самим. Это чтобы отследить какие объекты улетели за пределы, какие заснули и тп...
			}
			
		}
		
	static var c:SlideJoint; 
	function md(e:MouseEvent)
	{
		var x:Number = mouseX;
		var y:Number = mouseY;
		var p = space.objectAtPoint(x,y);
		if (p != null)
		{
			c = new SlideJoint(space.STATIC, p,new Vec2(),new Vec2(x, y),0,50); 
			c.maxForce = 1e+7; 
			space.addConstraint(c);
		}
	}

	function mu(e:MouseEvent)
	{
		if (c != null)
		{
			space.removeConstraint(c);
			c = null;
		}
	}

	private function update(e):void
	{
		if (c != null) // это мышка
		{  
			space.wakeConstraint(c);  
			c.a1x = mouseX;  
			c.a1y = mouseY;  
		}
		space.step(timeStep); // вызываем один шаг в enterframe
			
		while (!space.callbacks.empty()) //тут будем смотреть какие обьекты выпали за пределы мира
		{
			var cb = space.callbacks.front();        
                        switch(cb.type) 
                        {                 
                         case Callback.PHYSOBJ_OUTOFBOUNDS: // если выпали , то кинем их назад
				{
					var p = cb.obj; 
					var x = randomRange(260,340); 
					var y = 0; 
					p.setPos(x,y); 
					p.setVel(0,0, 0); 
					space.addObject(p);  
				 }
                        }      
                        space.callbacks.pop();
		}
		//addChild(fps);
	}
		
		
		public function randomRange(min:Number, max:Number):Number
		{
			return min + Math.random() * (max - min);
		}
	}
}
 

Скачать пример

Рекомендую:

22.7.2011 | последняя редакция: 24.08.2011 |
  1. Сергей
    22.7.2011 в 22:08

    Ооо, как раз пару дней назад услышал, но ещё не разбирался ) В принципе пока что что-то чужое стараюсь не использовать, но говорят действительно штука шустрая относительно.

  2. Сергей
    23.7.2011 в 12:30

    Если я создал класс со своими методами и свойствами, причём мне не нужно больше никакой функциональности от него, кроме заложенной мной, то не нужно же писать extends что-то?

  3. admin
    23.7.2011 в 15:58

    Ну дак не пиши, тебя никто не заставляет

  4. Сергей
    23.7.2011 в 16:02

    Блин. Не понимаю как достучаться до какого-нибудь свойства основного класса. Вот у меня есть Main.as , который является основным классом документа, в нём есть текстовое поле, а как в это поле что-то записать из другого класса, не из Main? Это почти как в том примере что я когда-то приводил последним, только теперь всё в классах. Я так понимаю чтобы из какого-то класса иметь доступ к свойству другого класса, нужно в первом создать экземпляр второго

  5. Сергей
    23.7.2011 в 16:03

    В этом и вопрос был, спасибо

  6. Сергей
    24.7.2011 в 21:53

    Скажи, ты создавал собственные события когда писал движок?

  7. admin
    25.7.2011 в 01:19

    нет. Мне они не нужны были. Там всё на enterframe.
    Хватало стандартных.

    Я сейчас стал делать другую гаму кстати. В ней будет поменьше графики.

  8. Сергей
    25.7.2011 в 11:42

    Супер. Какой жанр? Ты Nape будешь юзать?

  9. admin
    25.7.2011 в 16:53

    Жанр платформер — пазл

  10. Илья
    8.1.2012 в 13:19

    for (var i:int=0;i<30;i++)// тут просто создадим 29 кубиков

    Мде… Вобще-то цикл будет выполнятся 30 раз, то есть кубиков тоже будет 30. Не забываем учитывать начальный i=0.

  11. admin
    8.1.2012 в 15:49

    да это не принципиально