libgdx - 无法确定我的物体移动?

时间:2014-09-26 18:08:58

标签: java android libgdx

我目前正在开发一个用于练习的Android项目,并且我无法通过触摸移动拨片,就像让它们从左向右滚动一样。我想过使用Gdx.input.isTouched但遗憾的是,根据我自己的经验,似乎没有任何建议或例子能够得到真正的体会吗?这就是我希望能够澄清的主题

private void updatePaddle2(float dt) {
    if(Gdx.input.isTouched(0)){
        paddle1.move(-350, 0);

        paddle1.Intergrate(dt);

    }


private void update(float dt) {


    //paddle update
    updatePaddle1(dt);
    updatePaddle2(dt);

}


private void resetRectangle(){
    paddle1.move((field.width * .5f), field.y + (field.height * .1f));
    paddle2.move((field.width * .5f), field.y + (field.height * .8f));
}

和桨的类

public class Paddle extends GameShare{

private ShapeRenderer paddleRenderer;
Color paddleColor = new Color();


protected Paddle() {
    super(100, 32);
}

public void paddleCreate(){
    paddleRenderer = new ShapeRenderer();

}

public void paddleRender(float dt){
    paddleRenderer.begin(ShapeType.Filled);
    paddleColorSwap(dt);
    drawPaddle(dt);
    paddleRenderer.end();
}

private void drawPaddle(float dt) {
    paddleRenderer.rect(this.getX(), this.getY(), this.getWidth(), this.getHeight());
    paddleRenderer.rect(this.getX(), this.getY(), this.getWidth(), this.getHeight());

}


int threshold = 7000;
long LastChanged = 0;
public void paddleColorSwap(float dt){
    if(System.currentTimeMillis() - LastChanged < threshold)
        return;
    int rnd = (int)(Math.random() * 6);
    switch(rnd){
    case 0: paddleColor.set(Color.GREEN);break;
    case 1: paddleColor.set(Color.BLUE);break;
    case 2: paddleColor.set(Color.RED);break;
    case 3: paddleColor.set(Color.YELLOW);break;
    case 4: paddleColor.set(Color.CYAN);break;
    case 5: paddleColor.set(Color.ORANGE);break;
    }
    LastChanged = System.currentTimeMillis();
    paddleRenderer.setColor(paddleColor);

}

}

和扩展类

public abstract class GameShare {

private Vector2 position = new Vector2(); 
private Vector2 velocity = new Vector2();
private Rectangle bounds = new Rectangle();


protected GameShare(int width, int height){
    bounds.setWidth(width);
    bounds.setHeight(height);
}

public Rectangle getBounds(){
    updateBounds();
    return bounds;
}

public void setBounds(Rectangle bounds){
    this.bounds = bounds;
}

public void  updateBounds(){
    bounds.set(position.x, position.y, bounds.width, bounds.height);
}

public float getX(){
    return position.x;
}

public float getY(){
    return position.y;
}

public float getVelocityX(){
    return velocity.x;
}

public float getVelocityY(){
    return velocity.y;
}


public Vector2 getPosition() {
    return position;
}



public void setPosition(Vector2 position) {
    this.position = position;
}


public Vector2 getVelocity() {
    return velocity;
}



public void setVelocity(Vector2 velocity) {
    this.velocity = velocity;
}

public float bottom(){
    return bounds.y;
}

public float getHeight(){
    return bounds.height;
}

public float getWidth(){
    return bounds.width;
}

public void Intergrate(float dt){
    position.add((velocity.x * dt), (velocity.y * dt));
}

public float left(){
    return bounds.x;
}

public void move(float x, float y){
    position.set(x, y);
}

public float right(){
    return bounds.x + bounds.width;
}

public void setVelocity(float x, float y){
    velocity.set(x, y);
}

public float top(){
    return bounds.y + bounds.height;
}

public void translate(float x, float y){
    position.add(x, y);
}

1 个答案:

答案 0 :(得分:0)

您的updatePaddle2方法在划线上调用moveTo,在您的代码中直接设置位置,因此它会立即将划线传送到-350个单位以外的新位置。然后你打电话给Intergrate,因为你没有在桨上设置速度,所以没有做任何事情。由于每帧都会调用updatePaddle2,因此您的划分可能会以每帧350个单位* 60 fps =每秒21,000个单位的速度从屏幕上飞出。

根据您尝试做的事情,您的方法应该看起来像这样,尽管似乎还有其他问题(比如为什么要在paddle1中更新updatePaddle2方法?)。

private void updatePaddle2(float dt) {
    if (Gdx.input.isTouched(0)){
        paddle2.setVelocity(-350, 0);
    } else {
        paddle2.setVelocity(0, 0);
    }

    paddle2.Intergrate(dt);
}

您需要更改GameShare类中的setVelocity方法,将x和y作为参数而不是新的Vector2。更换速度矢量而不仅仅是修改速度矢量是浪费的。

我还注意到,当您的GameShare课程中的职位更新时,您不会更新界限。当你开始使用边界时,这将导致问题。代码中修改位置的任何地方,边界&#39; x和y也应该更新以匹配。