我正在使用Swift和SpriteKit制作iOS。但是,我的应用程序运行出现异常。有时船SKSpriteNodes没有出现在屏幕上,有时子弹的SKSpriteNodes没有出现,有时一切都显示正常(我在代码的其他地方添加了子弹)。在所有情况下,我都不会在运行之间更改代码。我直接在这个屏幕上启动应用程序,所以我想这可能与这些SKSpriteNodes没有足够的时间进行初始化有关。有什么想法吗? 最佳答案 设置self.ship的zPosition,使其位于背景节点的前面。像这样的事情(我会在设置位置后这样做):self.ship.z
您好,我制作了一款名为“赛马”的iOS游戏并将其发布到AppStore。在iOS8.x.x上玩没问题,但我安装iOS9Beta3后,在同一游戏(相同代码)中,iPhone无法识别多点触摸。我必须离开我的手指才能进行下一次触摸。但事实并非如此,即使我仍然按住之前的水龙头,我也可以进行新的水龙头。有什么问题,我该怎么办? 最佳答案 我在今年夏天推出的一款游戏中遇到了同样的问题。我必须在SKScene中明确启用多点触控:-(void)didMoveToView:(SKView*)view{self.view.multipleTouchEn
我将如何创造逼真的驾驶体验?我正在使用带有SpriteKit的iOSSwift3,当我点击throttle按钮时使用函数applyForce来加速,当我刹车时我给physicsBody添加了摩擦力,而且我似乎无法右转,不知道该怎么做现在为了转弯,我正在使用左转和右转来分割屏幕,但我正在使用applyForce,但这非常糟糕,因为它在汽车停止时转弯,而且以一种非常不现实的方式转弯。当我施加力时它只会上升,所以如果我确实创建了一个转向机构并且我做了一个转弯,汽车仍然会上升。另请注意:多点触控不起作用?有什么帮助吗?谢谢overridefuncdidMove(toview:SKView){/
我正在尝试旋转玩家以进行触摸。使用触摸移动功能,我将位置设置为一个变量。然后我调用一个函数。它有效,但角度不对。Location是全局变量,player是我要转动的Sprite。它偏离了大约15度。funcrotatePlayer(){letangle=atan2(location!.y-player!.position.y,location!.x-player!.position.x)player?.zRotation=angle} 最佳答案 根据SpriteKitBestPractices文档Usegamelogicandart
我的项目在iPhone6上以55-60FPS的速度运行,但任何旧版本都完全无法播放,因为某些东西正在占用CPU。我认为问题与map上的图block和层数有关(64x256,4层),Instruments显示“SKCRenderer:preprocessSpriteImp(...”运行时间为5198毫秒(23.2%)。JSTileMap是否一次加载每个图block的图像(可见或不可见)?RW的这篇文章表明情况确实如此,并且可以通过解决它来大幅提升性能:http://www.raywenderlich.com/forums/viewtopic.php?f=29&t=9479Inanothe
如何在矩形中画一个洞?我想画一个矩形,里面有一个空洞,可以显示背景。我正在使用SKShapeNode创建一个矩形,但我不知道如何在其中制作一个孔(圆)。这是我运行你的代码,但是我的圆圈不是空的,圆圈是黑色的,我希望它是空的。有没有我没有提到的错误? 最佳答案 这是代码。importSpriteKitclassGameScene:SKScene{overridefuncdidMove(toview:SKView){leteffect=SKEffectNode()addChild(effect)letrect=SKShapeNode(r
我有一个看起来很基本的ViewController和一个SCNView,它有一个overlaySKScene。我遇到的问题是我不希望在底层self.scene(gameScene在下面的示例)如果它首先在叠加场景的SpriteKit节点中检测到。对于以下内容,即使点击发生在SKOverlay场景节点actionButtonNode上,两个场景都报告发生了点击。ViewControllerimportUIKitimportSceneKitclassViewController:UIViewController{overridefuncviewDidLoad(){super.viewDid
我一直在玩swift,并一直在尝试制作一个基于图block的游戏,该游戏具有ScrollView,因此玩家处于中心位置。我有经理让它开始工作,但我似乎正在重新绘制当前存在的节点之上的所有节点,所以在几步之后我有1000多个节点并且游戏逐渐停止。我猜我需要在绘制新节点之前删除所有旧节点?我已经了解了执行此操作的方法,例如移除子项,但最终我在移动后没有绘制任何内容。我已经包含了与下面的sprite绘图相关的部分。funcplaceTile2D(tile:Tile,direction:Direction,position:CGPoint){lettileSprite=SKSpriteNode
我希望我的Sprite碰撞和接触被检测到,但我不希望它们动态移动(我只需要知道它们已经接触过)。didBeginContact(contact:SKPhysicsContact!)只有在我将玩家的physicsBody.dynamic设置为true时才会调用。如何在不影响玩家位置或移动的情况下调用这些委托(delegate)方法? 最佳答案 您可以将对象固定在屏幕上,因此您无需将重力设置为0(如果您希望保持其他对象的重力)。像这样设置对象:object.physicsBody.dynamic=trueobject.physicsBo
更新:我已经解决了这个问题,并想出了一个比提供的答案更简单的方法。我的解决方案是让SPACESHIP的速度等于它与我手指触摸的距离。为了更快地移动,您可以将该速度乘以一个常数。在本例中,我使用了16。我还取消了在touchesEnd事件中将lastTouch设置为nil。这样,即使我松开手指,船仍会停止。overridefuncupdate(currentTime:CFTimeInterval){/*Calledbeforeeachframeisrendered*/iflettouch=lastTouch{myShip.physicsBody.velocity=CGVector(dx: