cocos2d和花栗鼠制造机构忽视重力

时间:2011-01-24 02:25:19

标签: iphone xcode cocos2d-iphone collision-detection

我正在为iPhone制作一款已经上市约一个月的游戏。我有不同颜色的球从屏幕顶部落下,底部有一个密封圈,玩家可以控制它来抓住它们。因为它们应该创建一个随每个新球一起增长的堆栈,类似于Scoops!目前在应用程序商店。我有一个身体和形状,每个新的球精灵,他们受到重力的影响。但是密封不会受到重力的影响,但我需要它进行collsion检测,以检测第一个球和每个后续球击中它并被添加到堆叠中的时间。我已经尝试过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 :(得分:0)

你有一种可能性就是给予密封无限质量:

 cpBody *SealBody = cpBodyNew(INFINITY, INFINITY);
以这种方式,它不会受到重力的影响。

如果移动印章,则需要调用cpHashResizeStaticHash以便花栗鼠可以将其考虑在内(静态物体不会作为优化方式添加到空间中)。

答案 1 :(得分:0)

我不打算仔细阅读你的所有代码并告诉你一些简单的事情,这会节省你一些时间。

由于您使用的是Cocos2d,请创建一个ccTime函数。 Here是关于其他一些内容以及如何使用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

这不是一个legitimage程序,但通过查看它你可以看到它是如何工作的。