【问题标题】:Alternative spawning method to a timer计时器的替代生成方法
【发布时间】:2016-05-02 09:52:17
【问题描述】:

我正在制作一个带有视差滚动地面的反应游戏。我的敌人生成计时器位于 didMoveToView 中,现在我的问题来了。游戏一边玩一边加速,但是我的生成方法还是一样的,所以如果敌人以相同的频率生成就有点无聊了。 代码如下:

//inside the didMoveToView    
SKAction *addEnemRand = [SKAction performSelector:@selector(addRandomEnemy) onTarget:self];
SKAction *addEnemRandWait = [SKAction waitForDuration:2];
SKAction *addEnemRandAll = [SKAction sequence:@[addEnemRandWait, addEnemRand]];
SKAction *addEnemRandAllForever = [SKAction repeatActionForever:addEnemRandAll];
[self runAction:addEnemRandAllForever];

有人知道以适当方式生成敌人的方法吗?

这里是移动地面的代码(有两个)。也许可以将产卵速度与地面位置联系起来?:

-(void)addGround:(SKSpriteNode *)sprite withSpeed:(int)speed {

if (ground.position.x+ground.frame.size.width/2 < 0) {

    ground.position = CGPointMake(self.size.width+ground.size.width/2, ground.size.height/2+1);
}

// movement
ground.position = CGPointMake(ground.position.x-speed, ground.position.y);    
}

感谢您的帮助! (目标 c 中的代码)

编辑:看来 GamePlayKit 可以帮助我,但我不知道如何用它实现产卵方法。我在互联网上阅读了一些教程,但对我没有帮助。有人可以帮我吗?

【问题讨论】:

    标签: ios objective-c sprite-kit 2d 2d-games


    【解决方案1】:

    我认为值得研究 randomizing that GamePlayKit provides 来做到这一点。

    看看这个tutorial,你在其中实现了“基本规则系统结合另一个随机分布来处理敌人的重生行为”

    【讨论】:

    • 这绝对是一本好书,但对于我关于产卵与地面运动的问题没有帮助。
    【解决方案2】:

    您可以使用地面位置来管理生成时间,也可以使用关卡开始后的时间。这是我在更新方法中的代码,用于模拟任务,使用经过的时间。

    initWithSize 方法中的属性:

    self.lastUpdateTimeInterval = 0;
    self.timeSinceEnemyAdded = 0;
    self.addEnemyTimeInterval = 1.5;
    self.totalGameTime = 0;
    

    更新方法:

       -(void)update:(NSTimeInterval)currentTime {
    
            if (self.lastUpdateTimeInterval ) {
                self.timeSinceEnemyAdded += currentTime - self.lastUpdateTimeInterval;
                self.totalGameTime += currentTime - self.lastUpdateTimeInterval;     
            }
    
            if (self.timeSinceEnemyAdded > self.addEnemyTimeInterval && !self.gameOver) {
                [self addEnemy];
                self.timeSinceEnemyAdded = 0;
            }
    
            self.lastUpdateTimeInterval = currentTime;
    
            if (self.totalGameTime > 480) {
                self.addEnemyTimeInterval = 0.5;
                self.minSpeed = -160;
            } else if (self.totalGameTime > 240) {
    
                self.addEnemyTimeInterval = 0.65;
                self.minSpeed = -150;  
            } else {
    
            //Something else
    
            }
    }
    

    如果需要,您可以只管理地面长度属性

    【讨论】:

    • 我正在寻找一种没有时间的产卵方法。你能给我一个使用地面位置的产卵方法的例子吗?
    • 在您的 addGround 方法中,将“ground”存储在私有属性“self.ground.position = CGPointMake...”中,并在更新方法中使用该属性,而不是时间,检查“if ( self.ground.position > someNumber) 然后 {self.speed = some Speed}"(您还需要使速度变量 - 私有属性,以更改它)
    • 我能说如果 (self.ground.position > someNumber) 然后生成敌人吗?
    • 它可以工作,但它不会停止产卵,我该如何调节产卵?我的意思是它怎么只能产生一次然后再等待?
    • 然后尝试使用我之前发布的代码,您只需要 2 个第一个 if 语句,用于计算自添加最后一个敌人以来的时间。
    猜你喜欢
    • 2011-07-26
    • 2018-04-11
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    相关资源
    最近更新 更多