我已经为此苦苦挣扎了一段时间,似乎无法找到问题所在。
我有一个SKScene
我将称为 的self
,还有一个SKNode
被chapterScene
添加到self
. 我有一个包含可移动角色的边界设置。这是我的设置方式
ViewController.m(呈现SKScene
子类的控制器OLevel
- (void)viewDidLoad {
[super viewDidLoad];
// Configure the view.
SKView *skView = (SKView *)self.view;
skView.showsFPS = YES;
skView.showsNodeCount = YES;
// Create and configure the scene.
scene = [OLevel sceneWithSize:self.view.frame.size];
scene.scaleMode = SKSceneScaleModeAspectFit;
// Present the scene.
[skView presentScene:scene];
// Do things after here pertaining to initial loading of view.
}
这是我的OLevel.m
- (id)initWithSize:(CGSize)size {
if (self = [super initWithSize:size]) {
NSLog(@"Creating scene");
[self setUpScene];
}
return self;
}
- (void)setUpScene {
NSLog(@"Setting up scene");
//self.speed = 0.9f;
#pragma 1 Set up scene
// Set up main chapter scene
self.anchorPoint = CGPointMake(0.5, 0.5); //0,0 to 1,1
chapterScene = [SKNode node];
chapterScene.position = CGPointZero;
chapterScene.name = @"chapterScene";
[self addChild:chapterScene];
// Set up physics boundary
self.physicsWorld.gravity = CGVectorMake(0.0, 0.0);
self.physicsWorld.contactDelegate = self;
.
.
.
}
这里的要点是,最终我已经正确设置了我的场景及其子节点(正如我最近所期望的那样)。当我在模拟器(iPhone 6)上运行时,我正在使用该- (void)didBeginContact:(SKPhysicsContact *)contact
方法来监控和碰撞。每当联系开始时,我都会记录以下内容
CGPoint contactPoint = contact.contactPoint;
NSLog(@"non conv: %f, %f", contactPoint.x, contactPoint.y);
CGPoint sceneContactPoint = [self convertPoint:contactPoint toNode:chapterScene];
NSLog(@"1 conv pt: %f, %f", sceneContactPoint.x, sceneContactPoint.y);
我还记录了字符位置,以确保这个转换点是正确的。
当我在模拟器上运行它时,移动节点角色撞到墙上,我得到这个:
2016-02-25 20:02:31.102 testGame[43851:14374676] non converted point: 0.143219, 29.747963
2016-02-25 20:02:31.102 testGame[43851:14374676] 1 conv pt: -140.206223, 615.699341
2016-02-25 20:02:31.102 testGame[43851:14374676] Player hit the wall
2016-02-25 20:02:31.103 testGame[43851:14374676] player pos: -140.206238, 590.749268
这是完全正确的。
但是,无论出于何种原因,我似乎都找不到,这是在我的iPhone 5C上运行的完全相同的代码......
2016-02-25 20:04:50.062 testGame[2907:1259447] non converted point: 160.337631, 310.808350
2016-02-25 20:04:50.063 testGame[2907:1259447] 1 conv pt: 70.996162, 900.004272
2016-02-25 20:04:50.064 testGame[2907:1259447] Player hit the wall
2016-02-25 20:04:50.065 testGame[2907:1259447] player pos: -89.003845, 593.984009
我真的希望这是一个我缺少的简单修复。如果有人可以帮助我,我将不胜感激。谢谢
更新 似乎正在发生的一切是,当我在模拟器上运行它时,该点是从屏幕中心(0,0)引用的,而在设备上,参考点是真正的原点,左上角角为 (0,0),在iPhone 5c的情况下,中心为 (160, 284)。仍然不知道如何纠正这个......或者为什么它甚至会发生。
到目前为止,这是我能想到的唯一解决方案......
if (!TARGET_OS_SIMULATOR) {
contactPoint = CGPointMake(sceneContactPoint.x - screenBounds.size.width/2.0f, sceneContactPoint.y - screenBounds.size.height/2.0);
}
else {
contactPoint = CGPointMake(sceneContactPoint.x, sceneContactPoint.y);
}
但这很尴尬。这可能是 Xcode 或 Apple 的错误,或者这是发生的原因和不同的解决方案。