改变游戏循环中的价值

Posted

技术标签:

【中文标题】改变游戏循环中的价值【英文标题】:changing value in gameloop 【发布时间】:2018-01-24 02:00:56 【问题描述】:

我有一个变量tail。我在创建构造函数时为这个变量设置了一个值。我有一个changeTail() 方法,它定期将尾部更改 10 个像素(增加 10 个像素,然后减少 10 个像素)。 此方法在update 方法中调用,因此它是连续的。

我有另一种方法speedUp(),当分数增加 10 时,它会加速玩家。要获得分数当前值,这也在update 方法中调用。 所以,当我想加快游戏速度时,我也想让尾巴更长。所以我使用speedUp() 为tail 设置了一个新值。

但问题是,由于在 update 方法中调用了 speedUp(),它会一直为 tail 设置相同的值,而现在 tail 不会像在加速之前那样改变。

这是我的代码:

class Game
   float tail; 
   boolean increasing;  
   int score;  

   public Game()
    tail = 60;
    increasing = false;
    score = 0;
   

   public void changeTail()
     if(increasing)
       tail += 1;
       if(tail >= 60)
         increasing = false;
       
     else
       tail -= 1;
       if(tail <=50)
         increasing = true;
       
         
   

   public void speedUp()

     if(score >= 20)
      //player speed up
      tail = 70;
     

   

   public void update()
     tailChange();
     speedUp();
   


【问题讨论】:

很难从您的代码和描述中理解您究竟想要实现什么。你能重组你的问题,简化它吗?现在,我可以猜到,在您的 speedUp() 方法中,您应该使用 tail += 10 而不是 tail = 70,并且在 tailChange() 中增加 10 个 tail 的最大值和最小值。 我想做的是:在开始的时候,尾巴在 50-60 的间隔内变化。如果得分超过 20,尾巴应该在 60-70 之间变化。但我在 speedUp() 中检查分数,它在一秒钟内被调用 60 次,所以不是只设置一次 tail 的值并在 60-70 的间隔内更改它,而是一直将 tail 的值分配给 70,所以 tail 不会改变它价值。我希望它更清楚:) 可能还有一个定义 currentTailSize 的变量,并且您的 if 基于该值。类似 if(tail >= currentTailSize)... currenttailsize 仅在 speedUp() 方法上更新。希望它有所帮助:) 对不起,我现在看到了。我已经分享了解决方案 【参考方案1】:

添加附加变量maxTail,并在score >= 20 时将其增加10。在tailChange() 中,tailmaxTailmaxTail - 10 之间变化。

public class Game 

    float maxTail;
    float tail;
    boolean increasing;

    int score;
    int nextScoreGoal;

    public Game() 
        maxTail = 60;
        tail = maxTail;
        increasing = false;

        score = 0;
        nextScoreGoal = 20;
    

    public void update() 
        tailChange();

        if (score >= nextScoreGoal) 
            nextScoreGoal += 20; // I assume that you will keep increasing tail?
            speedUp();
        
    

    public void tailChange() 
        if (increasing) 
            tail++;
            if (tail >= maxTail) 
                increasing = false;
            
         else 
            tail--;
            if (tail <= maxTail - 10) 
                increasing = true;
            
        
    

    public void speedUp() 
        maxTail += 10;
        tail += 10;
    

或者只是把speedUp()方法放在update()之外,即在你增加score的地方调用它。

【讨论】:

如果 score 超过 20,它会不断增加 maxTail 和 tail 的值,不是吗? 没问题,我想我已经用另一种方式找到了解决方案。如果可行,我会分享 当然,没关系。【参考方案2】:

读完这篇文章 (https://answers.unity.com/questions/1193588/how-to-only-update-once-in-update-function.html) 我找到了答案。因此,我没有尝试在 speedUp() 中设置 tail 的值,而是在分数增加时设置它。例如,与砖块碰撞时分数会增加:

public void brickCollision()
  if(/*check if collides with brick*/)
    score +=1;
    if(score >=20)
     tail = 70;
    
  


现在可以完美运行了。是时候解决其他错误了:)

【讨论】:

以上是关于改变游戏循环中的价值的主要内容,如果未能解决你的问题,请参考以下文章

从分离线程停止主游戏循环的最佳方法

ava 8中的新功能特性

游戏究竟如何实现教育价值

如何使用循环,导致数组作为输出

cocos2d iPhone中的循环背景

试图理解 Java 中的高级游戏循环