我用 Java 和 Slick 制作了这个 2D 游戏。问题似乎出在这段代码中:
public void initRedAndBlueBall() throws SlickException
{
// Makes sure the red and the blue ball aren't too close
for(int i = 0; i <= amountOfEatenBalls; i++)
{
// Get random cordinates for the red and blue ball.
randomRedX[i] = random.nextInt(550) + 24;
randomRedY[i] = random.nextInt(350) + 24;
randomBlueX = random.nextInt(550) + 24;
randomBlueY = random.nextInt(350) + 24;
// Initialize the new Redball with a picture.
redball[i] = new Image("res/RedBall.png");
// Draws the red ball on the screen.
drawRedBall(randomRedX[i], randomRedY[i], redball[i]);
if(isInTheRangeOf(randomRedX[i], randomBlueX, 30) == false)
{
System.out.println("The red and the blue ball have good positions");
break;
}
else if(isInTheRangeOf(randomRedX[i], randomBlueX, 30) == true)
{
System.out.println("The red and the blue ball are to close!");
System.out.println("Repositioning the red and blue ball");
}
}
}
这是我的所有代码:
游戏.java
package javagame;
import org.newdawn.slick.*;
import org.newdawn.slick.state.*;
public class Game extends StateBasedGame
{
public static final String gamename = "Mini Game";
public static final int menu = 0;
public static final int play = 1;
public static final int gameOver = 2;
public static final int windowX = 600;
public static final int windowY = 400;
public Game(String gamename)
{
super(gamename);
this.addState(new Menu(menu));
this.addState(new Play(play));
this.addState(new GameOver(gameOver));
}
public void initStatesList(GameContainer gc) throws SlickException
{
this.getState(menu).init(gc, this);
this.getState(play).init(gc, this);
this.enterState(menu);
}
public static void main(String[] args)
{
AppGameContainer appgc;
try
{
appgc = new AppGameContainer(new Game(gamename));
appgc.setDisplayMode(windowX, windowY, false);
appgc.start();
}
catch(SlickException e)
{
e.printStackTrace();
}
}
}
菜单.java
package javagame;
import org.lwjgl.input.Mouse;
import org.newdawn.slick.*;
import org.newdawn.slick.state.*;
import org.newdawn.slick.MouseListener;
public class Menu extends BasicGameState
{
Image PlayNow, PlayNowHover, ExitGame, ExitGameHover, PlayButton, ExitGameButton;
int MousePosX;
int MousePosY;
public Menu(int state) {}
public void init(GameContainer gc, StateBasedGame sbg) throws SlickException
{
// Billederne er 125x26
PlayNow = new Image("res/PlayNow.png");
PlayNowHover = new Image("res/PlayNowHover.png");
ExitGame = new Image("res/ExitGame.png");
ExitGameHover = new Image("res/ExitGameHover.png");
PlayButton = PlayNow;
ExitGameButton = ExitGame;
}
public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws SlickException
{
// Framet er 600x400
g.drawString(MousePosX + ", " + MousePosY, 500, 10);
g.drawLine(0, 26, 600, 26);
g.drawImage(PlayButton, 200, 100);
g.drawImage(ExitGameButton, 200, 150);
g.drawString("You move with the arrowkeys.", 200, 200);
g.drawString("There's 1 rule:", 200, 215);
g.drawString("Don't eat the red balls!", 200, 230);
g.drawString("But you can enjoy the blue ones :- P", 200, 245);
}
public void update(GameContainer gc, StateBasedGame sbg, int delta) throws SlickException
{
Input input = gc.getInput();
MousePosX = input.getMouseX();
MousePosY = input.getMouseY();
// PlayNow Hover or Normal
if(MousePosX > 200 && MousePosX < 325 && MousePosY > 100 && MousePosY < 126)
{
PlayButton = PlayNowHover;
}
else
{
PlayButton = PlayNow;
}
//ExitGame Hover or Normal
if(MousePosX > 200 && MousePosX < 325 && MousePosY > 150 && MousePosY < 176)
{
ExitGameButton = ExitGameHover;
}
else
{
ExitGameButton = ExitGame;
}
// Now the buttons have a function
if(MousePosX > 200 && MousePosX < 325 && MousePosY > 100 && MousePosY < 126)
{
if(Mouse.isButtonDown(0))
{
sbg.enterState(1);
}
}
if(MousePosX > 200 && MousePosX < 325 && MousePosY > 150 && MousePosY < 176)
{
if(Mouse.isButtonDown(0))
{
System.exit(0);
}
}
}
public int getID()
{
return 0;
}
}
播放.java
package javagame;
import org.newdawn.slick.*;
import org.newdawn.slick.state.*;
import java.util.Random;
public class Play extends BasicGameState
{
Image ball, blueball;
Image[] redball;
Animation roll;
int[] duration = {200, 200};
float defBallPosX = 300; // DEFAULT
float defBallPosY = 200; // DEFAULT
float ballPosX = 300;
float ballPosY = 200;
int MousePosX;
int MousePosY;
Random random;
float[] randomRedX; // X for the RedBall.png
float[] randomRedY; // Y for the RedBall.png
float randomBlueX; // X for the BlueBall.png
float randomBlueY; // Y for the BlueBall.png
static int amountOfEatenBalls;
boolean blueAndRedAreNotToClose;
public Play(int state)
{
}
public void init(GameContainer gc, StateBasedGame sbg) throws SlickException
{
ball = new Image("res/PurpBallNorm.png"); // 25x25 px
Image[] images = {ball, ball};
redball = new Image[50];
blueball = new Image("res/BlueBall.png");
roll = new Animation(images, duration, false);
random = new Random();
randomRedX = new float[50];
randomRedY = new float[50];
amountOfEatenBalls = 0;
}
public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws SlickException
{
// The Window is 600x400
g.drawString(MousePosX + ", " + MousePosY, 500, 10);
g.drawLine(0, 26, Game.windowX, 26); // Ceiling
g.drawLine(1, 26, 1, Game.windowY); // Left Wall
g.drawLine(Game.windowX - 2, 26, Game.windowX - 2, Game.windowY - 2); // Right Wall
g.drawLine(1, Game.windowY - 2, Game.windowX - 2, Game.windowY - 2); // Floor
roll.draw(ballPosX, ballPosY);
initRedAndBlueBall();
}
public void update(GameContainer gc, StateBasedGame sbg, int delta) throws SlickException
{
Input input = gc.getInput();
MousePosX = input.getMouseX();
MousePosY = input.getMouseY();
if(input.isKeyDown(Input.KEY_UP))
ballPosY -= delta * .1f;
else if(input.isKeyDown(Input.KEY_DOWN))
ballPosY += delta * .1f;
else if(input.isKeyDown(Input.KEY_LEFT))
ballPosX -= delta * .1f;
else if(input.isKeyDown(Input.KEY_RIGHT))
ballPosX += delta * .1f;
blueBallTouch();
for(int i = 0; i <= amountOfEatenBalls; i++)
{
if(isInTheRangeOf(ballPosX, randomRedX[i], 25) == true && isInTheRangeOf(ballPosY, randomRedY[i], 25) == true)
{
System.out.println("Player has eaten a red ball!");
sbg.enterState(2);
}
}
// Makes sure the ball can't run out of the window
if(ballPosX <= 2)
{
ballPosX += delta * .1f;
}
else if(ballPosX >= Game.windowX - 27)
{
ballPosX -= delta * .1f;
}
else if(ballPosY <= 26)
{
ballPosY += delta * .1f;
}
else if(ballPosY >= Game.windowY - 27)
{
ballPosY -= delta * .1f;
}
}
public int getID()
{
return 1;
}
public boolean isInTheRangeOf(float x, float y, float range)
{
float a = 0;
float b = 0;
if(x > y)
{
a = x;
b = y;
}
else if(y > x)
{
b = x;
a = y;
}
if((a - b) <= range)
{
return true;
}
else if((a - b) >= range)
{
return false;
}
return true;
}
public void initRedAndBlueBall() throws SlickException
{
// Makes sure the red and the blue ball aren't too close
for(int i = 0; i <= amountOfEatenBalls; i++)
{
// Get random cordinates for the red and blue ball.
randomRedX[i] = random.nextInt(550) + 24;
randomRedY[i] = random.nextInt(350) + 24;
randomBlueX = random.nextInt(550) + 24;
randomBlueY = random.nextInt(350) + 24;
// Initialize the new Redball with a picture.
redball[i] = new Image("res/RedBall.png");
// Draws the red ball on the screen.
drawRedBall(randomRedX[i], randomRedY[i], redball[i]);
if(isInTheRangeOf(randomRedX[i], randomBlueX, 30) == false)
{
System.out.println("The red and the blue ball have good positions");
break;
}
else if(isInTheRangeOf(randomRedX[i], randomBlueX, 30) == true)
{
System.out.println("The red and the blue ball are to close!");
System.out.println("Repositioning the red and blue ball");
}
}
}
public void drawRedBall(float x, float y, Image image)
{
Graphics g = new Graphics();
g.drawImage(image, x, y);
}
public void blueBallTouch() throws SlickException
{
if(isInTheRangeOf(ballPosX, randomBlueX, 25) == true && isInTheRangeOf(ballPosY, randomBlueY, 25) == true)
{
amountOfEatenBalls++;
initRedAndBlueBall();
}
else
{
}
}
public static int getAmountOfEatenBalls()
{
return amountOfEatenBalls;
}
}
GameOver.java
package javagame;
import org.lwjgl.input.Mouse;
import org.newdawn.slick.*;
import org.newdawn.slick.state.*;
public class GameOver extends BasicGameState
{
Image ExitGame, ExitGameHover, ExitGameButton;
int MousePosX;
int MousePosY;
public GameOver(int state)
{
}
public void init(GameContainer gc, StateBasedGame sbg) throws SlickException
{
ExitGame = new Image("res/ExitGame.png");
ExitGameHover = new Image("res/ExitGameHover.png");
ExitGameButton = ExitGame;
}
public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws SlickException
{
g.drawImage(ExitGameButton, 200, 100);
g.drawString("You've eaten: " + Play.getAmountOfEatenBalls() + " balls!", 200, 190);
}
public void update(GameContainer gc, StateBasedGame sbg, int delta) throws SlickException
{
Input input = gc.getInput();
MousePosX = input.getMouseX();
MousePosY = input.getMouseY();
if(MousePosX > 200 && MousePosX < 325 && MousePosY > 100 && MousePosY < 126)
{
ExitGameButton = ExitGameHover;
}
else
{
ExitGameButton = ExitGame;
}
if(MousePosX > 200 && MousePosX < 325 && MousePosY > 100 && MousePosY < 126)
{
if(Mouse.isButtonDown(0))
{
System.exit(0);
}
}
}
public int getID()
{
return 2;
}
}
- 这是我第一次使用stackoverflow,所以如果这完全不可读,请告诉我我应该做什么而不是上传所有代码..
提前致谢!