希望有人可以提供帮助。我一直把头发拉出来!下面是我的Sprite Kit游戏中的一些控制垫代码,它使用applyForce
移动英雄舰。我喜欢控制和运动的感觉,它有漂亮的漂移等等......但是我对它产生的动画/动作有不一致的结果。有时(大约一半的时间)动画非常流畅,看起来很正确。其余时间船舶运动动画以不同的强度结束。
游戏中的怪物和拾音器在SKAction
的各种路径上运行。当英雄船发生问题时,他们的动画不会受到影响,我通常会在调试中看到它以60.0 fps的价格出售,这让我觉得这不是帧丢失问题。我的内存使用情况是一致的,我没有看到任何大的峰值。
当虫子发生时,它始终从场景的开始就显而易见(在我开始平滑运动之后它永远不会发生 - 让我用初始力量或多次力量来思考它)并继续发生直到我重新启动关卡或暂停并取消暂停游戏,此时我得到一个完美平滑动画或小故障动画的新行为。
我的绘图和节点已经通过地图集和预加载进行了优化,即使我关闭游戏中的大部分内容(除了船和控制板之外的所有内容),我仍然会在船上遇到applyForce
这个问题。
我注意到我在插入Xcode时经常遇到这种情况,通常是在我登录时(但并非总是如此),尤其是在运行仪器时。
我的ControlPad通过代表
回叫游戏场景/* Game Scene */
@interface GameScene () <SKPhysicsContactDelegate, ControlPadDelegate>
...
- (void)createHero
{
self.heroShip = [Hero createHeroInFrame:self.frame];
[self.gameObject addChild:self.heroShip];
self.heroShip.position = CGPointMake(self.heroShip.size.width, self.frame.size.height / 2);
}
// Move Hero By X And Y
- (void)moveHeroByX:(float)moveByX andY:(float)moveByY
{
[self.heroShip.physicsBody applyForce:CGVectorMake(moveByX, moveByY)];
}
/* Control Pad Class */
static float const sensitivity = 10;
static float const maxMove = 10;
@interface ControlPad()
// Touch Points
@property (nonatomic) CGPoint navPadTouchPrevious;
@property (nonatomic) CGPoint navPadTouchCurrent;
// Touch Instances
@property (nonatomic) UITouch * navPadTouchInstance;
@implementation ControlPad
- (id)initWithSize:(CGSize)size { ... }
// Touches Began
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// Loop through touches
for (UITouch * touch in touches) {
CGPoint location = [touch locationInNode:self];
SKNode * node = [self nodeAtPoint:location];
// Navigation Pad Touched
if (node == self.navigationPad) {
self.navPadTouchInstance = touch; // Assign Touch Instance
self.navPadTouchPrevious = location;
self.navPadTouchCurrent = location;
}
}
}
// Touches Moved
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
// Loop Through Touches
for (UITouch * touch in touches) {
CGPoint location = [touch locationInNode:self];
CGPoint previous = [touch previousLocationInNode:self];
SKNode * node = [self nodeAtPoint:location];
// Move Nav Pad
if (touch == self.navPadTouchInstance) {
if (node == self.navigationPad) {
self.navPadTouchPrevious = previous;
self.navPadTouchCurrent = location;
// Move Hero
[self moveHero];
}
}
}
}
// Move Hero
- (void)moveHero
{
// Calculate Delta Move
float moveByX = self.navPadTouchCurrent.x - self.navPadTouchPrevious.x;
float moveByY = self.navPadTouchCurrent.y - self.navPadTouchPrevious.y;
// Throttle Move
moveByX = moveByX >= 0 ? MIN(moveByX, maxMove) : MAX(moveByX, -maxMove);
moveByY = moveByY >= 0 ? MIN(moveByY, maxMove) : MAX(moveByY, -maxMove);
// Add Sensitivity
moveByX = moveByX * sensitivity;
moveByY = moveByY * sensitivity;
// Move Hero
[self.delegate moveHeroByX:moveByX andY:moveByY];
}
以上只是我课程的一部分。我可以提供更多代码和/或任何日志。请告诉我。感谢。
Per Epic Byte的评论我不应该在移动的触摸中调用applyForce(并且在Apple Docs中阅读:“加速应用于单个模拟步骤(一帧)”),我已将其移至更新环。我现在在移动的触摸中设置moveByX和moveByY浮动属性,然后在更新循环的每个步骤中在applyFoce中使用它们。在我使用它们之后我将它们设置为零,因此当你松开触摸时它会停止施加力和船只漂移。
我仍然遇到不一致的平滑度。有一半时间它是完美的,另一半动画口吃。我在iPad 2上并且想知道在更强大的设备上测试它是否会告诉我什么。我的内存使用量很低。
/* Game Scene */
-(void)update:(NSTimeInterval)currentTime
{
...
[self moveHero];
...
}
- (void)moveHero
{
[self.heroShip.physicsBody applyForce:CGVectorMake(self.moveByX, self.moveByY)];
self.moveByX = 0;
self.moveByY = 0;
}
// Called from control pad class
- (void)moveHeroByX:(float)moveByX andY:(float)moveByY
{
self.moveByX = moveByX;
self.moveByY = moveByY;
}