Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 帧外的图像渲染?_Java_Image_Swing_Concurrency_Jframe - Fatal编程技术网

Java 帧外的图像渲染?

Java 帧外的图像渲染?,java,image,swing,concurrency,jframe,Java,Image,Swing,Concurrency,Jframe,我正在用Java开发一个游戏,在渲染时遇到了一个问题(我相信它与内容窗格有关)。我有一个screen类,它将背景和所有精灵绘制到一个图像中。然后,该帧使用双缓冲区显示图像。由于某种奇怪的原因,图像是从帧的边缘渲染的。您可以在下面的链接中看到,该图像向左渲染3个像素,向上渲染28个像素。有人知道这是什么原因吗? ![在此处输入图像描述][1] 公共类游戏扩展JFrame实现可运行{ 私有静态最终长serialVersionUID=1L; //图形 公共政策; 缓冲图像; 屏幕; 公共布尔运行=f

我正在用Java开发一个游戏,在渲染时遇到了一个问题(我相信它与内容窗格有关)。我有一个screen类,它将背景和所有精灵绘制到一个图像中。然后,该帧使用双缓冲区显示图像。由于某种奇怪的原因,图像是从帧的边缘渲染的。您可以在下面的链接中看到,该图像向左渲染3个像素,向上渲染28个像素。有人知道这是什么原因吗? ![在此处输入图像描述][1]

公共类游戏扩展JFrame实现可运行{
私有静态最终长serialVersionUID=1L;
//图形
公共政策;
缓冲图像;
屏幕;
公共布尔运行=false;
公共布尔值playerTurn=false;
公共输入管理器输入;
公共层面;
//按钮b;
公共静态最终内部高度=452;
公共静态最终整数宽度=768;
公共游戏(){
超级(“网格战争”);
setDefaultCloseOperation(关闭时退出);
JPanel drawPanel=新的JPanel();
drawPanel.setPreferredSize(新尺寸(宽度、高度));
drawPanel.setLayout(空);
drawPanel.Set不透明(假);
//绘图板。设置位置(50,50);
setContentPane(drawPanel);
可设置大小(假);
包装();
setLocationRelativeTo(空);
setVisible(真);
requestFocus();
创新战略(2);
//b=新的按钮(“这太糟糕了”);
//getContentPane()。添加(b);
//b、 立根(30030010050);
buffy=getBufferStrategy();
图像=新的BuffereImage(宽度、高度、BuffereImage.TYPE_INT_RGB);
屏幕=新屏幕(宽度、高度);
输入=新的输入管理器(此);
级别=新级别(宽度、高度、输入、此);
}
公开作废开始(){
运行=真;
新线程(this.start();
}
公共作废设置(){
}
公开募捐{
最终双刻度=30.0;
最终双更新间隔=100000000/次;
double pastUpdateNS=System.nanoTime();
int updateCount=0;
int frameCount=0;
最终双FRAP=60.0;
最终双渲染间隔=100000000/帧;
double Pastrenders=System.nanoTime();
int pastSecondNS=(int)(pastUpdateNS/100000000);
(跑步时){
double nowNS=System.nanoTime();
如果(现在-过去更新>=更新间隔){
更新();
pastUpdateNS+=更新间隔;
updateCount++;
}
float interp=Math.min(1.0f,(float)((nowNS-pastUpdateNS)/UPDATE_INTERVAL_NS));
渲染(interp);
Pastrenders+=渲染间隔;
frameCount++;
int thisSecondNS=(int)(更新次数/100000000);
如果(此秒>过去秒){
//System.out.println(“刻度:+updateCount+”| FRAPS:+frameCount);
updateCount=0;
帧数=0;
PastSeconds=此Seconds;
}
while(nowNS-pastrenders
buffy.getDrawGraphics()获取的
Graphics
对象的
0,0
坐标
正好位于
JFrame
的左上角,它忽略了框架装饰

  • UPD我忘了一个明显的选择
    JFrame.getInsets()
    提供有关装饰的信息。您可以简单地改变渲染

  • 您可以使框架不装饰(
    setUndecorated(true)
    )并自己渲染/管理窗口控件

  • 或者,我认为这是一种更简单的方法,您可以忘记在
    JFrame
    上直接渲染,将
    Canvas
    放在上面,然后使用它
    Canvas
    还包含
    createBufferStrategy
    方法,所以您只需要进行一些简单的更改

    JPanel drawPanel = new JPanel();
    drawPanel.setLayout(new BorderLayout());
    Canvas canvas = new Canvas();
    canvas.setPreferredSize(new Dimension(WIDTH, HEIGHT));
    drawPanel.add(canvas, BorderLayout.CENTER);
    
    // some code skipped
    
    canvas.setIgnoreRepaint(true); //important
    canvas.createBufferStrategy(2);
    
    buffy = canvas.getBufferStrategy();
    

  • 几天前,我用类似的渲染创建了simple,以获得另一个答案。也许会有帮助。

    打印的声明在哪里?(如果我错过了,很抱歉)非常感谢您的快速回复。我以前使用的是画布,但在使用画布时无法使用JButtons。我在论坛上查看了关于这个问题的信息,然后被告知它根本不起作用,所以我换了这个。它修复了按钮问题,但随后出现了当前问题。使用SetUndercorated“框架可显示”时,我遇到一个问题。必须在
    setVisible(true)
    之前调用
    SetUndercorated
    。将轻量级组件(如
    JButtons
    )与重量级
    Canvas
    混合使用时会出现很多问题。它总是在按钮上渲染。也许值得改用
    java.awt.Button
    。甚至实现自己的简单渲染按钮。使用标准组件需要额外的工作,因为它们用于从EDT进行被动渲染,并且我们已经使用
    setIgnoreRepaint(true)
    .hmmm禁用了重新绘制事件。我真的不知道该怎么做。我的游戏使用鼠标,鼠标的动作基于在帧内单击的点,因此如果我使用插入移动渲染,则我的输入将关闭。是的,我一直在考虑返回画布并再次渲染我自己的按钮,以获取所有信息。我是Java新手,你帮了我很大的忙。我会设法让它工作起来的,知道你说的一切会容易一些
    JPanel drawPanel = new JPanel();
    drawPanel.setLayout(new BorderLayout());
    Canvas canvas = new Canvas();
    canvas.setPreferredSize(new Dimension(WIDTH, HEIGHT));
    drawPanel.add(canvas, BorderLayout.CENTER);
    
    // some code skipped
    
    canvas.setIgnoreRepaint(true); //important
    canvas.createBufferStrategy(2);
    
    buffy = canvas.getBufferStrategy();