gpt4 book ai didi

java - 渲染具有多个类的矩形

转载 作者:行者123 更新时间:2023-11-30 07:36:27 25 4
gpt4 key购买 nike

我正在制作一个简单的游戏项目,在尝试创建在屏幕上移动的矩形时遇到问题。这是主类:

`公共(public)类 Main 扩展 Canvas 实现 Runnable {

private static final long serialVersionUID = 1L;

private JFrame frame;
boolean running = false;

Graphics g;

static int HEIGHT = 500;
static int WIDTH = HEIGHT * 16 / 9;

SoundHandler sh = new SoundHandler();

//Game state manager
private GameStateManager gsm;

public Main()
{
//window
frame = new JFrame("Game");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());

frame.add(this, BorderLayout.CENTER);
frame.pack();

frame.setSize(WIDTH, HEIGHT);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.setVisible(true);

init();
}

void init()
{
gsm = new GameStateManager();
sh.playMusic("Undertale.wav", 1);
}

public synchronized void start(){
running = true;
new Thread(this).start();
}

public synchronized void stop(){
running = false;
}

//game loop
public void run()
{
//init time loop variables
long lastLoopTime = System.nanoTime();
final int TARGET_FPS = 60;
final long OPTIMAL_TIME = 1000000000 / TARGET_FPS;
double lastFpsTime = 0;
int fps = 0;

while(running)
{
//work out how long its been since last update
//will be used to calculate how entities should
//move this loop
long now = System.nanoTime();
long updateLength = now - lastLoopTime;
lastLoopTime = now;
double delta = updateLength / ((double)OPTIMAL_TIME);

//update frame counter
lastFpsTime += updateLength;
fps++;

//update FPS counter
if(lastFpsTime >= 1000000000)
{
System.out.println("FPS " + fps);
lastFpsTime = 0;
fps = 0;
}

//game updates
update(delta);

//draw
draw(g);

try{
Thread.sleep((lastLoopTime - System.nanoTime() + OPTIMAL_TIME)/1000000 );
}catch(InterruptedException e){
System.out.println("Error in sleep");
}
}
}

private void update(double delta)
{
//updates game state code
gsm.update(delta);
}

public void draw(Graphics g)
{
gsm.draw(g);
}`

这是我想要用来绘制矩形的类

package me.mangodragon.gamestate;

导入java.awt.Graphics;

公共(public)类 MainState 扩展 GameState{

int x;

public MainState(GameStateManager gsm){
this.gsm = gsm;
}

public void init() {

}

public void update(double delta) {
x += 2 * delta;
}

public void draw(Graphics g) {
g.drawRect(x, 0, 50, 50);
g.dispose();
}

public void keyPressed(int k) {

}

public void keyReleased(int k) {

}

}我不断收到此错误:

Exception in thread "Thread-4" java.lang.NullPointerException
at me.mangodragon.gamestate.MainState.draw(MainState.java:22)
at me.mangodragon.gamestate.GameStateManager.draw(GameStateManager.java:37)
at me.mangodragon.main.Main.draw(Main.java:118)
at me.mangodragon.main.Main.run(Main.java:100)
at java.lang.Thread.run(Unknown Source)

我尝试修复它,但找不到问题所在。

谢谢!

最佳答案

您永远不会将任何内容分配给g(Graphics)。现在,在你跑开并尝试弄清楚如何做到这一点之前,我强烈建议你摆脱这个变量,它会给你带来太多问题。

通常,当系统想要绘制您的组件时,它会调用您的 paint 方法并向您传递它希望您绘制的 Graphics 上下文。这种方法称为被动绘画,因为绘画请求是随机出现的,这并不是您真正想要的。另一个问题是 java.awt.Canvas 不是双缓冲的,这会导致组件更新时发生闪烁。

您可能想看看Painting in AWT and SwingPerforming Custom Painting了解更多详情

您可以使用 JPanel 来代替,它是双缓冲的,但使用 java.awt.Canvas 的主要原因是您可以使用 BufferStrategy API。这不仅提供了双缓冲,还为您提供了一种直接控制绘画过程(或 Activity 绘画)的方法。

参见BufferStrategyBufferStrategy and BufferCapabilities了解更多详情

关于java - 渲染具有多个类的矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35329544/

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