我正在
Java中实现一个游戏,使用下面显示的类来控制游戏逻辑.解释我的问题时,我会很清楚.
> GamePanel
>我使用这个类来启动一个线程游戏循环(只有游戏循环)
public void run() { init(); //initialize gamePanel components // game loop while (running) { start = System.nanoTime(); gameManager.update(); KeyInput.update(); MouseInput.update(); gameManager.draw(graphic); Graphics g2 = getGraphics(); g2.drawImage(image,null); g2.dispose(); elapsed = System.nanoTime() - start; wait = targetTime - elapsed / 1000000; if (wait < 0) wait = 5; try { Thread.sleep(wait); } catch (Exception e) { e.printStackTrace(); } }
> GameManager
>我把这个类控制在游戏的每个方面(更新,图形)
private void loadState(int state) { if (state == States.MENU.getValue()) gameState = new Menu(this); else if (state == States.GAME.getValue()) gameState = new Game(this); else if (state == States.PATHSELECT.getValue()) gameState = new SelectPath(this); } public void update() { if (gameState != null) gameState.update(); } public void draw(java.awt.Graphics2D graphic) { if (gameState != null) gameState.draw(graphic); else { JOptionPane.showMessageDialog(null,JOptionPane.ERROR_MESSAGE); } }
>游戏
> GameState是一个抽象类,它接收作为构造函数参数的GameManager实例,并且它在每个GameState(Menu,Game,MultiPlayer等)中实现了抽象方法.
>这个类有这些抽象方法:
> controller() – >验证状态逻辑
> update() – >在currentState是MultyPlayer的情况下,此方法调用类Player的更新方法等…
> draw(Graphics g) – >绘制来显示当前状态的对象
我想到了一个实现类单个实现每个状态的所有draw()
但是将它们全部插入到一个类中是非常讨厌的.
例:
而不是调用gameState.draw(图形);我调用Render.getRenderInstance().draw(graphic,gameState);
这个解决方案有效,但我不喜欢.
那么如何将draw方法和逻辑的其余部分分开呢?
一些忠告?谢谢.
解决方法
通常的做法是将游戏分为两部分:
>逻辑,在你的情况下看起来可以做好
>场景,画的东西
这里伪码是我如何做的:
the main loop: gamestate.update() scene.render();
在现场你应该拥有所有的图形操作.您应该能够使用类似于此的调用将新图形添加到场景中:
scene.addObject(SomeGraphic graphic);
所以现场将渲染该图形每个主循环迭代.
为了实现这一点,您应该在Scene类中保留一个列表或另一个集合,并将每个对象都刻录在一起.所以实际的scene.render()会像这样:
public void render() { for(SomeGraphic graphic : objects) { graphic.draw() } }