Libgdx - 具有延迟的随机颜色变化

时间:2014-09-11 21:35:38

标签: java android libgdx

所以我在游戏中遇到了这个问题,我正在努力练习,而我正在努力解决的问题之一就是红色,绿色,蓝色,黄色这四种颜色之间的随机颜色变化。我的目标是让这个球在四种颜色之间转换时在屏幕周围反弹,但我希望在交换颜色之间有一个延迟或暂停,比如至少3或5秒。到目前为止在代码中球似乎发生了变化但是没有延迟我尝试使用一些延迟方法,如Timer.Schedule但是eveytime我用这个球在屏幕周围反弹但是它全黑,没有颜色我真的很感激任何帮助?我觉得这样的问题很愚蠢,因为我觉得这可能是个小问题。

public class Play implements Screen {   
Game game;

private Rectangle field = new Rectangle();
private Ball ball = new Ball();
private Paddle paddle1 = new Paddle(), paddle2 = new Paddle();  
private ShapeRenderer ballRenderer, paddleRenderer;
private float fieldTop, fieldBottom, fieldRight, fieldLeft;
private Color ballColor = new Color();
private Random rnd = new Random();

public Play(Game game){
    this.game = game;
}


@Override
public void render(float delta) {
    float dt = Gdx.graphics.getRawDeltaTime();
    update(dt);
    draw(dt);

}

private void update(float dt) {
    updateBall(dt);
    updatepaddle1(dt);
}

private void updatepaddle1(float dt) {
    boolean moveLeft = false, moveRight = false;
    if(Gdx.input.isTouched()){
        moveLeft = true;
        moveRight = false;
    }
    if(Gdx.input.isTouched()){
        moveRight = true;
        moveLeft = false;
    }

    if(moveRight){
        paddle1.setVelocity(350f, 0f);
    }else if(moveLeft){
        paddle1.setVelocity(-350f, 0f);
    }else{
        paddle1.setVelocity(0, 0);
    }

    paddle1.Intergrate(dt);

}


private void updateBall(float dt) {
    // TODO Auto-generated method stub
    ball.Intergrate(dt);
    ball.updateBounds();

    if(ball.left() < fieldLeft){
        ball.move(fieldLeft, ball.getY());
        ball.reflect(true, false);
    }

    if(ball.right() > fieldRight){
        ball.move(fieldRight - ball.getWidth(), ball.getVelocityX());
        ball.reflect(true, false);
    }

    if(ball.bottom() < fieldBottom){
        ball.move(ball.getX(), fieldBottom);
        ball.reflect(false, true);
    }

    if(ball.top() > fieldTop){
        ball.move(ball.getX(), fieldTop - ball.getHeight());
        ball.reflect(false, true);
    }
}


public void reset(){
    ball.move(field.x + (field.width - ball.getWidth()) / 2, field.y + (field.height - ball.getHeight()) / 2);
    Vector2 velocity = ball.getVelocity();
    velocity.set(330f, 0f);
    velocity.setAngle(360f-45f);
    ball.setVelocity(velocity);

    //set paddle
    paddle1.move(field.x + (field.width * .4f), 0);
    paddle2.move(field.x + (field.width * .4f), field.y + (field.height - paddle1.getHeight()));
}


private void draw(float dt) {
    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    paddleRenderer.begin(ShapeType.Filled);
    drawPaddles(dt);
    paddleRenderer.end();


    ballRenderer.begin(ShapeType.Filled);
    ballColorSwap(ballColor);
    drawBall(dt);
    ballRenderer.end();

}


private void drawPaddles(float dt) {
    paddleRenderer.rect(paddle1.getX(), paddle1.getY(), paddle1.getWidth(), paddle1.getHeight());
    paddleRenderer.rect(paddle2.getX(), paddle2.getY(), paddle2.getWidth(), paddle2.getHeight());
}


int THRESHOLD = 4000;
long lastChanged = 0;
private void ballColorSwap(Color ballColor){
    int rnd = (int)(Math.random() * 4);
    if(rnd == 1){
        ballColor.set(Color.RED);
        }
        if(rnd == 2){
            ballColor.set(Color.BLUE);
        }
        if(rnd == 3){
            ballColor.set(Color.GREEN);
        }
        if(rnd == 4){
            ballColor.set(Color.YELLOW);
        }
        lastChanged = System.currentTimeMillis();
    }


private void drawBall(float dt) {
    if(System.currentTimeMillis() - lastChanged > THRESHOLD)
        ballColorSwap(ballColor);

    ballRenderer.circle(ball.getX(), ball.getY(), 20);
    ballRenderer.setColor(ballColor);

}



@Override
public void resize(int width, int height) {

}

@Override
public void show() {
field.set(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
fieldLeft = field.x;
fieldRight = field.x + field.width;
fieldBottom = field.y;
fieldTop = field.y + field.height;
paddleRenderer = new ShapeRenderer();
ballRenderer = new ShapeRenderer();
reset();    

}

@Override
public void hide() {
}

@Override
public void pause() {
}

@Override
public void resume() {

}

@Override
public void dispose() {

}

}

1 个答案:

答案 0 :(得分:0)

你能再添加一个变量来保存时间戳吗?

int THRESHOLD = 4000; // 4 seconds
long lastChanged = 0; // timestamp
public void ballColorSwap(){
    // maybe call it here?
    if(System.currentTimeMillis() - lastChanged < THRESHOLD)
        return;
    int rnd = (int)(Math.random() * 4);
    if(rnd == 1){
        ballColor.set(Color.RED);
    }
    if(rnd == 2){
        ballColor.set(Color.BLUE);
    }
    if(rnd == 3){
        ballColor.set(Color.GREEN);
    }
    if(rnd == 4){
        ballColor.set(Color.YELLOW);
    }
    // set the timestamp
    lastChanged = System.currentTimeMillis();
}
private void drawBall(float dt) {
    ballRenderer.circle(ball.getX(), ball.getY(), 20);
    ballRenderer.setColor(ballColor);
}

注意:我还没有测试过这段代码。它可能需要一些修改,但希望你能得到这个想法。