我正在创建一个简单的爆发式游戏。主游戏扩展了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();
}
}
当我输出系统。出来println(frame.getInsets());我明白了
java.awt.Insets[top=22,left=0,bottom=0,right=0]
我显然做错了什么,但不明白为什么添加BufferStrategy会让JPanel被22px抵消
任何帮助将不胜感激:)
框架有边框和装饰,它们包含在框架的边界内(它们不会添加到外部),从使用MacOS的外观来看,顶部的22像素是窗口标题。
最好的解决方案是,不要使用帧作为渲染曲面,而是使用游戏
类。这意味着它需要从java扩展。awt。画布
而不是javax。摆动JPanel
,您需要从中创建缓冲策略
如果覆盖Canvas
的getPreferredSize
方法,可以在框架上使用pack
,它将围绕此框架打包窗口,因此物理框架将比内容大,但内容将是您希望的大小
您还需要将主/游戏循环移动到单独的线程,因为这是当前阻塞事件调度线程的风险,这可能会导致您没有结束的问题(例如从未获得关键事件)
问题内容: 我已经看到了几种有神论的方法,它们似乎都起作用,但是我只是想知道一种方法是否比另一种更好。 例如,一个叫你可以这样做: 您还可以执行以下操作: 这些“正确”之一吗? 问题答案: 来自类javadoc的文字副本 JFrame类与Frame略有不兼容。像所有其他JFC / Swing顶级容器一样,JFrame包含JRootPane作为其唯一的子级。根窗格提供的内容窗格通常应包含JFrame
问题内容: 我在同一张图上绘制了多个seaborn点图。x轴是序数,而不是数字。每个点图的序数值都相同。我想将每个图稍微移到一边,pointplot(dodge = …)参数的方式是在单个图内的多条线内进行,但是在这种情况下,是要在彼此之上绘制多个不同图。我怎样才能做到这一点? 理想情况下,我想要一种适用于任何matplotlib图的技术,而不仅仅是专门针对海洋的技术。由于数据不是数字,因此很难为
在IE6及更低版本中,当一个浮动元素与一个非浮动元素相邻时,在非浮动元素中,会莫名的为靠近浮动元素的内容添加 3 像素的间隙。 假设在一个容器中,有两个元素: <div id="wrapper"> <div class="fl">float</div> <p>...</p> </div> 左侧的 div 元素向左浮动,而右侧的 p 元素不浮动: .fl { float:
我对javascript比较陌生,所以我对这个问题感到挠头。我有一大堆跨度,都在同一条线上。但当我得到所有span元素的顶部并进行比较时,它表示不相同,但在控制台中,我可以看到所有span的值都是相同的,即8。我是不是错过了什么。 null null
我只需要添加一个边距顶部,这样,如果我的图像是用这个js: 我知道这可能很简单,但我是个初学者。希望有人能教我怎么做。谢谢!
问题内容: 是否可以跳过X个第一行,并在一个查询中选择所有其他行?像那样: 它将选择:pqr,stu,vwx,yz 我尝试使用LIMIT和OFFSET完成此操作,但是问题是表是动态的,而且我不知道应该输入哪个LIMIT(我不知道表中有多少行)。 问题答案: 如果只需要最后N行,请尝试以下操作: 这会根据的顺序为您提供最后几条记录。 您可以使用自动递增的主键(希望有一个主键)来确定行的顺序(如果无法