您的位置:网站首页 > Java游戏 > 正文

怎样用Java制作基本的3D引擎

类别:Java游戏 日期:2020-1-4 14:23:19 人气: 来源:

  首先要做的是被造是一个主要的阶级。主类将处理向用户显示图像,调用其他类以重新计算应向播放器显示的内容以及更新相机的。

  请注意,可以将地图重新配置为所需的内容,我在这里只是一个样品。地图上的数字表示该的墙壁类型。 0代表空白空间,而其他任何数字则代表实心墙和随之而来的纹理。 BufferedImage是显示给用户的,像素是图像中所有像素的数组。其他变量实际上不会再次出现,它们只是用来使图形和程序正常工作。

  大多数只是类变量和框架的初始化。 “ pixels =“之后的代码连接像素和图像,以便每当更改像素中的数据值时,向用户显示图像时就会在图像上显示相应的更改。

  渲染时使用缓冲策略,以使屏幕更新更加流畅。总体而言,使用缓冲策略只会帮助游戏在运行时看起来更好。为了将图像实际绘制到屏幕上,需要从缓冲策略中获取图形对象并用于绘制图像。

  run方法非常重要,因为它可以处理程序不同部分的更新频率。为此,它使用一些代码来何时经过了1/60秒,以及何时更新了屏幕和摄像机。这样可以提高程序运行的流畅度。 run方法如下所示:

  一旦所有这些方法,构造函数和变量都在其中,那么当前在Game类中剩下要做的唯一事情就是添加一个main方法。主要方法非常简单,您要做的就是:

  在进入查找屏幕外观的计算之前,我将绕行并设置Texture类。纹理将应用于中的各种墙壁,并将来自保存在项目文件夹中的图像。在图像中,我包含了在网上找到的4个纹理,将在该项目中使用。您可以使用任何想要的纹理。要使用这些纹理,我将它们放在项目文件中的文件夹中。为此,请转到项目文件夹(在Eclipse中,它位于工作区文件夹中)。转到项目文件夹后,创建一个名为“ res”或其他名称的新文件夹。将纹理放在此文件夹中。您可以将纹理放置在其他地方,这就是我存储纹理的地方。完成此操作后,我们就可以开始编写代码以使纹理可用。

  数组像素用于保存纹理图像中所有像素的数据。 Loc用于向计算机可以找到纹理的图像文件的。 SIZE是一侧的纹理大小(64x64图像的大小为64),并且所有纹理将完全为正方形。

  现在,Texture类剩下的就是添加一个load方法来从图像中获取数据并将它们存储在像素数据数组中。此方法将如下所示:

  load方法的工作原理是从loc指向的文件中读取数据并将该数据写入缓冲的图像。然后,从缓冲的图像中获取每个像素的数据,并将其存储在像素中。

  使其余部分可以访问这些纹理该程序让我们继续前进,并将其交给Game类。为此,我们将需要一个ArrayList来容纳所有纹理,并且需要将纹理添加到此ArrayList中。要创建ArrayList,请将以下代码行和变量放在类的顶部附近:

  此ArrayList必须在构造函数中初始化,并且还应添加纹理在构造函数中。在构造函数中添加以下代码:

  现在让我们绕道而行并设置Camera类。 Camera类玩家在2D地图中的,并负责更新玩家的。为此,该类将实现KeyListener,因此将需要导入KeyEvent和KeyListener。

  xPos和yPos是玩家在Game类中创建的2D地图上的。 xDir和yDir是指向玩家所面对方向的向量的x和y分量。 xPlane和yPlane也是向量的x和y分量。 xPlane和yPlane定义的向量始终垂直于方向向量,并且在一侧指向相机视场的最远边缘。另一边最远的边缘就是负平面向量。方向矢量和平面矢量的组合定义了相机视场中的内容。布尔值用于用户按下了哪些键,以便用户可以移动相机。 MOVE_SPEED和ROTATION_SPEED在用户按下相应键时相机移动和旋转的速度。

  接下来是构造函数。构造函数接受告诉类的的值,并将相机分配给相应的变量(xPos,yPos 。..)。

  相机对象在最终程序中将需要它,所以让我们继续添加一个。在具有所有其他变量声明的Game类中,添加

  ,此摄像机将与地图一起使用我正在使用,如果您使用的是其他地图,或者想从其他开始,请调整xPos和yPos的值(在我的示例中为4和6)。使用.66可以提供良好的视野,但是您可以调整该值以获得不同的FOV。

  现在,Camera类具有构造函数,我们可以开始添加方法来用户的输入并更新相机的/方向。因为Camera类实现了KeyboardListener,所以它必须具有其实现的所有方法。 Eclipse应该自动提示您添加这些方法。您可以将keyTyped方法保留为空白,但将使用其他两种方法。当按下相应的键时,keyPressed会将布尔值设置为true,而键时,keyReleased会将其更改为lse。方法看起来像这样:

  现在,Camera类正在按下了哪些键,我们可以开始更新播放器的。为此,我们将使用在Game类的run方法中调用的update方法。在此过程中,我们将继续进行操作,并通过在Game类中将地图传递给update方法时,将冲突检测添加到update方法中。更新方法如下所示:

  该方法中控制前进和后退运动的部分通过分别向xPos和yPos添加xDir和yDir来工作。在此动作发生之前,程序会检查该动作是否会将相机放置在墙内,如果可以,则不进行检查。对于旋转,方向矢量和平面矢量都乘以旋转矩阵,即:

  以获得其新值。完成update方法后,我们现在可以从Game类中调用它。在Game类的run方法中,添加以下代码行,在此处显示

  该地图与在游戏类。屏幕使用它来确定墙壁在哪里以及与玩家之间的距离。宽度和高度定义屏幕的大小,并且应始终与Game类中创建的框架的宽度和高度相同。纹理是所有纹理的列表,以便屏幕可以访问纹理的像素。在声明了这些变量之后,必须像下面这样在构造函数中对其进行初始化:

  现在是时候编写类具有的一个方法了:update方法。更新方法根据用户在地图中的重新计算屏幕的外观。该方法被不断调用,并将更新后的像素数组返回给Game类。该方法开始于“清除”屏幕。通过将上半部分的所有像素设置为一种颜色,并将下半部分的所有像素设置为另一种颜色来实现此目的。

  让屏幕的顶部和底部为两个不同颜色也使它看起来好像有地板和天花板。清除像素阵列后,该是进行主要计算的时候了。该程序循环遍历屏幕上的每个垂直条,并投射光线以找出该垂直条上的屏幕上应该有什么墙。循环的开始看起来像这样:

  这里发生的所有事情都是计算出循环其余部分将要使用的一些变量。 CameraX是摄影机平面上当前垂直条纹的x坐标,并且rayDir变量为射线创建矢量。计算所有以DistX或DistY结尾的变量,以便程序仅在可能发生碰撞的检查碰撞。 perpWallDist是从播放器到射线与之碰撞的第一堵墙的距离。这将在以后计算。完成此操作后,我们需要根据已经计算出的变量来找出其他一些变量。

  一旦完成,就该找出射线与何处碰撞了。一堵墙。为此,程序要经过一个循环,在该循环中检查射线是否与墙壁接触,如果没有,则移动到下一个可能的碰撞点,然后再次检查。

  现在我们知道射线在何处撞击墙壁,我们可以开始计算墙壁在我们当前所在的垂直条纹中的外观。为此,我们首先计算到墙的距离,然后使用该距离来计算出墙在垂直条中应该有多高。然后,我们根据屏幕上的像素将该高度转换为起点和终点。代码如下所示:

  计算完之后,就该开始从墙的纹理中找出哪些像素会真正呈现给用户了。为此,我们首先必须确定与刚击中的墙关联的纹理,然后确定将向用户显示的像素的纹理的x坐标。

  通过获取在2D地图上击中墙壁的确切并减去整数值(仅保留小数)来计算x坐标。然后将此小数(wallX)乘以墙的纹理大小即可在我们希望绘制的像素的墙上获得确切的x坐标。一旦我们知道剩下要做的就是计算纹理上像素的y坐标并将其绘制在屏幕上。为此,我们遍历垂直条带中屏幕上的所有像素,然后对其进行计算并计算纹理上像素的确切y坐标。然后,使用该程序,程序将纹理中像素的数据写入屏幕上的像素阵列。该程序还使此处的水平墙比垂直墙暗,以提供基本的照明效果。

  该类完成。现在,我们要做的就是在Game类中添加几行代码以使屏幕正常运行。在变量顶部添加以下内容:

  说到Java虚拟机,相信作为Java程序员的小伙伴们都不陌生,他们每天都在写Java代码,写的代码都....

  近年来,随着计算机技术、网络通讯技术和数控技术的发展以及制造自动化的需要,DNC(Distribut....

  在现今电子信息高速发展的时代,电子游戏已经深入人们的日常生活,成为老少皆宜的娱乐方式。但是游戏设计结....

  对于初学者来说,最纠结的事就是不知哪种编程语言,前景才更好?不要着急,小编收到大家的问题后,根据....

  Java语言的优点集中在三个方面,其一是语言生态体系健全;其二是应用场景众多,是全场景开发语言之一;....

  对于具备两年工作经验的Java程序员来说,如果自身的开发经验积累不足,同时也不具备全面的行业知识,那....

  计算机网络知识也是Java程序员需要重点学习的内容之一,随着5G通信的落地应用,未来物联网领域会....

  随着移动智能科学技术的不断发展,移动智能终端具有广泛应用于各大行业领域的潜力,移动电子支付通信服务领....

  欢迎来到 Haskell 趣学指南!村子情事会想看这篇文章表示你对学习 Haskell 有很大的兴趣。你来对....

  这份提案早已达到第 2 阶段,但是提案的原负责人退休后,委员会里一直无人愿意接手,提案停滞多年,即将....

  Java 版本在迭代中通过不断地更改变量,节约内存空间,对 String 对象进行优化。

  该SAP课程对SAP NETWEBER作为ABAP所涉及的许多管理任务提供了广泛的了解,它为SAP系....

  在近期举行的中国开源峰会OSC源创会·年终盛典上,华为编译器获得“最有价值开源项目”称号。

  近年来,随着计算机技术、网络通讯技术和数控技术的发展以及制造自动化的需要,DNC(Distribut....

  本文档的主要内容详细介绍的是Java基础教程PDF免费下载包括了:第1部分 Java语言,第2....

  Java作为当前web开发和web开发都有着众多开发者的流行语言,目前拥有着越来越多的学习者,本书面....

  据悉,2018年发表的一篇学术论文[PDF]确定了在网站上发布的代码片段Lundblad是从Stac....

  C#是微软公司发布的一种面向对象的、运行于Framework和.NET Core(完全开源....

  可能很多C语言程序员不会同意我的观点,因为C语言是最古老的语言,至今仍被频繁地使用。提前声明一点:这....

  在Java业界流行着一种说法——黄金5年,就是从程序员入职时算起,前五年的工作选择直接影响整个职业生....

  嵌入式系统是以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积....

  现在Java技术十分流行,发展势头强劲,而且在SUN公司推出了J2ME平台后,众多移动式系统都纷纷支持Java应用程序。由于Ja...

  嵌入式linux 是将日益流行的Linux操作系统进行裁剪修改,使之能在嵌入式计算机系统上运行的一种....

  在当前的云计算时代,全栈开发是一个重要的发展趋势,尤其是对于应用级程序员来说,如果想在开发领域走得更....

  JavaScript 语言的前身叫作Livescript。自从Sun 公司推出Java 语言之后,....

  图书管理系统会因为图书的数量、种类、提供的操作等不同而具有不同的复杂度。基本信息的、图书借阅、归....

  本文档的主要内容详细介绍的是使用Java语言编写战机的设计报告和源代码以及可执行文件免费下载导入ec....

  1、知道JAVA程序员和C程序员的差别吗?食堂里,吃完饭就走的是JAVA程序员,吃完饭还要自己的....

  在XC32和MPLABX3.35中,DsSsCs装配列表选项在哪里进行?有没有我做得不对的事情,还是Java程序员决定我不再需要它了...

  刚刚安装了MPLAB X IDE 3.40,并有文本编辑器的问题。如果我尝试打开任何源文件,我会得到下面的Java异常:java. Lan...

  针对数据竞争检测过程中的误报和漏报问题,提出一种静态数据竞争检测方法。首先,使用控制流分析自动构造线....

  Java 是当前IT 领域中比较流行的技术之一。J2EE 是当前比较流行的企业级应用架构。本人一直致....

  本文档的主要内容详细介绍的是Java编程语言基础教程免费下载包括了:第一单元基本语法,第二单元基本....

  嗨,我为AgU2702A示波器的IVI-C驱动程序编写了一个JNI Wrapper。 驱动程序DLL称为AgU2701A.dll。 包装器工作...

  张小强视频(JAVA)链接: 密码:utrf 黑马相关视频 链接: 密码:u0ik 苹果iOS应用UI控件开发基础视频video 链接: 密...

  java是计算机的一门编程语言;可以用来做很多工作,大数据开发属于其中一种;大数据属于互联网方向,就....

  学好java能够让程序员在大数据处理、分布式计算等方面有所发展,本文达妹简单为大家介绍java设计基....

  现在python已经基本成了人工智能的标准语言了,一般都是C/C++写个底层运算库,然后用pytho....

  C++几乎可以实现任何功能,但除非拥有明显理由,否则我们不会将其作为首选。Java则是一切都足够——....

  最初,我从MPLAXPress安装MCC,IDE设置为使用18F1330。MCC来了,但18F1330不支持,所以我没有多少可以做。我关...

  您好,我需要您的帮助,关于如何获得一个复选框,它能够切换变量状态并显示变量值本身。我只是想创建一个复选框,如果一个标志是...

  如今,编写网络应用程序是一个单调乏味且易于出错的过程。开发人员可能要花费 90% 的时间来处理浏览器....

  使用者对类内部定义的属性(对象的变量)的直接操作会导致数据的错误、混乱或安全性问题。在面向对象程....

  继承是为了重用父类代码。两个类若存在IS-A的关系就可以使用继承。,同时继承也为实现多态做了铺垫。那....

  由的内容可以看出,Java封装就是把现实世界同类事物的共同特征和行为抽取出来,放到一个新建的类中....

  采用 this 关键字是为了解决实例变量(private String name)和局部变量(set....

  封装步骤一般分为3步,第一步首先修改属性的可见性,即将其设置为private;第二步创建getter....

  

关键词:java制作游戏
0
0
0
0
0
0
0
0
下一篇:没有资料

网友评论 ()条 查看

姓名: 验证码: 看不清楚,换一个

推荐文章更多

热门图文更多

最新文章更多

关于联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助

郑重声明:本站资源来源网络 如果侵犯了你的利益请联系站长删除

CopyRight 2010-2012 技术支持 FXT All Rights Reserved