如何将移动球的速度设置为一定范围的速度(Java)

时间:2019-04-17 03:17:59

标签: java loops user-interface

我正在编写一个处理球/粒子运动的程序。我想对逻辑进行编程,以使“热”球每秒移动4厘米至6厘米,而“冷”球每秒移动2厘米至4厘米。如何使用每厘米的像素(113 / 2.54)(其中113是我的每英寸屏幕分辨率)来设置速度?

我只是对球的vx和vy值使用固定的数字。

这是我的Ball构造函数

[pivot]

这是我的游戏循环

public Ball(Side s, Color color) { //Side character used to determine if ball should spawn on left or right side.

        //makeRandom method gives positive or negative direction for each ball
        if (color == Color.RED){
            this.vx = 8 * makeRandom(); 
            this.vy = 8 * makeRandom();
        } else {
            this.vx = 5 * makeRandom();
            this.vy = 5 * makeRandom();
        }

        speed = Math.sqrt(Math.pow(this.vx, 2)+Math.pow(this.vy, 2));

        //position is randomized for each ball 
        if(s == Side.LEFT) {
            this.x = leftSideBallX + (int) (50 * Math.random());
            this.y = leftSideBallY + (int) (50 * Math.random()); 
        } else {
            this.x = rightSideBallX + (int) (50 * Math.random());
            this.y = rightSideBallY + (int) (50 * Math.random());
        }

    }

1 个答案:

答案 0 :(得分:0)

如果您确实希望速度在一定范围内(而不是x和y速度),则需要分别生成速度和方向。目前,您分别生成x和y速度,这将为您提供更大范围的组合速度。这需要一些基本的触发。

我建议将模型的值与用户界面注意事项分开(例如,从cms转换为#pixels。我还建议封装您的热量概念。

class Ball {
    private float angle;
    private float speed;

    public Ball(Random random, Heat heat) {
        this.angle = random.nextFloat(Math.PI * 2);
        this.speed = heat.randomSpeed(random);
    }

    public float xVelocity() {
        return speed * Math.cos(angle);
    }

    public float yVelocity() {
        return speed * Math.sin(angle);
    }
}

class ScreenConverter {
    private static final float PIXELS_PER_CM = 113f/2.54f;

    public float pixelsToDistance(int pixels) {
        return pixels * PIXELS_PER_CM;
    }

    public int distanceToPixels(float distanceInCMs) {
        return int(distanceInCM / PIXELS_PER_CM);
    }
}