使用Java和LWJGL进行简单的游戏开发

使用Java和LWJGL进行简单的游戏开发,java,opengl,game-engine,lwjgl,Java,Opengl,Game Engine,Lwjgl,当然,我不是第一个开发这种游戏的人。但我想在未来几年内成为游戏开发的专业人士。我想实现一个射击游戏。这不是我的第一次。我在1998年用Turbo Pascal 6.0开发了一个。但是没有使用OOP。这个游戏将是我在Java中的第二次射击,但是第一次使用LWJGL。它将在2D中实现 我想保持它相当简单。但是我想实现一些特性。我计划做10级。玩家有一艘宇宙飞船,他可以向四个方向移动(上、下、左、右)。这艘船有一个只能向上发射的双激光器。船只能移动,我不打算旋转 一个关卡有几个同类的敌人。敌人也是宇宙

当然,我不是第一个开发这种游戏的人。但我想在未来几年内成为游戏开发的专业人士。我想实现一个射击游戏。这不是我的第一次。我在1998年用Turbo Pascal 6.0开发了一个。但是没有使用OOP。这个游戏将是我在Java中的第二次射击,但是第一次使用LWJGL。它将在2D中实现

我想保持它相当简单。但是我想实现一些特性。我计划做10级。玩家有一艘宇宙飞船,他可以向四个方向移动(上、下、左、右)。这艘船有一个只能向上发射的双激光器。船只能移动,我不打算旋转

一个关卡有几个同类的敌人。敌人也是宇宙飞船。最简单的船只是向下移动。他们还发射单颗或双颗激光子弹。这些激光器有最小和最大频率。我想定义一个数学函数,它定义了频率(在最小值和最大值之间)的可能性

在敌人(和水平面)内,船的速度是恒定的。在以后的关卡中,敌人获得双倍或2.5倍的速度。更高等级的敌人有激光来寻找玩家的飞船。我计划在游戏后期有一个敌人,它有越来越多的激光子弹

在每个级别内都没有其他障碍。每个关卡都有一些星星作为背景。首先我想实现一个静态背景,然后我计划制作3种不同速度的星星

玩家船上的激光会造成单点或双点伤害,这取决于是否有一两颗子弹击中。敌人在死亡前有一些生命值。玩家飞船在死亡前也有一些生命值

我想有两种爆炸(由一些集中分布的椭圆组成,颜色从黄色到红色)。激光击中的小爆炸。还有一次大爆炸导致了船只的毁灭

我的朋友告诉我,有一个函数每秒调用60次,用于渲染图形对象。所以我认为在这个函数中,我画了所有的对象,不再做更多的事情。当然,船只和激光的坐标会改变

所以我想我是否应该使用线程

如果我使用线程,我会将每艘同时出现的飞船分配给一个线程,并为每一台激光器制作线程,随后为动态背景制作线程。在另一个线程中,我将等待键盘输入

当然,在使用线程和不使用线程之间有一个折衷

使用线程利兹现实并行,可能是必要的有一个流动的游戏。但避免线程将导致更简单的编程,而不考虑对数据的并发访问。所以我问你们所有有经验的游戏开发者。你会用线还是不用线?如果你愿意使用它们,我的概念是好是坏。为什么?我还对其他实用提示感到高兴


谢谢大家!

任何游戏都可以使用单线程和事件侦听器制作。这将使用更新循环在每一帧更新每个对象。用最简单的术语来说,这可以是一个包含
线程的循环。尽管睡眠是一种更高级的技术

int framesPerSecond=60;
double frameTime=1000.0/framesPerSecond; 

while(running){
    for(Updatable updatable:updatables){
         //should actually measure the frame time since it would actually be 
         //exactly this. System.nanoTime() can be used for this
         updatable.update(frameTime); 

         //depending on your graphics library each updatable object may be given
         //the opportunity to render itself here

    }

    renderFrame(); //render frame as appropriate for your graphics library
    Thread.sleep(frameTime); 
}
有一件事你绝对不能有很多自由的线程,每个线程都在做自己的事情,没有协调。这几乎不可能在没有bug的情况下编写(而且效率非常低)

使用适当数量的线程 在更新循环中,通常可以将更新分解为相互不影响的独立部分。在这种情况下,您可以将每个部分赋予一个线程(这对于简化此过程非常有用)。线程的另一个很好的用途是准备游戏所需的东西,但不是现在;例如生成下一级


但是,多线程的规则是线程数不明显多于内核数。每个线程都有不小的开销,但一旦线程数超过核心数,就根本无法提高执行速度。因此,例如,一个双核上的程序最多应该有4个线程执行重要的工作。四核最多应该有8个等。

太宽了。。。还有文字墙,还有很多离题的东西。游戏设计概念的讨论可能更适合过于广泛的讨论。就像软件工程世界中的一切一样,您不能应用模式并始终坚持它。这完全取决于你正在构建的游戏。为pong应用线程是毫无意义的。在一个需要管理数千个计算机控制实体的AI的游戏中应用线程:这是一个更好的主意。注:当然是在多核或多cpu系统上。有两件重要的事情需要注意:(1)一个游戏可以由一个线程+键盘输入的监听器组成;这样的游戏看起来与多线程游戏完全相同(但不会使用所有可用的CPU能力)。(2) 有更多的线程(正在做重要的工作)会显著降低程序的速度。如果你在决斗核心上运行,你最多需要4个threads@RichardTingle虽然除非是回合制游戏或者非常琐碎,我发现很难制作一款没有独立专用线程的游戏,不断更新游戏状态/渲染屏幕等等@CeilingGecko三十多年来,程序员们甚至在拥有当今手机1/1000资源的计算机上也能做到这一点。也许你只需要多看一看就知道怎么做了,这将是对你的知识库的一个丰富的补充,也是一个更好的游戏程序员。这是一篇很好的帖子,但我有一个问题:你是否故意省略了一个渲染框架的示例调用(在这种情况下,我建议将其放入以确保完整性),或者你是一次性更新和渲染的吗?@Gimby我把它删掉了,主要是因为它的精确形式对库有点不规范,我想保留它