2011-01-24 43 views
1

我正在爲iPhone開發一款已經投入使用約一個月的遊戲。我有不同顏色的球從屏幕頂部落下,底部有一個密封圈,玩家可以控制它來抓住它們。因爲他們應該創建一個隨每個新球一起增長的堆棧,類似於Scoops!目前在應用商店中。我有一個身體和形狀,圍繞着每個新球形精靈,他們受到重力的影響。但是密封不能受重力的影響,但是我需要它通過collsion檢測來檢測第一個球和每個後續球何時擊中並且被添加到堆疊中。我曾嘗試過應用力量,並施加了一種抵抗重力的力量,這種力量直到一個球與密封件發生碰撞,然後才從屏幕上消失。是否有人可以幫助...我的代碼是farly長,但我可以在下面的問題張貼的對象主要部分:cocos2d和花栗鼠製作機構忽略重力

-(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); 

} 

回答

0

一種可能性給予密封無限質量:

cpBody *SealBody = cpBodyNew(INFINITY, INFINITY); 

這樣,它不會受到重力的影響。

如果移動印章,您需要撥打cpHashResizeStaticHash,以便花栗鼠能夠將其考慮在內(靜態身體不會作爲優化方式添加到空間中)。

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程序,但通過看它,你可以看到它是如何工作的。