使用keypressed()方法的图像更改问题

时间:2019-04-05 08:46:52

标签: java processing

我正在尝试制作涂鸦跳跃游戏,目前我无法找到一种方法,可以将静止图像降落到地面后将其变为腿部图像,然后再变为静止图像。一方面可以做到这一点,但不能同时做到。我试过使用嵌套的if,但是它不能检测到按钮的按下。这是代码:

GameObject game;

PImage doodle;

void setup() {
  size(640, 800);
  smooth(4);
  frameRate(10);

  doodle = loadImage("https://i.imgur.com/ytwebph.png");
  game = new Doodle(new PVector(width/2, height-doodle.height*2), doodle);

  game.setWidthAndHeight(new PVector(width, height));
}
void draw() {

  background(200);
  game.display();
  game.move();
}

void keyPressed() {
  game.setMove(keyCode, true);
}

void keyReleased() {
  game.setMove(keyCode, false);
}

protected class Doodle extends GameObject {

  protected float velocityY, gravity, time;
  protected float groundPosition;
  protected int facing = 0; //0 = right; 1 = left

  protected Doodle(PVector position, PImage picture) {
    super(position, picture);
    gravity = 20;
    time = 0.4;
    velocityY = 35*gravity*time;
    super.setSpeed(10);

    groundPosition = position.y - picture.height;
  }

  public void move() {
    if (isRight || position.y < groundPosition) {
      this.picture = doodleImg[0];
      facing = 0;
    } else if (isLeft || position.y < groundPosition) {
      this.picture = doodleImg[2];
      facing = 1;
    }

    position.x = position.x + speed*(int(isRight) - int(isLeft));

    //border control
    if (position.x+picture.width/2 <= 0) {
      position.x = this.getWidthAndHeight().x-picture.width/2;
    } else if (position.x+picture.width/2 >= this.getWidthAndHeight().x) {
      position.x = 0-picture.width/2;
    }

    //jump
    velocityY -=  gravity * time;
    position.y -=  velocityY * time;
    if (position.y >  groundPosition) {
      if (facing == 0) {
        this.picture = doodleImg[1];
      } else if (facing == 1) {
        this.picture = doodleImg[3];
      }
      position.y =  groundPosition;
      velocityY = 35;
    }
  }
}

public class GameObject {
  public PVector position, widthAndHeight;
  public int size, speed;
  public PImage picture;
  public boolean  isLeft, isRight;

  public PImage[] doodleImg = new PImage[6];

  public GameObject(PVector position, PImage picture) {
    this.position = position;
    this.picture = picture;
    widthAndHeight = new PVector(0, 0);
    speed = 1;

    //0,1 right; 2,3 left; 4,5 shoot;
    doodleImg[0] = loadImage("https://i.imgur.com/ytwebph.png");
    doodleImg[1] = loadImage("https://i.imgur.com/Y0cFSFK.png");
    doodleImg[2] = loadImage("https://i.imgur.com/FL3IhU5.png");
    doodleImg[3] = loadImage("https://i.imgur.com/YuqWihj.png");
  }

  public void move() {
    position.x = 0;
  }

  public void display() {
    image(picture, position.x, position.y);
  }

  public boolean setMove(int keycode, boolean isPressed) {
    switch(keycode) {
    case LEFT:
      return isLeft = isPressed;

    case RIGHT:
      return isRight = isPressed;

    default:
      return isPressed;
    }
  }


  protected PVector getWidthAndHeight() {
    return widthAndHeight;
  }

  void setSpeed(int speed) {
    this.speed = speed;
  }


  public void setWidthAndHeight(PVector newWidthAndHeight) {
    widthAndHeight = newWidthAndHeight;
  }
}

1 个答案:

答案 0 :(得分:0)

首先根据facingisRight设置isLeft状态:

if (isRight) {
    facing = 0;
} else if (isLeft) {
    facing = 1;
}

根据facing的状态和垂直位置position.y设置图像:

if (position.y < groundPosition) {
    this.picture = doodleImg[facing==0 ? 0 : 2];
} else {
    this.picture = doodleImg[facing==0 ? 1 : 3];
}

public void move() {

    if (isRight) {
        facing = 0;
    } else if (isLeft) {
        facing = 1;
    }

    if (position.y < groundPosition) {
        this.picture = doodleImg[facing==0 ? 0 : 2];
    } else {
        this.picture = doodleImg[facing==0 ? 1 : 3];
    }

    position.x = position.x + speed*(int(isRight) - int(isLeft));

    //border control
    if (position.x+picture.width/2 <= 0) {
        position.x = this.getWidthAndHeight().x-picture.width/2;
    } else if (position.x+picture.width/2 >= this.getWidthAndHeight().x) {
        position.x = 0-picture.width/2;
    }

    //jump
    velocityY -=  gravity * time;
    position.y -=  velocityY * time;
    if (position.y >  groundPosition) {
        position.y =  groundPosition;
        velocityY = 35;
    }
}