通过使用Cocos2d for iPhone在平板电脑上工作,我开始了解游戏开发。我正在努力让碰撞检测运行,以便我的角色在他击中平台时取消他的跳跃动作。
我正在使用this tutorial中的一种技术,在那里我创建了一个单独的“元图块”层。问题是,直到角色精灵完全位于可碰撞的磁贴内,而不是在它之上时才会发生碰撞检测。
我正在使用下面的代码根据我的角色精灵的当前位置确定平铺坐标:
- (CGPoint) tileCoordForPosition: (CGPoint) position {
int x = position.x / tileMap.tileSize.width;
int y = ((tileMap.mapSize.height * tileMap.tileSize.height) - position.y) / tileMap.tileSize.height;
return ccp(x, y);
}
我尝试了各种技巧,甚至试图用这段代码弄清楚我的角色下面是什么牌:
- (void) update: (ccTime) dt {
BOOL isCollision = NO;
if (firstRun) {
oldY = player.position.y;
firstRun = NO;
}
CGPoint oneTileDown = ccp(player.position.x, player.position.y / 2);
CGPoint tileCoord = [gameplayLayer tileCoordForPosition:oneTileDown];
int tileGid = [gameplayLayer.meta tileGIDAt:tileCoord];
if (tileGid) {
NSDictionary* tileProperties = [gameplayLayer.tileMap propertiesForGID:tileGid];
if (tileProperties) {
NSString* collision = [tileProperties valueForKey:@"Collidable"];
if (collision && [collision compare:@"True"] == NSOrderedSame) {
//CCLOG(@"Collision Below");
isCollision = YES;
if (player.characterState == kStateFalling) {
[player stopAllActions];
}
}
}
}
if (oldY < player.position.y) {
CCLOG(@"Character is jumping");
player.characterState = kStateJumping;
}
else if (oldY > player.position.y) {
CCLOG(@"Character is falling");
player.characterState = kStateFalling;
}
oldY = player.position.y;
}
但是同样的问题发生了:我的角色跳跃,落在碰撞瓦片内部并停止而不是降落在瓷砖顶部。
有没有更好的方法来检查tilemap中的碰撞?
答案 0 :(得分:0)
我有解决这个问题的方法。
在方法(CGPoint) tileCoordForPosition: (CGPoint)
位置,您必须编写以下内容:
int x = position.x / tileMap.tileSize.width;
int y = ((tileMap.mapSize.height * tileMap.tileSize.height + player.contenSize().height / 2) - position.y) / tileMap.tileSize.height;
return ccp(x, y);
player
是一个精灵,你必须从中添加一半的高度。
答案 1 :(得分:0)
你需要做的是使用CGRectContainRect
检查玩家精灵的边界框是否与不应该匹配的图块相交。