Nape — создаём персонажа

govnoproger.ru > as3 > Nape — создаём персонажа
Всё написанное имеет отношение к milestone 5 и выше. 
Это может не работать на ранних версиях nape.

Это моё любимое. Вы наверное часто такое видели в играх.

К примеру в одной игре персонаж легко взбирается по ступенькам.
В другой же игре приходится нажимать кнопку прыжка :mrgreen: чтоб он сделал это.

Есть довольно хорошая схема реализации, она неплохо себя зарекомендовала:

схема персонажа

схема персонажа

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

Круг используется в качестве ног! Если есть столкновение с ногами — значит под ногами есть земля и мы можем подпрыгнуть, также мы можем вскарабкиваться по невысоким «ступенькам» как я и говорил выше.

Всё остальное делает движок — гравитация давит, тела падают.

Правильная схема расположения круга в центре.

Давайте рассмотрим неправильные:

  • Итак схема слева:
    Слишком большой круг и плохо утоплен в тело прямоугольника. Если наш герой «зажат» то можно будет сделать супер прыжок тк ноги будут зажаты, а это значит что прыжок доступен.
  • Схема справа:
    Круг маленький, герой может просто застрять на ступеньке!

Приступим к созданию:
Итак вы поняли что тело состоит из нескольких фигур, а всё остальное делает движок.
Я должен вам напомнить что тело героя будет вращаться и ваша задача — либо сделать ограничение вращения, либо запретить вращаться.

В примере ниже я полностью запрещаю вращение.

public var feet:nape.shape.Shape;
public var Pbody:Body=new Body(BodyType.DYNAMIC);
//пишу кратко

feet = new Circle(5,new Vec2(0,10),new Material(0, 9, 9, 1.5, 1)); //наши ноги
var poly=new Polygon(Polygon.rect(x, y,width,height),new Material(0, 0, 0, 1.5, 0));//наше туловище
Pbody.position.setxy(x,y); 
Pbody.allowRotation = false; // запретил вращение как и обещал
Pbody.shapes.add(poly);
Pbody.shapes.add(feet);
Pbody.space=Main.space;
			
// ниже идёт контроль игрока в безвоздушном пространстве
aircon = new LineJoint(Main.space.world,Pbody,new Vec2(), new Vec2(), new Vec2(0,1), Number.NEGATIVE_INFINITY, Number.POSITIVE_INFINITY);
aircon.stiff = false;
aircon.maxError = 0.0;
aircon.space = Main.space;

public function вызываем_на_энтерфрейме()
{
Pbody.kinematicVel.setxy(0,0);
midair = true;
for(var i = 0; i<Pbody.arbiters.length; i++)
{
	var arb:Arbiter = Pbody.arbiters.at(i);
	if(arb.isCollisionArbiter() && (arb.shape1==feet || arb.shape2==feet)) midair = false;
}
			
aircon.active = midair;

}

Итак в первую очередь. Контроль игрока в воздухе нужен для того чтобы контролировать тело в воздухе.

if(arb.isCollisionArbiter() && (arb.shape1==feet || arb.shape2==feet)) midair = false;

Это строка расшифровывается как: если есть столкновения с ногами значит персонаж не в воздухе.

Дальше идёт управление клавишами. Я расписывать не буду. Тут много способов. Например на Pbody можно воздействовать импульсом. У себя я делал через kinematicVel. Всё очень просто.

Рекомендую:

16.8.2011 | последняя редакция: 20.08.2011 |
  1. нужен совет.
    тут знакомый спрашивает, какую лучше чистилку купить для зеркалки никон. у его друга, любительского фотографа днюха, вот он хочет подарить ему подарить ленспен. http://lipetsk.dns-shop.ru/catalog/24/108401/
    я помню ты писал, что это устройство уг. стоит ли покупать или лучше подарить что-нибудь другое?

  2. admin
    18.8.2011 в 17:11

    Кисточку беличью в канцелярском магазине.
    Можно маленкую клизму в аптеке или грушу (сдувать пыль).
    А если помыть надо тогда изопропиловый спирт — в аптеке + какие нибудь безворсовые салфетки.

  3. Сергей
    18.8.2011 в 19:15

    По поводу взбирания по лестнице прыжками — согласен, тупизм и бесит. Интересное решение, о таком не догадывался.

  4. 😀 вот это он обрадуется миниатюрной клизме. ещё и с высеченным именем на её боку