gpt4 book ai didi

java - 一个对象中的图形正在影响另一个对象的图形 - JAVA

转载 作者:行者123 更新时间:2023-11-30 06:36:08 26 4
gpt4 key购买 nike

这是第一篇文章,所以我会尽力说得清楚。基本上,我想做的是创建一个小游戏,你有一艘船,你可以用它发射子弹。飞船使用切线公式根据玩家的 deltaX 和 deltaY 进行旋转。我使用像这样的标准游戏循环:

public void run() {
long lastTime = System.nanoTime();
double amountOfTicks = 60.0;
double ns = 1000000000 / amountOfTicks;
double delta = 0;
long timer = System.currentTimeMillis();
@SuppressWarnings("unused")
int frames = 0;
while(running){
long now = System.nanoTime();
delta += (now - lastTime) / ns;
lastTime = now;
while(delta >=1){
tick();
delta--;
}
if(running)
repaint();
frames++;

if(System.currentTimeMillis() - timer > 1000)
{
timer += 1000;
frames = 0;
}
}
stop();
}

我的“游戏”在 JPanel 的子级(称为 Board 的类)上运行。在循环中,我调用方法 tick()(更新信息)和 repaint()(用作渲染方法)。这是我的paintComponent(Graphics g)方法:

public void paintComponent(Graphics g) {
//This is for background
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(Color.black);
g2d.fill(new Rectangle(0, 0, Constants.width, Constants.height));

//This is where actual game rendering occurs
handler.render(g);
g.dispose();
}

可以看出,我没有在 Board 类上渲染所有内容。我对我的处理程序这样做。这就是我处理处理程序的方式:

public void render(Graphics g) {
for (int i = 0; i < handlerList.size(); i++) {
//handlerList is a LinkedList
handlerList.get(i).render(g);
}
}

LinkedList handlerList 包含实体。Entities 是一个抽象类,它是 Creature 的父类,Creature 是 Player 和 Bullet 的父类。这是渲染 Player 实例的代码:

public void render(Graphics g) {        
float centerX = x + (width / 2);
float centerY = y + (height / 2);

double theta = findAngle(deltaX, deltaY);

Graphics2D g2d = (Graphics2D) g;
if(!stopped) g2d.rotate(theta, centerX, centerY);
else g2d.rotate(stoppedTheta, centerX, centerY);
g2d.drawImage(shipImage, (int)x, (int)y, (int)width, (int)height, null);
}

有一个 boolean 值“stopped”,用于跟踪对象的状况。我使用 Graphics2D 而不是 Graphics,因为我希望能够旋转我的船。

这是子弹渲染的代码:

public void render(Graphics g) {
Graphics2D g2d = (Graphics2D) g;

g2d.setColor(Color.yellow);
g2d.fillOval((int)x, (int)y, (int)width, (int)height);
}

据我所知,它看起来是正确的。每当我没有子弹时,游戏都会运行良好,正如您在 this 中看到的那样。动图:免责声明:对低质量和水印表示抱歉,我刚刚格式化了计算机,还没有时间安装适当的东西......

当我添加项目符号时this发生:

子弹的 x 和 y 位置不变,但子弹随船旋转。我假设它与滥用“dispose()”方法有关,但我不确定可以采取什么措施来修复它。

提前谢谢您。

最佳答案

  1. 切勿在未显式创建的Graphics上下文(或使用create创建快照)上调用dispose,这可能会导致问题进一步沿着渲染管道。
  2. 图形是一个共享上下文,因此您需要注意对其所做的更改,并撤消所做的任何“重大”更改,尤其是转换

如果是我,我会在每次调用 render 之前创建 Graphics 上下文的快照,并在调用之后dispose ,例如

public void render(Graphics g) {
for (int i = 0; i < handlerList.size(); i++) {
//handlerList is a LinkedList
Graphics2D g2d = (Graphics2D)g.create();
handlerList.get(i).render(g2d);
g2d.dispose();
}
}

这可以确保在渲染下一个元素之前撤消 renderGraphics 上下文所做的任何更改

如果更改是复合的,那么我会在循环开始之前创建快照,并在循环之后处理它。

无论哪种情况,都意味着您可以控制所做的更改以及它们如何影响其他元素。

此外,请记住,转型是复杂的

关于java - 一个对象中的图形正在影响另一个对象的图形 - JAVA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45181843/

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