下学期,我们有一个团队中的Java应用程序模块。该模块的要求是制作游戏。在圣诞节假期里,我一直在做一些练习,但是我想不出绘制图形的最佳方法。
我正在使用Java
Graphics2D对象在屏幕上绘制形状,并repaint()
每秒调用30次,但这非常闪烁。有没有更好的方法来绘制Java中的高性能2D图形?
您想要做的是创建一个带有BufferStrategy的canvas组件并对其进行渲染,下面的代码应该向您展示它的工作原理,我在这里从我自己编写的Engine中提取了代码。
性能完全取决于您要绘制的内容,我的游戏大多使用图像。在大约1500个像素的情况下,我仍然在480x480分辨率下达到200
FPS以上。禁用帧限制时,只有100张图像,而我达到了6k FPS。
我创建的一个小游戏(该游戏一次在屏幕上约有120张图像)可以在此处找到(是的,下面的方法也可以作为applet正常工作。)
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsEnvironment;
import java.awt.Toolkit;
import java.awt.Transparency;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
public class Test extends Thread {
private boolean isRunning = true;
private Canvas canvas;
private BufferStrategy strategy;
private BufferedImage background;
private Graphics2D backgroundGraphics;
private Graphics2D graphics;
private JFrame frame;
private int width = 320;
private int height = 240;
private int scale = 1;
private GraphicsConfiguration config =
GraphicsEnvironment.getLocalGraphicsEnvironment()
.getDefaultScreenDevice()
.getDefaultConfiguration();
// create a hardware accelerated image
public final BufferedImage create(final int width, final int height,
final boolean alpha) {
return config.createCompatibleImage(width, height, alpha
? Transparency.TRANSLUCENT : Transparency.OPAQUE);
}
// Setup
public Test() {
// JFrame
frame = new JFrame();
frame.addWindowListener(new FrameClose());
frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
frame.setSize(width * scale, height * scale);
frame.setVisible(true);
// Canvas
canvas = new Canvas(config);
canvas.setSize(width * scale, height * scale);
frame.add(canvas, 0);
// Background & Buffer
background = create(width, height, false);
canvas.createBufferStrategy(2);
do {
strategy = canvas.getBufferStrategy();
} while (strategy == null);
start();
}
private class FrameClose extends WindowAdapter {
@Override
public void windowClosing(final WindowEvent e) {
isRunning = false;
}
}
// Screen and buffer stuff
private Graphics2D getBuffer() {
if (graphics == null) {
try {
graphics = (Graphics2D) strategy.getDrawGraphics();
} catch (IllegalStateException e) {
return null;
}
}
return graphics;
}
private boolean updateScreen() {
graphics.dispose();
graphics = null;
try {
strategy.show();
Toolkit.getDefaultToolkit().sync();
return (!strategy.contentsLost());
} catch (NullPointerException e) {
return true;
} catch (IllegalStateException e) {
return true;
}
}
public void run() {
backgroundGraphics = (Graphics2D) background.getGraphics();
long fpsWait = (long) (1.0 / 30 * 1000);
main: while (isRunning) {
long renderStart = System.nanoTime();
updateGame();
// Update Graphics
do {
Graphics2D bg = getBuffer();
if (!isRunning) {
break main;
}
renderGame(backgroundGraphics); // this calls your draw method
// thingy
if (scale != 1) {
bg.drawImage(background, 0, 0, width * scale, height
* scale, 0, 0, width, height, null);
} else {
bg.drawImage(background, 0, 0, null);
}
bg.dispose();
} while (!updateScreen());
// Better do some FPS limiting here
long renderTime = (System.nanoTime() - renderStart) / 1000000;
try {
Thread.sleep(Math.max(0, fpsWait - renderTime));
} catch (InterruptedException e) {
Thread.interrupted();
break;
}
renderTime = (System.nanoTime() - renderStart) / 1000000;
}
frame.dispose();
}
public void updateGame() {
// update game logic here
}
public void renderGame(Graphics2D g) {
g.setColor(Color.BLACK);
g.fillRect(0, 0, width, height);
}
public static void main(final String args[]) {
new Test();
}
}
我正在开发一个基于2D图块的游戏,其中所有图块旋转45度。 我想这样做: 原因是为了在2D游戏中创建不同的视角。 有相当多的基于瓷砖的游戏教程,但我不知道有像这样的旋转瓷砖。 所以我的问题是:如何创建旋转45度的瓷砖?我会感谢任何代码或链接。 编辑:忘了说我用的是Java Graphics2D,不是OpenGL
我正在做一个2D平台,只是增加了重力 然而,如果空格键在玩家完成跳跃后仍然被按住,玩家就会在半空中继续跳跃。 我知道我需要检查球员是否真的在地面上,但当我这样做时,它总是返回“false”,如我的跳跃方法所述:
本文向大家介绍Java游戏开发拼图游戏经典版,包括了Java游戏开发拼图游戏经典版的使用技巧和注意事项,需要的朋友参考一下 游戏介绍: 拼图游戏是一款经典的益智游戏,游戏难度分为 简单、正常、困难 三种难度,分别对应3*3,4*4,5*5布局,游戏开始前图片被随机打乱,空块位于最右下角,玩家通过点击空块周围图片或者按键方式对图片和空块进行相互交换,直到所有图片都回到原位即为游戏胜利。 本次制作的拼
问题内容: 这是最近困扰我的话题。 在JFrame中创建游戏时,您想使用-method将图形添加到JPanel中,如何给游戏提供不同的阶段?哪个最适合表现? 我可以想到的两种方法是: 添加和删除包含它们自己的- 方法和计时器的面板。游戏的每个阶段(关卡等)将使用不同的面板。 将所有内容放在一个面板或框架中,并具有许多布尔值和if语句。例如,如果是游戏结束,则将布尔值更改为true,然后在-me
全球理念:假设我想做一个游戏/电影/剪辑。为此,我需要这个(不)简单的动画得到工作。 这个问题的一个例子:我得到了类Screen,它有JFrame的Screen Stuff声明,设置它的配置(大小、关闭操作等),然后创建类Box的对象,显示在框架上。请检查这个类的图像/图表(希望我写的是正确的):ClassesDiagram 现在,class Box扩展了JPanel。我从JPanel继承了方法P
面试时间整整一小时,嘴都说干了,整体难度不大,问的全都是其他面经里问的内容 一开始问的C++ 上来先手写一个拷贝构造函数,要求这个类有2个成员变量,int和char *;写完之后面试官提醒深浅拷贝,然后把char指针的拷贝改为深度拷贝,这里提醒char指针通常用来存储字符串,需要读取字符串长度,这里我手写的方法,在判断指针到字符串尾部的时候我写成了(*c)=='\n',这里面试官提醒了应该是'\0