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:
:
오류는 다음 코드 구조가 나타나는 시간을 나타낸다.
Block
은 GameSprite
에서 상속되며 .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
, 내 문제는 어딘가 잘못된 오토 릴리즈를 것 같다 -하지만 블록이 할당 해제 할 수있는 기회를 가질 것입니다 어디서 볼 수 없습니다. 결과적으로 저는 다소 혼란 스럽습니다.
도움 주셔서 감사합니다.
그랬습니다. 글쎄, 실제로'bodyDef.userData = (__bridge void *) block;'이라고 밝혀졌습니다. 그러나 그것은 근본적인 문제였습니다. 고마워 ~ – linkhyrule5