两个 lib-gdx 维度中的重力

Gravity in two lib-gdx dimensions

我正在开发一款受第一款乒乓球游戏启发的应用程序。所以只有两个杆和一个球,两个玩家可以通过用手指移动这些杆来互相挑战。 该应用程序适用于 android 手机,开发时间为 java。

我用的是gdx lib框架

这就是游戏风格

Style Example

一切看起来都很简单,直到我不得不开发球的引力。

制作一款2d游戏的引力,看似并不复杂,实则相当困难。事实上,经过多次尝试开发游戏,我设置了一个随机重力。简而言之,球不遵循逻辑,而是相对于击中屏幕的一侧朝着随机方向移动。

结果是这样的,一个生成随机数的函数。

public void gravity(){
        switch (gravitylevel){
            case 1:
                if(gravitychanche){
                    gravity.setXincrement(rand.getX());
                    gravity.setYincrement(rand.getY());
                }
                else{
                    gravity.setXdecrement(rand.getX());
                    gravity.setYincrement(rand.getY());
                }
                break;
            case 2:
                if(gravitychanche){
                    gravity.setXdecrement(rand.getX());
                    gravity.setYdecrement(rand.getY());
                }
                else{
                    gravity.setXincrement(rand.getX());
                    gravity.setYdecrement(rand.getY());
                }
                break;
            case 3:
                if(gravitychanche){
                    gravity.setXdecrement(rand.getX());
                    gravity.setYdecrement(rand.getY());
                }
                else{
                    gravity.setXdecrement(rand.getX());
                    gravity.setYincrement(rand.getY());
                }
                break;
            case 4:
                if(gravitychanche){
                    gravity.setXincrement(rand.getX());
                    gravity.setYincrement(rand.getY());
                }
                else{
                    gravity.setXincrement(rand.getX());
                    gravity.setYdecrement(rand.getY());
                }
                break;
        }
    }

这段代码非常简陋,但是当我试图在 lib gdx 上重现一个相当逼真的重力时,所有的指南都强迫我为一个三维游戏做一个重力。有没有办法在 lib gdx 上创建一个不太复杂的二维引力?

你真的不需要重力。 对球使用速度矢量要容易得多。如果球撞到墙或玩家的横杆,您只需反转速度的 x 或 y 分量

像这样(简化):

public class Game {
  
  private Ball ball;
  
  public void spawnBall() {
    ball = new Ball();
    ball.velocity = new Vector2(Math.random(), Math.random()); // init with a random vector
  }

  public void moveBall() {
    ball.position = ball.position.add(ball.velocity); // move the ball by it's velocity
  }

  public void changeBallDirection() {
    if (ballHitPlayerBar()) {
      ball.velocity.x *= -1; // invert x direction
    }
    else if (ballHitTopOrBottomOfField()) {
      ball.velocity.y *= -1; // invert y direction
    }

    // TODO maybe move the ball a bit, to prevent it from touching the bar or the field border multiple times...
  }
}