2011-01-24 3 views
1

약 1 개월 동안 작업해온 iPhone 용 게임을 제작 중입니다. 나는 화면의 상단에서 떨어지는 다른 색깔의 공과 플레이어가 시도하고 잡을 수있는 하단의 인장을 가지고 있습니다. 그들은 각각의 새로운 볼과 함께 성장하는 스택을 생성하기로되어 있기 때문에, Scoops와 유사합니다! 현재 앱 스토어에 있습니다. 나는 각각의 새로운 볼 스프라이트를 둘러싼 몸체와 모양을 가지고 있으며 중력의 영향을받습니다. 그러나 인장은 중력에 의해 영향을받을 수는 없지만 첫 번째 공과 각각의 후속 공이 그 공을 때리고 스택에 추가 될 때를 감지하기 위해 충돌 감지 기능이 있어야합니다. applyForce를 시도하고 중력에 맞서는 힘을 적용했습니다. 볼이 씰과 충돌 할 때까지 작동 한 다음 화면에서 떨어집니다. 누군가가 내 코드가 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으로 전화하여 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 

이것은 합법적 인 프로그램이 아니지만이를 통해 당신은 그것이 어떻게 작동하는지 볼 수 있습니다.