Создание динамического тела с помощью cocos 2d js и Chipmunk

Я новичок в кокосах 2d и бурундуке. До сих пор мне удалось создать статический объект и добавить к нему обработчик столкновений. Но я хочу создать динамику.

this.space = space;
this.sprite = new cc.PhysicsSprite("#rock.png");
var body = new cp.StaticBody();
body.setPos(pos);
this.sprite.setBody(body);

this.shape = new cp.BoxShape(body,
    this.sprite.getContentSize().width,
    this.sprite.getContentSize().height);
this.shape.setCollisionType(SpriteTag.rock);

this.space.addStaticShape(this.shape);
spriteSheet.addChild(this.sprite);

Но я хочу создать динамическое тело аналогичным образом, которое перемещается, например:

cp.v(310, 0), cp.v(0, 0)

Это очень просто, я знаю, но я был бы признателен, если бы кто-нибудь помог мне с этим. Также, если у вас есть хорошая документация по кокосовым орехам 2d и бурундуку по JS. поделись. Спасибо


person Sameer Hussain    schedule 26.04.2015    source источник


Ответы (1)


Ну вот:

//Add the Chipmunk Physics space
var space = new cp.Space();
space.gravity = cp.v(0, -10);

//Optionally add the debug layer that shows the shapes in the space moving:
/*var debugNode = new cc.PhysicsDebugNode(space);
debugNode.visible = true;
this.addChild(debugNode);*/

//add a floor:
var floor = new cp.SegmentShape(this.space.staticBody, cp.v(-1000, 10), cp.v(1000, 0), 10);
//floor.setElasticity(1);
//floor.setFriction(0);
space.addStaticShape(floor);

//add a square to bounce
//the Sprite
var mySprite = cc.PhysicsSprite.create("res/something.png");
gameLayer.addChild(mySprite);

//the Body
var size = mySprite.getContentSize();
var innertialMomentum = 1; //Use Infinity if you want to avoid the body from rotating
var myBody = new cp.Body(innertialMomentum , cp.momentForBox(innertialMomentum , size.width, size.height));
mySprite.setBody(myBody);
space.addBody(myBody);
//myBody.p = cc.p(xxx, yyy); //To alter the position of the sprite you have to manipulate the body directly, otherwise it won't have the desired effect. You can also access it by mySprite.body

//the Shape
var myShape = new cp.BoxShape(myBody, size.width, size.height);
//myShape.setElasticity(1);
//myShape.setFriction(0);
space.addShape(myShape);

//Apply your desired impulse
//mySprite.body.applyImpulse(cp.v(ix,iy), cp.v(rx,ry)); // Where the first vector is for the impulse strength and direction and the second is for the offset between the center of the object and where you want the impulse to be applied.
person Sebastián Vansteenkiste    schedule 27.04.2015
comment
Если я не хочу, чтобы он прыгал. я должен просто поставить myShape.setElasticity(0)? также есть ли у вас ссылка на хороший онлайн-учебник для бурундуков и кокосов 2d js? Спасибо за помощь человеку! - person Sameer Hussain; 27.04.2015
comment
Да, возитесь с цифрами сколько хотите :) У меня нет хороших обновленных туториалов, но помимо этих основ в нем не намного больше, чем использование стандартного бурундука (хотя вы показываете ваши элементы с помощью Cocos2d-js), так что вы можете просто искать учебники по ChipmunkJS, и у вас должно быть то, что вам нужно, все остальное, просто спросите. PS: я немного обновил свой ответ, я не знал, что вы спрашиваете о PhysicsSprite;) - person Sebastián Vansteenkiste; 27.04.2015
comment
Спасибо! и да, мне тоже удалось сделать это самому, немного поэкспериментировав. Последний вопрос, предположим, я хочу изменить гравитацию пространства в функции обновления. Вот так: update:function (dt) { this.space.gravity = cp.v(0, g_gravity); } это не работает, вместо этого к телу прикладывается новая сила в сочетании с предыдущей гравитацией, и они имеют кумулятивный эффект. Как обновить гравитацию? заранее спасибо - person Sameer Hussain; 27.04.2015
comment
Это странно. Я думал, что space.gravity = something должен переопределить предыдущий вектор гравитации. Если он работает так, как вы сказали, я бы просто сохранил копию последнего примененного вектора и, когда вы захотите его изменить, отмените его, применив его инверсию перед применением вашего новая гравитация. - person Sebastián Vansteenkiste; 27.04.2015