我正在创建一个简单的突破风格的游戏。主游戏扩展了JFrame,我在框架中添加了一个JPanel。
当我使用paint()来绘制游戏图形时,项目如预期的那样位于窗口内(即通过它们的x,y坐标)。
我已经更新了代码以使用BufferStrategy,因为我得到了闪烁。由于,渲染的图形偏移了22px。
这意味着砖块离开了屏幕的顶部!
代码如下:
package BreakOut;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferStrategy;
public class Game extends JPanel implements KeyListener{
GameStateManager gsm = new GameStateManager();
BufferStrategy strategy;
public Game() {
//add menu state to GameStateManager
gsm.add(new MenuState(gsm));
createFrame();
while(true)
{
gsm.update();
//repaint();
render();
try{
Thread.sleep(10);
}
catch(InterruptedException e)
{
}
}
}
public void createFrame()
{
JFrame frame = new JFrame("Mini Tennis");
frame.setLayout(new BorderLayout());
this.setPreferredSize(new Dimension(400,400));
frame.add(this);
frame.pack();
frame.setBackground(Color.BLACK);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
addKeyListener(this);
this.setFocusable(true);
frame.createBufferStrategy(2);
strategy = frame.getBufferStrategy();
frame.setVisible(true);
System.out.println(frame.getInsets());
}
public void render()
{
Graphics g = strategy.getDrawGraphics();
super.paint(g);
gsm.render(g);
g.dispose();
strategy.show();
}
public void keyPressed(KeyEvent k) {
switch(gsm.getState())
{
case MAIN_MENU:
if(k.getKeyCode()==KeyEvent.VK_ENTER)
{
//add the PlayState to the Stack and update enum value
gsm.add(new PlayState(gsm, this));
}
break;
case PLAYING:
if(k.getKeyCode()==KeyEvent.VK_P)
{
//add the PlayState to the Stack and update enum value
gsm.add(new PauseState(gsm));
}
break;
case PAUSE:
if(k.getKeyCode()==KeyEvent.VK_P)
{
gsm.pop();
}
break;
case GAME_OVER:
if(k.getKeyCode()==KeyEvent.VK_ENTER)
{
gsm.pop();
}
break;
}
//send input to GameStateManager
gsm.keyPressed(k.getKeyCode());
}
public void keyReleased(KeyEvent k) {
gsm.keyReleased(k.getKeyCode());
}
public void keyTyped(KeyEvent k) {
gsm.keyTyped(k.getKeyCode());
}
public static void main(String[] args) {
new Game();
}}
当我输出System.out.println(frame.getInsets())时,我得到
java.awt.Insets[top=22,left=0,bottom=0,right=0]我显然做错了什么,但是我不明白为什么添加BufferStrategy会创建偏移22px的JPanel
如有任何帮助,我们将不胜感激:)
发布于 2015-01-24 20:37:45
框架有边框和装饰物,它们包含在框架的边界内(它们不会添加到外部),从您使用的MacOS的外观来看,顶部的22像素是窗口标题。
最好的解决方案是,不要使用帧作为渲染表面,而是使用Game类。这意味着它将需要从java.awt.Canvas而不是javax.swing.JPanel进行扩展,并且您将需要从它创建BufferStrategy
如果你覆盖了Canvas的getPreferredSize方法,你可以在框架上使用pack,它会围绕这个包装窗口,所以物理框架会比内容大,但是内容的大小是你想要的大小
您还需要将主/游戏循环移动到单独的线程,因为这是当前阻塞事件分派线程的风险,这可能会导致无休止的问题(比如永远不会获得关键事件)。
https://stackoverflow.com/questions/28125372
复制相似问题