Java 如何将状态添加到游戏中?
在我当前的游戏中,应该有不同的状态,例如,当我在游戏主菜单中时,状态将变为“主菜单”,如果我在游戏(游戏)中,状态将变为“游戏” 现在它只是开始游戏,而不是主菜单。所以我的问题是,我如何才能添加它,使它以应有的方式工作 编辑:我当然希望游戏在主菜单状态下开始,以防不清楚:),然后按“播放”开始游戏,“退出”退出或“选项”等等 编辑2:第一个代码具有非工作状态功能。底部的代码有一个Statefunction可以工作。为什么我不能让它为第一个代码工作 代码:Java 如何将状态添加到游戏中?,java,awt,state,Java,Awt,State,在我当前的游戏中,应该有不同的状态,例如,当我在游戏主菜单中时,状态将变为“主菜单”,如果我在游戏(游戏)中,状态将变为“游戏” 现在它只是开始游戏,而不是主菜单。所以我的问题是,我如何才能添加它,使它以应有的方式工作 编辑:我当然希望游戏在主菜单状态下开始,以防不清楚:),然后按“播放”开始游戏,“退出”退出或“选项”等等 编辑2:第一个代码具有非工作状态功能。底部的代码有一个Statefunction可以工作。为什么我不能让它为第一个代码工作 代码: 打包游戏。窗口; 导入java.awt.
打包游戏。窗口;
导入java.awt.Canvas;
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.image.BufferStrategy;
导入java.awt.image.buffereImage;
导入java.util.Random;
导入Game.Framework.AudioPlayer;
导入Game.Framework.KeyInput;
导入Game.Framework.ObjectId;
导入Game.Framework.Texture;
导入Game.Interfaces.main菜单;
导入Game.Objects.Block;
导入Game.Objects.Player;
公共类游戏扩展画布实现可运行{
私有静态最终长serialVersionUID=-32588900033988871268L;
私有布尔运行=false;
私有线程;
公共静态int宽度、高度;
//缓冲“级别”和“背景”
私有缓冲区映像级别=null,背景=null;
处理者;
摄像机;
静态纹理纹理;
Random rand=新的Random();
公共枚举状态{
主菜单,
游戏
};
公共静态游戏状态=STATE.main菜单;
公共void init(){
宽度=getWidth();
高度=getHeight();
AudioPlayer.load();
AudioPlayer.getMusic(“music”).loop();
tex=新纹理();
BufferedImageLoader=新的BufferedImageLoader();
Level=loader.loadImage(“/Level.png”);//加载图像“Level”
Background=loader.loadImage(“/Background.png”);//加载图像“Background”
handler=新的handler();
cam=新摄像头(0,0);
LoadImageLevel(级别);
this.addKeyListener(新的KeyInput(handler,null));
}
公共同步的void start(){
如果(正在运行)
返回;
运行=真;
线程=新线程(此);
thread.start();
}
//循环游戏
公开募捐{
init();
this.requestFocus();
long lastTime=System.nanoTime();
双amountOfTicks=60.0;
双ns=1000000000/个;
双增量=0;
长定时器=System.currentTimeMillis();
int=0;
int帧=0;
(跑步时){
long now=System.nanoTime();
增量+=(现在-上次)/ns;
上次=现在;
而(增量>=1){
勾选();
更新++;
三角洲--;
}
render();
frames++;
if(System.currentTimeMillis()-计时器>1000){
定时器+=1000;
System.out.println(“FPS:+frames+”-勾号:+updates);
帧=0;
更新=0;
}
}
}
私人空白勾号(){
if(Game.gameState==STATE.Game){
handler.tick();
}else if(Game.gameState==STATE.main菜单){
//main menu.tick();
}
对于(int i=0;i>16)和0xff;
绿色整数=(像素>>8)&0xff;
蓝色整数=(像素)&0xff;
if(红色==255&&绿色==255&&蓝色==255)handler.addObject(新块(xx*32,yy*32,0,ObjectId.Block));
if(红色==0&&绿色==255&&蓝色==0)handler.addObject(新块(xx*32,yy*32,1,ObjectId.Block));
if(红色==0&&绿色==38&&蓝色==255)handler.addObject(新播放器(xx*32,yy*32,handler,ObjectId.Player));
}
}
}
公共静态纹理getInstance(){
返回tex;
}
}
主菜单:
package Game.Interfaces;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import Game.Framework.AudioPlayer;
import Game.Window.Game;
import Game.Window.Game.STATE;
import Game.Window.Handler;
public class MainMenu extends MouseAdapter{
private Game game;
private Handler handler;
public MainMenu(Game game, Handler handler){
this.game = game;
this.handler = handler;
}
public void mousePressed(MouseEvent e){
int mx = e.getX();
int my = e.getY();
if(Game.gameState == STATE.MainMenu){
if(mouseOver(mx, my, 10, 10, 50, 50)){
AudioPlayer.getSound("menu_sound").play();
Game.gameState = STATE.Game;
return;
}
}
}
public void mouseReleased(MouseEvent e){
}
private boolean mouseOver(int mx, int my, int x, int y, int WIDTH, int HEIGHT){
if(mx > x && mx < x + WIDTH){
if(my > y && my < y + HEIGHT){
return true;
}else return false;
}else return false;
}
public void tick(){
}
public void render(Graphics g){
if(Game.gameState == STATE.MainMenu){
Font fnt1 = new Font("Arial", 1, 50);
g.setFont(fnt1);
g.setColor(Color.WHITE);
g.drawRect(10, 10, 100, 100);
g.drawString("Main Menu", 10, 10);
}
}
}
打包游戏。界面;
导入java.awt.Color;
导入java.awt.Font;
导入java.awt.Graphics;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入Game.Framework.AudioPlayer;
导入Game.Window.Game;
导入Game.Window.Game.STATE;
导入Game.Window.Handler;
公共类主菜单扩展了MouseAdapter{
私人游戏;
私人经办人;
公共主菜单(游戏、处理程序){
这个游戏=游戏;
this.handler=h
package Game.Interfaces;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import Game.Framework.AudioPlayer;
import Game.Window.Game;
import Game.Window.Game.STATE;
import Game.Window.Handler;
public class MainMenu extends MouseAdapter{
private Game game;
private Handler handler;
public MainMenu(Game game, Handler handler){
this.game = game;
this.handler = handler;
}
public void mousePressed(MouseEvent e){
int mx = e.getX();
int my = e.getY();
if(Game.gameState == STATE.MainMenu){
if(mouseOver(mx, my, 10, 10, 50, 50)){
AudioPlayer.getSound("menu_sound").play();
Game.gameState = STATE.Game;
return;
}
}
}
public void mouseReleased(MouseEvent e){
}
private boolean mouseOver(int mx, int my, int x, int y, int WIDTH, int HEIGHT){
if(mx > x && mx < x + WIDTH){
if(my > y && my < y + HEIGHT){
return true;
}else return false;
}else return false;
}
public void tick(){
}
public void render(Graphics g){
if(Game.gameState == STATE.MainMenu){
Font fnt1 = new Font("Arial", 1, 50);
g.setFont(fnt1);
g.setColor(Color.WHITE);
g.drawRect(10, 10, 100, 100);
g.drawString("Main Menu", 10, 10);
}
}
}
package Game;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import java.util.Random;
public class Game extends Canvas implements Runnable{
private static final long serialVersionUID = 7364682855700581664L;
public static final int WIDTH = 800, HEIGHT = WIDTH / 12 * 9;
private Thread thread;
private boolean running = false;
public static boolean paused = false;
public int diff = 0;
// 0 = EASY
// 1 = NORMAL
// 2 = HARD
private Random r;
private Handler handler;
private HUD hud;
private Spawner spawner;
private Menu menu;
public enum STATE {
Menu,
Options,
Game,
Select,
Lose
};
public static STATE gameState = STATE.Menu;
public Game(){
hud = new HUD();
handler = new Handler();
menu = new Menu(this, handler, hud);
this.addKeyListener(new KeyInput(handler, this));
this.addMouseListener(menu);
AudioPlayer.load();
AudioPlayer.getMusic("music").loop();
new Window(WIDTH, HEIGHT, "Test Game", this);
spawner = new Spawner(handler, hud, this);
r = new Random();
if(gameState == STATE.Game){
handler.addObject(new Player(WIDTH/2-32, HEIGHT/2-32, ID.Player, handler));
handler.addObject(new BasicEnemy(r.nextInt(Game.WIDTH - 50), r.nextInt(Game.HEIGHT - 50), ID.BasicEnemy, handler));
}
}
public synchronized void start(){
thread = new Thread(this);
thread.start();
running = true;
}
public synchronized void stop(){
try{
thread.join();
running = false;
}catch(Exception e){
e.printStackTrace();
}
}
public void run(){
this.requestFocus();
long lastTime = System.nanoTime();
double amountOfTicks = 60.0;
double ns = 1000000000 / amountOfTicks;
double delta = 0;
long timer = System.currentTimeMillis();
int frames = 0;
while(running){
long now = System.nanoTime();
delta += (now - lastTime) / ns;
lastTime = now;
while(delta >= 1){
tick();
delta--;
}
if(running)
render();
frames++;
if(System.currentTimeMillis() - timer > 1000){
timer += 1000;
System.out.println("FPS: " + frames);
frames = 0;
}
}
stop();
}
private void tick(){
if(gameState == STATE.Game){
if(!paused){
hud.tick();
spawner.tick();
handler.tick();
if(HUD.PlayerHealth < 1){
HUD.PlayerHealth = 100;
//hud.setLevel(1);
//hud.setScore(0);
gameState = STATE.Lose;
handler.clearEnemies();
}
}
}else if(gameState == STATE.Menu || gameState == STATE.Lose || gameState == STATE.Select){
menu.tick();
handler.tick();
}
}
private void render(){
BufferStrategy bs = this.getBufferStrategy();
if(bs == null){
this.createBufferStrategy(3);
return;
}
Graphics g = bs.getDrawGraphics();
g.setColor(Color.BLACK);
g.fillRect(0, 0, WIDTH, HEIGHT);
handler.render(g);
if(paused){
g.setColor(Color.RED);
g.drawString("PAUSED", 370, 260);
}
if(gameState == STATE.Game){
hud.render(g);
}else if(gameState == STATE.Menu || gameState == STATE.Options || gameState == STATE.Lose || gameState == STATE.Select){
menu.render(g);
}
g.dispose();
bs.show();
}
public static float clamp(float var, float min, float max){
if(var >= max)
return var = max;
else if(var <= min)
return var = min;
else
return var;
}
public static void main(String args[]){
new Game();
}
}