gpt4 book ai didi

java - Flappy Bird 图形慢

转载 作者:行者123 更新时间:2023-11-29 04:21:57 26 4
gpt4 key购买 nike

我正在尝试编写一个简单的 flappy bird 游戏作为 Java Applet。我遇到的问题是图形极度无响应,通常在按下键后需要 5-10 秒才能响应。此外,它仅在按键被按下一定次数(大约 6 或 7 次)时才会响应。我认为这不是我电脑的问题,因为我在高规范 MacBook Pro(8 GB RAM)上运行它, i5 处理器)。这是我使用的两个主要类:

import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
//The main class I use to run the game
public class Flap extends Applet implements Runnable, KeyListener
{
final int WIDTH = 700, HEIGHT = 500;
Thread thread;
Bird b;
boolean beenPressed = false;
public void init()
{
this.resize(WIDTH, HEIGHT);

this.addKeyListener(this);
b = new Bird();
thread = new Thread(this);
thread.start();
}

public void paint(Graphics g)
{
g.setColor(Color.CYAN);
g.fillRect(0, 0, WIDTH, HEIGHT - 100);
g.setColor(Color.green);
g.fillRect(0, 400, WIDTH, HEIGHT);
b.draw(g);
}

public void update(Graphics g)
{
paint(g);
}

@Override
public void run()
{
for(;;)
{
//Pillar upPillar = new Pillar()
b.move();
repaint();
try
{
Thread.sleep(500);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
}

@Override
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode() == KeyEvent.VK_UP)
{
if(!beenPressed)
{
b.setUp(true);
}
beenPressed = true;
}
else
{
b.setDown(true);
}
}

@Override
public void keyReleased(KeyEvent e)
{
if(e.getKeyCode() == KeyEvent.VK_UP)
{
beenPressed = false;
b.setUp(false);
}
else
{
b.setDown(false);
}
}

@Override
public void keyTyped(KeyEvent arg0)
{

}
}


import java.awt.Color;
import java.awt.Graphics;
//The Bird class, which has the methods for the player to move
public class Bird
{
int x, y, yvel;
boolean goingUp, goingDown;
public Bird()
{
x = 200;
y = 200;
}

public void draw(Graphics g)
{
g.setColor(Color.yellow);
g.fillRect(x, y, 60, 25);
}

public void move()
{
if(goingUp)
{
yvel -= 50;
}
else if(goingDown)
{
yvel += 50;
}
y += yvel;
}

public int getX()
{
return x;
}

public int getY()
{
return y;
}

public void setUp(boolean b)
{
goingUp = b;
}

public void setDown(boolean b)
{
goingDown = b;
}
}

虽然还没有完成,但在这个阶段,我觉得至少鸟儿应该动起来了。

最佳答案

图形并不慢,更新之间的时间太长了。它基本上允许在更新周期发生之前按下和释放键。

我会将 Thread.sleep(500); 减少到更像 Thread.sleep(10); 并将移动增量更改为更像...

public void move()
{
if(goingUp)
{
yvel -= 1;
}
else if(goingDown)
{
yvel += 1;
}
y += yvel;
}

作为起点。

建议...

使用小程序,坏主意。 Applet 已被弃用,是一项已死的技术。 Applet 也不是双缓冲的,因此您可能最终会遇到一些可怕的闪烁。 KeyListener 因存在问题(不响应)而闻名,虽然它是使用 AWT 时的唯一解决方案,但使用 Swing 时,ket 绑定(bind) API 是更好的解决方案

我建议的第一件事是看一下使用 JPanel 作为基础组件,然后看一下 Performing Custom PaintingPainting in Swing更好地理解绘画的工作原理

如果您“真的”需要高性能(或者只是想更好地控制绘画过程),您还应该看看 BufferStrategy and BufferCapabilities

我还建议您查看 JavaFX对于这种事情,它有更好的 API

关于java - Flappy Bird 图形慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48573682/

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