2012-08-01 1 views
0

Box2D 설명서에 제안 된대로 body-> userData를 연관된 CCSprite로 설정합니다. 그러나 나중에 동일한 메서드 또는 루프에 대해서도 액세스하려고하면 필연적으로 EXC_BAD_ACCESS가 throw됩니다.EXC_BAD_ACCESS Box2D 본문에 액세스하려고합니다. UserData

b2BodyDef bodyDef; 
b2Body* blockBody; 
Block* block; 

//... 

block = [Block spriteWithFile:spriteName]; 

//Block configuration 
block.position = CGPointMake(x.floatValue * BLOCK_SIZE_PIXELS, y.floatValue * BLOCK_SIZE_PIXELS);   
block.anchorPoint = CGPointZero; 
[self addChild:block z:7]; 
[self.blockArray addObject:block]; 

//Body configuration 
bodyDef.type = b2_dynamicBody; 
bodyDef.position = toMeters(block.position); 
bodyDef.angle = 0.0f; 
bodyDef.linearDamping = 1.0f; 
bodyDef.angularDamping = 0.0f; 
bodyDef.gravityScale = 1.0f; 
bodyDef.allowSleep = true; 
bodyDef.awake = true; 
bodyDef.fixedRotation = true; 
bodyDef.userData = █ 

blockBody = world->CreateBody(&bodyDef); 

vertices[0] = toMeters(CGPointZero); 
vertices[1] = toMeters(CGPointMake(BLOCK_SIZE_PIXELS, 0)); 
vertices[2] = toMeters(CGPointMake(BLOCK_SIZE_PIXELS, BLOCK_SIZE_PIXELS)); 
vertices[3] = toMeters(CGPointMake(0, BLOCK_SIZE_PIXELS)); 

blockShape.Set(vertices, 4); 

fixtureDef.shape = &blockShape; 
fixtureDef.density = 1.0f; 
blockFixture = blockBody->CreateFixture(&fixtureDef); 

block.body = blockBody; 


//UPON INVOKING THIS LINE, 
//PROGRAM CRASHES WITH EXCEPTION: EXC_BAD_ACCESS 
Block* test = (__bridge Block*)blockBody->GetUserData(); 

이 코드 CCLayer 상속 GameLayer.m에 나타나는 loadlevel: :

오류는 다음 코드 구조가 나타나는 시간을 나타낸다.

BlockGameSprite에서 상속되며 .body을 정의하고 CCSprite를 상속합니다. 헤더 파일 : 나는 온라인으로 찾을 수있는에서

// 
// Block.h 
// 
// Created by [REDACTED] on 7/20/12. 
// Copyright (c) 2012 [REDACTED]. All rights reserved. 
// 

#import <Foundation/Foundation.h> 
#import "GameSprite.h" 
//#import "Constants.h" 

@interface Block : GameSprite 
{ 
// GameSprite* _sprite; 
// int _platformTag; 
} 

+(Block*) blockWithFile: (NSString*) filename; 
+(Block*) blockWithTexture: (CCTexture2D*) texture; 
@end 

// 
// GameSprite.h 
// LegendaryOiramBrothers 
// 
// Created by [REDACTED] on 7/20/12. 
// Copyright (c) 2012 [REDACTED]. All rights reserved. 
// 

#import "CCSprite.h" 
#import "Constants.h" 
#import "Box2D.h" 

@interface GameSprite : CCSprite 
{ 
    b2Body* body; 
} 

- (void) update; 

- (void) setPosition:(CGPoint)position; 
- (b2Vec2) getVelocity; 
- (void) setVelocity:(b2Vec2) vel; 

@property (nonatomic) b2Body* body; 

@end 

, 내 문제는 어딘가 잘못된 오토 릴리즈를 것 같다 -하지만 블록이 할당 해제 할 수있는 기회를 가질 것입니다 어디서 볼 수 없습니다. 결과적으로 저는 다소 혼란 스럽습니다.

도움 주셔서 감사합니다.

답변

2

이 줄에서 오류를 발견 할 수 있습니까?

bodyDef.userData = &block; 

포인터 자체가 아니라 포인터의 주소를 지정합니다. 수정해야합니다 :

bodyDef.userData = block; 
+0

그랬습니다. 글쎄, 실제로'bodyDef.userData = (__bridge void *) block;'이라고 밝혀졌습니다. 그러나 그것은 근본적인 문제였습니다. 고마워 ~ – linkhyrule5