gpt4 book ai didi

java - 在 update() void 中添加 if 语句时,图形不出现

转载 作者:行者123 更新时间:2023-12-02 06:51:01 29 4
gpt4 key购买 nike

我正在努力使用简单的 2D 游戏引擎创建我的第一个游戏。无论如何,每次我添加 if (input.KEY_RIGHT) x++; 时, Canvas 都不会加载。它仅显示 JPanel 的背景。但是当我 delted if (input.KEY_RIGHT) x++; 时,它会起作用。请让我知道为什么它不起作用。

package net.james222.game;

import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;


/**
* Main class for the game
*/
public class Game extends JFrame
{

public InputHandler input;

private static final long serialVersionUID = 1L;
boolean isRunning = true;
int fps = 30;
int windowWidth = 500;
int windowHeight = 500;

BufferedImage backBuffer;
Insets insets;

int x = 0;

public static void main(String[] args)
{
Game game = new Game();
game.run();
System.exit(0);
}

/**
* This method starts the game and runs it in a loop
*/
public void run()
{
initialize();

while(isRunning)
{
long time = System.currentTimeMillis();

update();
draw();

// delay for each frame - time it took for one frame
time = (1000 / fps) - (System.currentTimeMillis() - time);

if (time > 0)
{
try
{
Thread.sleep(time);
}
catch(Exception e){}
}
}

setVisible(false);
}

/**
* This method will set up everything need for the game to run
*/
void initialize()
{
setTitle("Game Tutorial");
setSize(windowWidth, windowHeight);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);

insets = getInsets();
setSize(insets.left + windowWidth + insets.right,
insets.top + windowHeight + insets.bottom);

backBuffer = new BufferedImage(windowWidth, windowHeight, BufferedImage.TYPE_INT_RGB);
}

/**
* This method will check for input, move things
* around and check for win conditions, etc
*/
void update()
{
if(input.KEY_RIGHT) x++;
}

/**
* This method will draw everything
*/
void draw()
{
Graphics g = getGraphics();

Graphics bbg = backBuffer.getGraphics();

bbg.setColor(Color.WHITE);
bbg.fillRect(0, 0, windowWidth, windowHeight);

bbg.setColor(Color.BLACK);
bbg.drawOval(x, 10, 20, 20);

g.drawImage(backBuffer, insets.left, insets.top, this);
}
}

最佳答案

Swing 的绘制通常是使用从 JComponent 扩展的组件(通常是 JPanel)的 paintComponent 方法来完成的

您永远不应该使用getGraphics。这只是上次绘制周期后组件状态的快照,如果组件尚未开始绘制,则可能返回 null。它的内容也将在下一个绘制周期被覆盖。

首先看一下

我还鼓励您使用 key bindings API over KeyListener (并不是说我可以看到您实际上使用任何类型的输入事件处理程序)...

我还鼓励您查看 Concurrency in SwingInitial Threads因为您违反了 Swing 的单线程模型。

Java/Swing 是一个复杂的 API/框架,对其使用有非常具体的要求。虽然它非常灵活,但它确实需要您了解它的工作原理,以便您可以充分利用它。

当您掌握这些概念时,我会先把您的游戏愿望放在一边,因为它会让您的生活变得简单一百万倍

关于java - 在 update() void 中添加 if 语句时,图形不出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18028472/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com