Slick2d を使用して、キャラクター「ラリー」が事前定義されたサイズのマップの周りに「ボックス」を押すゲームを作成しています。エンティティの上に絵を描いて、エンティティが移動したときにその位置を更新するのに問題はありません。
私の主な問題は、衝突検出方法で動きを止める方法が見つからないことです。現在、衝突が検出されても何も起こりません。動きのステートメントで衝突検出方法を直接使用しようとすると、Eclipse でエンティティがないと表示されます。
public abstract class Entity {
protected int x, y, w, h, dx, dy;
public Entity(int x, int y) {
this.x = x;
this.y = y;
dx = 0;
dy = 0;
w = 32;
h = 32;
}
public void render(GameContainer gc, Graphics g) throws SlickException {
}
public void update(GameContainer gc, int delta) throws SlickException {
/*x += dx;
y += dy;*/
}
public boolean isLeftCollision(Entity entity) {
if (this.x == entity.x && this.y == entity.y) {
return true;
} else {
return false;
}
}
public boolean isRightCollision(Entity entity) {
if (this.x + this.w == entity.x && this.y == entity.y) {
return true;
} else {
return false;
}
}
public boolean isTopCollision(Entity entity) {
if (this.y == entity.y && this.x == entity.x) {
return true;
} else {
return false;
}
}
public boolean isBottomCollision(Entity entity) {
if (this.y + this.h == entity.y && this.x == entity.x) {
return true;
} else {
return false;
}
}
}
public class Larry extends Entity{
Image player;
float speed = 0.2f;
public Larry(float x, float y) {
super((int) x, (int) y);
w = 32;
h = 32;
}
public void render(GameContainer gc, Graphics g) throws SlickException{
super.render(gc, g);
player = new Image("res/char/LarryUP.png");
g.drawImage(player, x, y);
g.drawString("Characters X: " + x + "\nCharacters Y: " + y, speed,
speed);
}
public void update(GameContainer gc, int delta) throws SlickException{
super.update(gc, delta);
Input input = gc.getInput();
//move right
if (input.isKeyDown(Input.KEY_RIGHT)) {
x += speed * delta;
if (x > 782) {
x -= speed * delta;
}
}
//move left
if (input.isKeyDown(Input.KEY_LEFT)) {
x -= speed * delta;
if (x < 0) {
x += speed * delta;
}
}
//move down
if (input.isKeyDown(Input.KEY_DOWN)) {
y += speed * delta;
if (y > 585) {
y -= speed * delta;
}
}
//move up
if (input.isKeyDown(Input.KEY_UP)) {
y -= speed * delta;
if (y < 0) {
y += speed * delta;
}
}
}
public class PlayState extends BasicGameState {
int stateID = 3;
Image background;
Larry larry;
Packages box;
float x = 400.0f;
float y = 300.0f;
float speed = 0.2f;
boolean quit = false;
public PlayState(int stateID) {
this.stateID = stateID;
}
@Override
public void init(GameContainer gc, StateBasedGame sbg1)
throws SlickException {
background = new Image("background.jpg");
larry = new Larry(400,300);
box = new Packages(150,300);
}
@Override
public void render(GameContainer gc, StateBasedGame sbg, Graphics g)
throws SlickException {
// TODO Auto-generated method stub
g.drawImage(background, 0, 0);
larry.render(gc, g);
box.render(gc, g);
if (quit == true) {
g.drawString("Resume (R)", 250, 100);
g.drawString("Main Menu (M)", 250, 125);
g.drawString("Quit Game (Q)", 250, 150);
if (quit == false) {
g.clear();
}
}
}
@Override
public void update(GameContainer gc, StateBasedGame sbg, int delta)
throws SlickException {
// TODO Auto-generated method stub
Input input = gc.getInput();
// escape
if (input.isKeyDown(Input.KEY_ESCAPE)) {
quit = true;
}
// when they hit escape
if (quit == true) {
if (input.isKeyDown(Input.KEY_R)) {
quit = false;
}
if (input.isKeyDown(Input.KEY_M)) {
sbg.enterState(0);
try {
Thread.sleep(250);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (input.isKeyDown(Input.KEY_Q)) {
System.exit(0);
}
}
larry.update(gc, delta);
box.update(gc, delta);
}
@Override
public int getID() {
// TODO Auto-generated method stub
return 3;
}
}
public class Packages extends Entity{
Image box;
float speed = 0.2f;
public Packages(int x, int y) {
super(x, y);
w = 32;
h = 32;
}
public void render(GameContainer gc, Graphics g) throws SlickException{
super.render(gc, g);
box = new Image("res/obj/box1.png");
g.drawImage(box, x, y);
}
public void update(GameContainer gc, int delta) throws SlickException{
super.update(gc, delta);
}
}
何かアイデアがある場合、または何かお手伝いできることがあれば、お知らせください。私は数日間オンラインで検索し、他の何人かと話しましたが、何が問題なのか具体的な考えを持っている人は誰もいないようです.