希望有人可以提供帮助。 我一直在拉我的头发就这一个! 下面是一些从我的雪碧套件游戏中使用的控制键盘码的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];
}
以上只是我的课件。 我可以提供更多的代码和/或任何事物日志。 只是让我知道。 谢谢。
编辑
每史诗字节的评论,我不应该叫applyForce在触摸移动,(在苹果文档阅读:“加速应用于单个模拟步骤(一帧)”),我把它移动到更新循环。 现在我设置movedByX和movedByY上移动触摸在游戏场景中漂浮的属性,然后在更新循环的每个步骤中使用它们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;
}