2011-01-24 8 views
1

私は約1ヶ月間作品に登場しているiPhone用ゲームを構築しています。私は画面の上から落ちる色の違うボールと、プレイヤーが試して捕まえるためにコントロールしている底面のシールを持っています。彼らはScoopsと同様に、新しいボールごとに成長するスタックを作成するはずです!現在のアプリストアで私は新しいボールのスプライトを囲む体と形を持っており、重力の影響を受けています。しかし、シールは重力の影響を受けることはありませんが、最初のボールとそれに続く球がそれに当たってスタックに追加されたときを検出するために、衝突検出が必要です。私はapplyForceを試して、重力に反する力を加えました。これは、ボールがシールに衝突してスクリーンから落ちるまで働きます。誰かが私のコードはfarly長いです...助けてくださいすることができますが、私は以下の問題のオブジェクトのための主要なパーツを投稿することができます:cocos2dとchipmunk making bodiesは重力を無視します

-(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に電話する必要があります。これは、chipmunkが考慮に入れることができるようになります(静的なボディは、最適化の方法としてスペースに追加されません)。

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 

これは正当なプログラムではありませんが、それを見てどのように動作するかを見ることができます。

関連する問題