gpt4 book ai didi

java - 我无法让我的 2d 游戏对象移动

转载 作者:行者123 更新时间:2023-12-01 11:05:38 25 4
gpt4 key购买 nike

这是我的主要代码。我尝试创建一个包含检查键盘操作功能的包,但它不起作用。现在,正如您所看到的,这两个代码都位于同一个文件下。到目前为止,程序打开,我可以看到圆圈,但它不会向左或向右移动。不管你信不信,我已经在这呆了大约 3 个小时了。

编辑:我刚刚意识到更新函数从名为“input”的包中获取数据。那是在我将两个类放在同一个文件名下之前,但即使有一个类的包名为“gamesample.input.*”,它仍然无法工作。

package gamesample;

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

/**
* Main class for the game
*/
public class GameSample extends JFrame
{
boolean isRunning = true;
int fps = 30;
int windowWidth = 500;
int windowHeight = 500;

BufferedImage backBuffer;
Insets insets;
InputHandler input;

int x = 0;

public static void main(String[] args)
{
GameSample game = new GameSample();
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);
input = new InputHandler(this);
}

/**
* This method will check for input, move things
* around and check for win conditions, etc
*/
void update()
{
if (input.isKeyDown(KeyEvent.VK_RIGHT))
{
x += 5;
}
if (input.isKeyDown(KeyEvent.VK_LEFT))
{
x -= 5;
}
}

/**
* 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);

}
}

这是键盘代码

package gamesample;

import java.awt.Component;
import java.awt.event.*;

/**
* Makes handling input a lot simpler
*/
public class InputHandler implements KeyListener
{
boolean keys[];
/**
* Assigns the newly created InputHandler to a Component
* @param c Component to get input from
*/


public InputHandler(Component c)
{
c.addKeyListener(this);
}

/**
* Checks whether a specific key is down
* @param keyCode The key to check
* @return Whether the key is pressed or not
*/
public boolean isKeyDown(int keyCode)
{


if (keyCode > 0 && keyCode < 256)
{ keys = new boolean [256];
return keys[keyCode];
}

return false;
}

/**
* Called when a key is pressed while the component is focused
* @param e KeyEvent sent by the component
*/
public void keyPressed(KeyEvent e)
{ boolean keys[];
if (e.getKeyCode() > 0 && e.getKeyCode() < 256)
{ keys = new boolean [256];
keys[e.getKeyCode()] = true;
}
}

/**
* Called when a key is released while the component is focused
* @param e KeyEvent sent by the component
*/
public void keyReleased(KeyEvent e)
{ boolean keys[];
if (e.getKeyCode() > 0 && e.getKeyCode() < 256)
{ keys = new boolean [256];
keys[e.getKeyCode()] = false;
}
}

/**
* Not used
*/
public void keyTyped(KeyEvent e){}
}

最佳答案

Graphics g = getGraphics(); 不是自定义绘制的方式。 Swing 使用被动渲染算法,这意味着您的 UI 可以随时因多种原因重新绘制,其中许多原因是您无法控制的。 Swing 默认情况下也是双缓冲的,因此如果您实际使用 JPanel 并覆盖它的 paintComponent 方法,您将免费获得双缓冲,并且您会收到通知任何与系统相关的绘制事件。

参见Painting in AWT and SwingPerforming Custom Painting了解更多详情

不要使用KeyListener,它太麻烦了,按键绑定(bind)API解决了它所存在的所有问题。请参阅How to Use Key Bindings了解更多详情。

请记住,Swing 是一个单线程框架,并且不是线程安全的。这意味着您永远不应该以任何方式阻塞事件调度线程(例如使用永无止境的循环),并且您应该只在 EDT 的上下文中更新 UI。

你的“主循环”有同时做这两件事的危险。代码不会阻塞 EDT,这是 JVM 性质的侥幸,但这也意味着您违反了 Swing 的单线程性质。

参见Concurrency in Swing了解更多详情。

通常,我会使用 Swing Timer 来完成此类工作,因为它的回调在 EDT 的上下文中同步,但您可以使用 Thread >,但您必须手动将更新同步回 EDT。

如果您想完全控制绘制过程,您应该使用 BufferStrategy,请参阅 BufferStrategyBufferStrategy and BufferCapabilities了解更多详情

作为basic example上述概念的

关于java - 我无法让我的 2d 游戏对象移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32981270/

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