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