Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.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 有没有比等待JOGL显示方法完成某件事情更好的代码?_Java_Opengl_Graphics_Game Engine_Jogl - Fatal编程技术网

Java 有没有比等待JOGL显示方法完成某件事情更好的代码?

Java 有没有比等待JOGL显示方法完成某件事情更好的代码?,java,opengl,graphics,game-engine,jogl,Java,Opengl,Graphics,Game Engine,Jogl,我得告诉你,我没有为这个问题想出一个好标题,但我会解释我的情况 我正在使用OpenGL(JOGL)用Java制作一个简单的游戏。有一个按键侦听器正在等待按下左键,当您按下左键时,会发生以下情况: case KeyEvent.VK_LEFT: if (inControl) { inControl = false; alpha = 0; moving = true; } 如您所见,inControl智能驭享决定玩家是否能够移动。

我得告诉你,我没有为这个问题想出一个好标题,但我会解释我的情况

我正在使用OpenGL(JOGL)用Java制作一个简单的游戏。有一个按键侦听器正在等待按下左键,当您按下左键时,会发生以下情况:

case KeyEvent.VK_LEFT:
     if (inControl) {
        inControl = false;
        alpha = 0;
        moving = true;
      }
如您所见,
inControl智能驭享
决定玩家是否能够移动。现在,通过将
moving
设置为false,我向
display
方法“发送信号”,该方法包含以下代码段:

public void display(GLAutoDrawable drawable) {
   .
   .
   .
   if (moving) {
       .
       .
       .
       // Set color's alpha to alpha
       // Draw contents
       .
       .
       .
       if (alpha < 1.0f)
          alpha += 0.01f;

       if (alpha >= 1.0f) {
           inControl = true;
           moving = false;
       }
   }
   .
   .
   .
}
公共空白显示(GLAutoDrawable){
.
.
.
如果(移动){
.
.
.
//将颜色的alpha设置为alpha
//绘制内容
.
.
.
如果(α<1.0f)
α+=0.01f;
如果(α>=1.0f){
inControl智能驭享=真实;
移动=假;
}
}
.
.
.
}
这意味着一旦我单击左键,某些东西将逐渐增加不透明度,直到
alpha>=1.0f
。然后,玩家必须等待,这是通过将
inControl=true
置于显示方法的末尾来完成的


虽然这是可行的,但我并不喜欢这种方法。显示方法不应该只显示图形,而不处理数据吗?

最后回答您自己的问题。您不应该在GLEventListener.display(GLAutoDrawable)中修改数据模型,此方法应该更新视图,即模型的表示形式。我建议您看看现有的基于JOGL的3D引擎,了解我们(主要是我)是如何解决这个问题的。如果你真的想让你的代码保持简单,你至少应该将模型的管理和视图的更新分开,例如,将前者移动到一个单独的方法中,即使你在GLEventListener.display(GlautDrawable)中调用它作为第一步。“按需重绘”习惯用法不适合游戏。而是始终绘制并启用垂直同步。您可以将键和鼠标事件放入队列,读取此队列的内容以在其他位置更新数据模型,并读取模型以更新GLEventListener.display(GLAutoDrawable)中的视图。我的问题是,什么是避免此问题的好例子。最后,我做的是进行转换计算,然后在每次更改时调用display方法。在显示屏上,对象总是通过我在键侦听器中操纵的两个变量进行转换。只要所有更改都发生在键侦听器中,并且是玩家操作的结果,您的解决方案是可行的,但当人工智能引起更改时,它就没有意义,因为当玩家不按任何键时,它可能发生,即使是像乒乓球这样的简单游戏。还要考虑碰撞测试。最后,您可能只会在侦听器中保留有关事件的信息,而不会在侦听器中对模型进行更改。我建议您看看这个:上面模式中的“警告更改”步骤与调用GLAutoDrawable.display()时的操作相匹配。如果你真的想决定何时重画,你不应该使用内置的动画师,然后,你可以创建自己的动画师,或者简单地使用典型的游戏循环“while(running){update();render();}”,其中render()只调用GLAutoDrawable.display(),update()调用负责更新数据模型的控制器(您案例中的翻译)。您在最后回答了自己的问题。您不应该在GLEventListener.display(GLAutoDrawable)中修改您的数据模型,此方法应该更新视图,即模型的表示。我建议您查看依赖JOGL的现有3D引擎,以了解我们(…主要是我)解决这个问题。如果你真的想让你的代码保持简单,你至少应该将模型的管理和视图的更新分开,例如,将前者移动到一个单独的方法中,即使你在GLEventListener.display(GlautDrawable)中调用它作为第一步习惯用法不适合游戏。而是始终绘制并启用垂直同步。您可以将按键和鼠标事件放入队列,读取此队列的内容以在其他位置更新数据模型,并读取模型以更新GLEventListener.display(GLAutoDrawable)中的视图。我的问题是什么是避免这种情况的好例子。最后,我做的是进行转换计算,然后每次更改时调用display方法。在显示中,对象总是通过我在键侦听器中操作的2个变量进行转换。只要所有更改都发生在键侦听器中并且是c玩家动作的顺序,但当人工智能引起变化时,这是没有意义的,因为玩家不按任何键都可能发生这种情况,即使是在像乒乓球这样的简单游戏中。也要考虑碰撞测试。最后,你可能只在监听器中保留有关事件的信息,而不是doi我建议您看一下:上面模式中的“警告更改”步骤与调用GLAutoDrawable.display()时的操作相匹配。如果您确实想决定何时重画,则不应使用内置动画师,然后,您可以创建自己的动画师,或者只需使用典型的游戏循环“while(running){update();render();}”,其中render()只调用GLAutoDrawable.display(),update()调用负责更新数据模型的控制器(您案例中的翻译)。