import javax.swing.JFrame;
public class Main extends JFrame {
public Board board = new Board();
public Main() {
add(board);
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
setVisible(true);
}
public static void main(String args[]) {
new Main();
}
import javax.swing.JPanel;
public class Board extends JPanel {
public TextLabel textLabel1 = new TextLabel("Hi", "Hello", "Bye");
public TextLabel textLabel2 = new TextLabel("Bye", "GoodBye", "Farewell");
public Board() {
addKeyListener(textLabel1); //this could be a ball in my game
addKeyListener(textLabel2); //this could be something else...
add(textLabel1);
add(textLabel2);
setFocusable(true);
}
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JLabel;
public class TextLabel extends JLabel implements KeyListener {
private String txt1, txt2;
public TextLabel(String text, String txt1, String txt2) {
setText(text);
this.txt1 = txt1;
this.txt2 = txt2;
}
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_A) {
setText(txt1);
}
if (key == KeyEvent.VK_L) {
setText(txt2);
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
}
如果你希望你的简单游戏是内存/CPU高效的,我建议采取一个完全不同的路线。
public类Main{public static void Main(String[]args){Game Game=new Game();//init JFrame并将Game添加到其中
game.start();
while(game.isRunning()) {
game.update();
game.repaint();
}
}
}
class Game extends Canvas {
private boolean running = true;
private Ball ball = new Ball(0, 0, 50, 50);
public void start() {
running = true;
}
public void stop() {
//clean-up
running = false;
}
public void update() { //update game logic
ball.update();
}
@Override
public void paint(Graphics g) { //render game
super.paint(g); //clears previous graphics
ball.render(g); //passes graphics down to entity
}
}
这将给你一个清晰的设计你的游戏,以及分离渲染与游戏逻辑。这是球课的样子
class Ball {
private int currentX, currentY, width, height;
public Ball(int x, int y, int w, int h) {
currentX = x; currentY = y;
width = w; height = h;
}
public void update() {
currentX++; //moves ball to right
}
public void render(Graphics g) {
g.setColor(Color.BLUE);
g.fillRect(currentX, currentY, width, height);
}
}
您会注意到,当运行这样的东西时,CPU使用率会相当高。这是因为控制游戏的while循环以极快的速度循环。有许多方法可以精确定时地减缓这一速度。我将向您展示一个非常简单的方法:
int fps = 30;
int oneNanoSec = 1000000000;
int secondsPerLoop = oneNanoSecond/fps; //divide a second into 30 slices
while(game.isRunning()) {
long start = System.nanoTime(); //see what time it is when we start
game.update();
game.render();
long end = System.nanoTime(); //see what time it is when the game is finished updating/rendering
long sleepTime = secondsPerLoop - (end-start);
if(sleepTime > 0) {
try {
Thread.sleep(sleepTime);
}catch(InterruptedException e) {
e.printStackTrace();
}
} else
Thread.yield();
}
这个计时器会看到更新和渲染花了多长时间,然后根据你想要更新/渲染的速度,运行游戏的线程会Hibernate(暂停)。
有人能告诉我为什么这也不管用吗?(我的第二个动作监听器是我的游戏所需的其他东西)
问题内容: 我有一个使用从扩展的类的子类 我将一个对象添加到框架-中。现在,当我按下任意键盘键时,不会调用任何方法,并且似乎没有窗口焦点。我也尝试过调用,但仍然没有响应。 如何使它响应按键? 问题答案: 您是否为面板设置了面板本身?另外,您可能需要将面板设置为可聚焦。我通过此代码对其进行了测试,它似乎可以正常工作
问题内容: 我正在做一个涉及JPanel中的鼠标和键监听器的小项目。不幸的是,当我使用鼠标/键盘时,没有一个方法被调用。我之前曾使用过JPanels / JFrame / JApplet和JComponents。代码片段如下所示: 偏离主题:我不断收到错误消息您的帖子似乎包含格式错误的代码。请使用代码工具栏按钮或CTRL + K键盘快捷键将所有代码缩进4个空格。要获得更多编辑帮助,请单击[?]工具
我正在尝试实现一个简单的keylistener,用左键箭头绘制椭圆形移动的图形。在使用系统进行测试后,椭圆形不会移动,甚至不会读取按键。出来普林顿。任何帮助都将不胜感激。
下面的代码,如下所示: 扩展JFrame。但是我也需要它来扩展JPanel,以便制作一个透明的JPanel。问题是我不能同时扩展这两个,java会犯一个错误: 如果我扩展了JPanel,我就可以生成一个透明的JPanel,但是程序不能运行,因为在几行代码中有一个错误(如果我扩展了JFrame,这个错误就会消失)。 然而,如果我扩展JFrame,程序将运行得很好,但它使我无法执行透明的JPanel。
不久前,我通过教程和视频开始学习Java,在了解了一些东西(按钮、布局、音频和其他一些东西的工作原理)之后,我现在的目标之一是创建一个小型交互式游戏。 我在主课上写了相当大一部分的游戏,效果很好,但过了一段时间就变得一团糟了。 所以我决定从一开始就尝试另一次,对游戏的每个部分使用不同的类,让代码看起来更清晰易懂。 但我从一开始就有一个问题,在论坛上搜索了几个小时的教程和答案,但没有找到一个准确的答