cocos2d и бурундук, создающие тела, игнорируют гравитацию - PullRequest
1 голос
/ 24 января 2011

Я создаю игру для iPhone, которая находится в разработке около месяца.У меня есть разноцветные шары, которые падают с верхней части экрана, и печать внизу, которую игрок контролирует, чтобы попытаться поймать их.Так как они должны создавать стек, который растет с каждым новым мячом, как в Scoops!в магазине приложений в настоящее время.У меня есть тело и форма, которые окружают каждый новый шаровой спрайт, на них влияет гравитация.Но гравитация не может повлиять на печать, но мне нужно, чтобы она обнаружила столкновение, чтобы определить, когда первый шар и каждый последующий шар попадают в него и добавляются в стек.Я попробовал applyForce и применил силу, которая противодействует гравитации, это работает, пока шар не столкнется с печатью, а затем не упадет с экрана.Может кто-нибудь, пожалуйста, помогите ... Мой код очень длинный, но я могу опубликовать основные части для рассматриваемого объекта ниже:

-(void) AddSealSprite {

Seal = [CCSprite spriteWithFile:@"Seal2Inverted.png"];
Seal.position = ccp(160, 0);
[self addChild: Seal z:1];
Seal.tag = 2;

 cpBody *SealBody = cpBodyNew(1, INFINITY);
 SealBody->p = cpv(160, 0);
cpSpaceAddBody(space, SealBody);
//Creates Seal shape

int NumberOfVerts = 4;
CGPoint SealVerts[] = {
    ccp(-60, -60),
    ccp(60, -60),
    ccp(60, 60),
    ccp(-60, 60), 
};

cpShape *SealShape = cpCircleShapeNew(SealBody, 100, cpvzero);
SealShape->e = 0.5;
SealShape->u = 1.0;
SealShape->data = Seal;
cpSpaceAddShape(space, SealShape);
// here is my gravity offset...

cpBodyApplyForce(SealBody, cpv(0, NumberOfBallsInStack * 200), cpvzero);

}

и метод спрайта шара

-(void) addNewSpriteX: (float)x y:(float)y
{
int posx, posy;

CCSpriteBatchNode *batch = (CCSpriteBatchNode*) [self getChildByTag:kTagBatchNode];
posy = 0;

//New Random sprite code
switch (arc4random() % 5) {
    case 0:
        posx = 0;
        break;
    case 1:
        posx = 60;
        break;
    case 2:
        posx = 120;
        break;
    case 3:
        posx = 180;
        break;
    case 4:
        posx = 240;
        break;
}

CCSprite *sprite = [CCSprite spriteWithBatchNode:batch rect:CGRectMake(posx, posy, 60, 60)];
[batch addChild: sprite];

sprite.position = ccp(x,y);



int num = 4;

    CGPoint verts[] = {
    ccp(-30, -30),
    ccp(-30, 30),
    ccp( 30, 30),
    ccp( 30,-30),
};

cpBody *body = cpBodyNew(1.0f, cpMomentForPoly(1.0f, num, verts, CGPointZero));




// TIP:
// since v0.7.1 you can assign CGPoint to chipmunk instead of cpVect.
// cpVect == CGPoint

body->p = ccp(x, y);
cpSpaceAddBody(space, body);

cpShape* shape = cpPolyShapeNew(body, num, verts, CGPointZero);
shape->e = 0.5f; shape->u = 0.5f;
shape->data = sprite;
cpSpaceAddShape(space, shape);

}

Ответы [ 2 ]

0 голосов
/ 17 ноября 2011

Я не собираюсь читать весь ваш код и рассказывать вам что-то простое, что сэкономит вам время.

Поскольку вы используете Cocos2d, создайте функцию ccTime. Здесь - это учебник по некоторым другим вещам и тому, как использовать ccTime.

В вашем ccTime ваш спрайт (шар) должен вычесть свою координату y на небольшое количество (это количествозависит от того, как часто вызывается ccTime).Краткий пример:

@interface Ball : Sprite {
    float vx;
    float vy;
    float gravity;
    float bounce;
}

@property float vx;
@property float vy;

- (void)update:(ccTime)dt;

@end

@implementation Ball

@synthesize vx;
@synthesize vy;

- (id) init
{
    self = [super init];
    if (self != nil) {
        gravity = -20.0;
        bounce = -0.7;
        Sprite *ball = [Sprite spriteWithFile:@"Ball.png"];
        [self addChild:ball];
        [self schedule:@selector(update:)];
    }
    return self;
}

- (void)update:(ccTime)dt
{
    float x = self.position.x;
    float y = self.position.y;
    vy += gravity; // You are essentially subtracting from the y axis of your sprite.
    x += vx * dt;
    y += vy * dt;

    self.position = ccp(x, y);
}

@end

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

0 голосов
/ 17 ноября 2011

Одна из ваших возможностей - дать бесконечную массу печати:

 cpBody *SealBody = cpBodyNew(INFINITY, INFINITY);

, таким образом, гравитация не повлияет на нее.вызвать cpHashResizeStaticHash, чтобы бурундук мог принять это во внимание (статические тела не добавляются в пространство как способ оптимизации).

...