SpriteKit:让角色在一个世界中移动

时间:2013-12-02 08:13:38

标签: ios objective-c xcode sprite sprite-kit

我试图了解你如何能够创造一个巨大的世界,让一个角色在世界范围内移动,然后用移动的角色移动世界的可见部分。就像马里奥游戏一样。

我在这里阅读苹果指南:https://developer.apple.com/library/IOs/documentation/GraphicsAnimation/Conceptual/SpriteKit_PG/Actions/Actions.html#//apple_ref/doc/uid/TP40013043-CH4-SW32

关于“将场景置于节点上”但我根本无法理解它。我尝试实现它,但它根本不起作用。

那么,有人能帮助我吗?一个有好评的完整例子会很棒。

希望我的问题有道理,谢谢大家提前!

3 个答案:

答案 0 :(得分:0)

他们试图与你交谈“你的游戏世界是一个节点,你需要做的只是用你的角色移动世界节点”。 游戏“冒险” - 精灵套件的示例游戏将帮助你创造一个像这样的巨大世界。

https://developer.apple.com/LIBRARY/IOS/documentation/GraphicsAnimation/Conceptual/CodeExplainedAdventure/AdventureArchitecture/AdventureArchitecture.html

=>在纪录片中有这个游戏的示例代码。

此外,你可以创建“平铺地图”来做同样的事情。

答案 1 :(得分:0)

我使用从SKNode继承的简单类AGMovingNode作为背景图层。

这不完美,但至少你可以从哪里开始。

以下是该类的代码:

<强> AGMovingNode.h

#import <SpriteKit/SpriteKit.h>

@interface AGMovingNode : SKNode

@property float pointsPerSecondSpeed;

- (instancetype)initWithPointsPerSecondSpeed:(float)pointsPerSecondSpeed;
- (void)update:(NSTimeInterval)currentTime paused:(BOOL)paused;

@end

<强> AGMovingNode.m

#import "AGMovingNode.h"

@implementation AGMovingNode
{

    NSTimeInterval _lastUpdateTime;
    NSTimeInterval _deltaTime;

}

- (instancetype)initWithPointsPerSecondSpeed:(float)pointsPerSecondSpeed {
    if (self = [super init]) {
        self.pointsPerSecondSpeed = pointsPerSecondSpeed;
    }
    return self;
}

- (void)update:(NSTimeInterval)currentTime paused:(BOOL)paused {
    if (paused) {
        _lastUpdateTime = 0;
        return;
    }
    //To compute velocity we need delta time to multiply by points per second
    if (_lastUpdateTime) {
        _deltaTime = currentTime - _lastUpdateTime;
    } else {
        _deltaTime = 0;
    }
    _lastUpdateTime = currentTime;

    CGPoint bgVelocity = CGPointMake(-self.pointsPerSecondSpeed, 0.0);
    CGPoint amtToMove = CGPointMake(bgVelocity.x * _deltaTime, bgVelocity.y * _deltaTime);
    self.position = CGPointMake(self.position.x+amtToMove.x, self.position.y+amtToMove.y);
}
@end

我在其中一个教程中找到了它(现在不记得是哪一个)并略微修改了它。

答案 2 :(得分:0)

如果你使用SKActions来移动物体,我发现它是最好的。

我所做的是使用精灵动画(当他站立和行走时)重新定位我的角色的方法:

- (void)moveUser:(CGPoint)position {
  SKSpriteNode *user = (SKSpriteNode*)[self childNodeWithName:@"userSprite"];

  // ... some logic to load correct atlas
  NSArray *animationFrames = ...

  SKAction *animation = [SKAction animateWithTextures:animationFrames timePerFrame:0.05f numberOfFrames:animationFrames.size];
  SKAction *moveToPositionAction = [SKAction moveTo:position duration:0.4f];

  [userNode runAction:[SKAction group:@[animation,moveToPositionAction]]];
}