仓库:https://gitee.com/mrxiao_com/2d_game_2
看一下我们现在的进展
今天的工作重点是处理游戏中的Z轴问题,特别是如何在不同的层级之间进行移动,并确保Z轴的处理方式与真实世界中的透视效果一致。当前,游戏中的Z轴运动存在问题,具体表现为远离玩家的物体移动速度反而比靠近玩家的物体更快,这显然是不符合透视原理的。
为了修正这个问题,需要对游戏中的Z轴运动进行透视计算,确保物体随着距离的变化,运动速度也能正确地表现出来。尽管游戏并非完全的3D游戏,但在处理Z轴运动时依然要使用3D游戏中的透视计算方法,确保表现尽可能真实。
目前,游戏已经实现了一个简单的层级结构,玩家可以通过虚拟的楼梯上下移动,不同的层级叠加在一起,并且已经有了相关的视觉效果,如树木渐变显示等。然而,由于没有为楼梯添加位图,导致在移动过程中视觉表现有所不足。
目标是进一步优化Z轴的运动,使物体在靠近或远离时,运动速度的变化符合透视的规律。这不仅有助于提升游戏的视觉效果,还能避免因计算错误而影响游戏的真实性和沉浸感。
接下来,会通过黑板上的讲解,详细介绍如何进行正确的3D变换计算,并确保在游戏中实现精准的Z轴处理,避免性能损失。
黑板:透视投影
今天的讨论重点是理解传统的透视投影以及如何通过这种投影来表示三维世界中的物体。在这个过程中,假设我们正在通过显示器来观察三维空间,而显示器本身就像是一个窗口,能够显示我们眼睛所看到的内容。
首先,想象一下屏幕和眼睛的关系。眼睛位于屏幕后方,显示器上所显示的内容是从不同角度通过光线进入眼睛的。为了在屏幕上准确显示三维物体的位置,需要通过"透视投影"将这些物体从三维空间转换到二维平面上。
透视投影与正交投影的区别在于,正交投影将物体的点沿着平行线投射到显示面上,而透视投影则是让所有投射线汇聚到眼睛的位置,这样远离眼睛的物体会看起来更小,而靠近眼睛的物体则相对较大,从而创造出真实的三维感。
例如,当我们在屏幕上绘制一个立方体时,如果使用正交投影,所有位于相同水平的点将投射到同一个位置,不论物体的距离远近。而在透视投影中,相同的物体会根据距离的不同而有所缩小,远离观察者的部分会显示得比近处部分小,从而产生透视缩短的效果,这种效果在艺术和技术中都称为"透视压缩"或"前景收缩"。
这个过程的核心在于模拟光线通过屏幕传递到眼睛,从而确保屏幕上的物体能够真实地反映出它们在三维空间中的实际位置和大小。这种投影方法使得物体的远近关系得以准确呈现,从而产生真实的深度感和空间感。
黑板:光学中的光捕捉(可选)
在实际的光学过程中,图像的捕捉远比简单的光线投射到平面上要复杂。实际上,光线经过镜头时会发生折射,焦点位于镜头后方。这些折射的光线聚焦到一个点,但光线并不会仅仅停留在这个点,而是继续向后传播。为了捕捉这些光线,通常会有一个接收平面,比如眼睛的视网膜、照相机的成像平面或数字相机的传感器。
在这种情况下,一个现实世界中的点并不只向一个方向发射光线,而是发射一个光线的锥形区域。光线从一个点发射出来,经过镜头折射,最终形成图像。这种现象就是所谓的"视场",即从该点出射的所有光线都可以被镜头捕捉到,并在图像平面上投影出来。
在图像成像过程中,光线形成一个锥形区域,锥形的半径在镜头附近最大,聚焦点则逐渐减小。光圈的大小决定了这个光线锥的宽度,进而影响捕获的光线数量和焦点的锐利程度。如果光圈较大,意味着光线锥较宽,更多的光线可以通过镜头,而光线的焦点则较模糊;相反,如果光圈较小,光线锥较窄,焦点较为锐利,背景会更加模糊,这就是所谓的"景深"效应。
更进一步,当调整相机的光圈值时,可以控制景深的范围。较低的光圈值意味着较大的光圈,更多的光线可以进入,从而使更多的背景变得模糊;较高的光圈值意味着较小的光圈,减少进入的光线量,从而使焦点区域变得更加清晰,背景更难以聚焦。
这些光学原理对于理解真实世界中的图像捕捉非常重要,尤其是在进行光线追踪或其他高级渲染技术时。
举个例子,假设有一个摄影师在拍摄一个景物,其中有一个人站在前景,远处还有一座山。这时,摄影师选择了一个较大光圈(例如 f/2),这意味着光圈较大,能够让更多的光线进入相机。由于光圈大,光线的折射会形成一个比较宽的锥形,前景的人物会很清晰,而远处的山则会变得模糊不清,这是因为大光圈导致了较小的景深。
如果摄影师把光圈调小(例如 f/16),那么光圈会变得更小,光线进入相机的量会减少,折射出的光线锥会更窄,这样前景和远景的景物都会变得更加清晰,因为光线会在更大范围内聚焦。
另一个常见的例子是在拍摄夜景时。如果摄影师选择较大的光圈(例如 f/2),相机会接收到更多的光线,因此可以拍摄到更亮的画面,但背景的灯光和远处的细节可能会变得模糊。而如果选择较小的光圈(例如 f/16),虽然相机接收到的光线较少,可能需要更长时间的曝光才能拍摄出足够亮的图像,但这会使得整个画面,包括远处的细节都更加清晰。
这些例子中,通过调整光圈的大小,摄影师能够控制画面的焦点区域以及背景的模糊程度,从而达到预期的艺术效果。
黑板:为了光照逼真和相机遮光罩我们能做的疯狂事情(可选)
在简化过程中,当不需要模拟某些效果时,例如焦距或镜头畸变时,可以做出一些假设。焦距和畸变通常是由于光线不完美地形成圆锥形路径而产生的。如果不关心这些因素,可以省略它们,以简化计算。
在某些情况下,特别是在进行逼真渲染时,可以模拟光线在相机内部的反射。光线进入镜头后,可能会发生反射并最终影响画面。例如,强烈的光源可能会引发光线反弹,导致图像洗白,影响最终的图像质量。
此外,一些高端相机镜头上会附带一个大罩子,这种设计通常用于避免光线反射到相机传感器上。摄像时,强烈的阳光或其他光源的反射可能会导致图像质量下降,因此这个罩子可以防止一些不必要的光线进入镜头,并确保只有朝向相机的光线被捕捉到。
镜头和传感器的形状也有关系。例如,镜头是圆形的,而传感器通常是矩形的,这就要求在镜头前方设计一个合适的罩子来避免多余的光线进入并影响图像质量。罩子会被设计成特定形状,以避免那些不属于传感器接收范围的光线进入。
这种设计方法主要是为了减少无关光线的影响,确保镜头只捕捉到来自前方的光线。尽管这些细节并不一定对每个场景都重要,但它们在特定条件下,如强烈的阳光下,能够显著提高图像质量。
这些细节的理解对于掌握光线和镜头之间的交互非常重要,尽管在某些应用中,尤其是简化渲染时,可以忽略这些复杂的物理效果。然而,了解这些原理能够更好地理解相机和渲染过程中光线的行为。
黑板:近似值
在此内容中,讨论了如何计算透视投影的问题,特别是通过简化为一种"假设一切都在焦点中"的情况来理解透视效果,而忽略焦距和焦点效果。目标是将所有物体投影到一个单一的针孔点。
这里所讨论的概念类似于相机的工作原理,其中物体通过相机的镜头被投影到"感光面"上,通常在相机中这会导致图像颠倒(通过相机的镜头反转)。这种反转并不是指镜像翻转,而是彻底的倒转,所有轴都会被反向。
接下来,讨论了如何计算投影到显示屏上的图像,给出了一个简单的几何图示。首先,从眼睛(或摄像机)的视点开始,目标是将物体投影到一个图像平面(或显示器)。为了描述这一过程,采用了类似三角形的原理,其中通过相似三角形的比率可以推导出物体在显示器上的位置。
具体地,摄像机的位置是已知的,而物体的位置也是已知的,所需的就是计算出物体与摄像机的相对距离。通过这两个三角形的相似性,利用简单的比率(距离比)可以求出目标物体的位置。
这个计算公式本质上就是透视投影的基本方程:通过物体的距离和摄像机的距离,计算出物体在显示屏上投影的位置。这个公式可以表达为:
d ⋅ p c z − p z = p ′ \frac{d \cdot p}{c_z - p_z} = p' cz−pzd⋅p=p′
其中 d d d 是从眼睛到显示器的距离, p p p 是物体的原始位置, p ′ p' p′ 是物体的投影位置, c z c_z cz 是摄像机的Z坐标, p z p_z pz 是物体的Z坐标。
这就是透视投影的基本计算方法,能够将三维空间中的物体准确地映射到二维显示器上。
透视投影的推导过程可以通过类似三角形的几何原理来理解。具体的步骤如下:
-
设置坐标系统 :假设我们在三维空间中有一个物体,它的位置是 p p p,并且它的 Z 坐标是 p z p_z pz。观察者(或摄像机)的位置是 c c c,其 Z 坐标是 c z c_z cz。我们还定义了一个显示平面(或图像平面),它与摄像机在 Z 轴上的距离为 d d d。
-
三角形的相似性 :从物体到显示器的投影路径形成了两个相似的三角形。一个三角形是由物体的实际位置 p p p 和摄像机位置 c c c 所形成的,另一个三角形是由显示器上的投影位置 p ′ p' p′ 和摄像机位置 c c c 所形成的。
- 物体到摄像机的三角形的高度是 c z − p z c_z - p_z cz−pz(即物体到摄像机的 Z 轴距离)。
- 投影到显示器的三角形的高度是 d d d(即显示器到摄像机的 Z 轴距离)。
因为这两个三角形是相似的,所以它们的相对比例是相同的。
-
比例关系 :根据相似三角形的性质,两个三角形的相对应的边的比率相等。因此,可以建立以下比例关系:
d c z − p z = p ′ p \frac{d}{c_z - p_z} = \frac{p'}{p} cz−pzd=pp′其中, p ′ p' p′ 是物体在显示器上的投影位置, p p p 是物体在世界坐标中的位置。
-
解出投影位置 :为了求得 p ′ p' p′,我们将比例式两边乘以 p p p,得到:
p ′ = d ⋅ p c z − p z p' = \frac{d \cdot p}{c_z - p_z} p′=cz−pzd⋅p这就是透视投影的核心公式。
公式解释:
- d d d:显示器或图像平面与摄像机之间的距离。
- p p p:物体在三维空间中的原始位置。
- p ′ p' p′:物体在显示器上的投影位置。
- c z c_z cz:摄像机的 Z 坐标。
- p z p_z pz:物体的 Z 坐标。
ZFudge 倍增,但透视投影的公式不是倍增
在实现透视投影时,遇到了一个问题:原先的计算方法使用了一个"ZFudge"值,它基于物体的 z 坐标进行计算,并进行了乘法操作。然而,透视投影的核心公式实际上是通过除法来实现的,而不是乘法。这是导致游戏中的 z 轴运动不自然的原因。
透视投影的正确计算应该基于以下公式:
p ′ = d ⋅ p c z − p z p' = \frac{d \cdot p}{c_z - p_z} p′=cz−pzd⋅p
其中, p ′ p' p′ 是投影位置, p p p 是物体的原始位置, d d d 是显示器到摄像机的距离, c z c_z cz 是摄像机的 z 坐标, p z p_z pz 是物体的 z 坐标。
根据这个公式,可以看到,物体的位置应该通过除法来进行转换,而不是通过乘法。如果错误地使用了乘法,就会导致类似"星际之门"效果的错误,这种效果看起来不真实,并且不能正确表现三维透视。
此外,这个公式在 x 和 y 方向上是一样的,所以无论是处理 x 坐标还是 y 坐标,公式形式是相同的。通过正确应用这个公式,可以得到正确的三维透视效果,从而使游戏中的运动看起来更自然和真实。
实现公式
在上述讨论中,主要讨论了如何计算和应用投影方程来将三维点投影到二维屏幕上。首先,核心目标是计算一个点的投影(即 p ′ p' p′),其中该点通过某种方式与相机(或视点)进行交互,进而映射到屏幕上的二维坐标。通过投影计算,可以获得对象在屏幕上的位置。
计算过程中,首先要计算实体与相机的距离 d d d(也可以称为焦距),并确保所有计算保持一致的单位系统,比如在米的单位中进行处理,而不是在像素单位下。这样可以避免出现一些不一致或难以调试的错误。接着,计算时要考虑实体相对于相机的深度,即 Z 坐标,确保计算中的距离不受误差影响。
在执行投影时,必须特别注意防止除以零的情况,特别是在接近相机的对象。这涉及到设置一个近裁剪平面(near clip plane),它将剔除那些距离相机太近的物体,以避免在渲染时发生错误。这些物体会被忽略或不进行投影,直到它们足够远离相机。
在具体实现时,投影的计算公式需要将实体的原始 x , y x, y x,y 坐标与相机的焦距和距离结合,通过一个适当的分母来进行缩放,以得到最终的投影位置。此时还需要检查是否有任何对象的深度(Z值)过小,导致可能的除零错误。
最后,最终计算得到的投影位置可以用于屏幕绘制,而不是直接根据其原始位置进行渲染。同时,还要注意投影过程中的缩放效应,这些效应通过比例因子来控制,确保物体在不同深度下正确缩放。
总的来说,整个过程不仅涉及到几何计算,还需要考虑优化渲染性能、避免错误、处理物体远近等方面。

在游戏中查看并重新检查一切
目前存在一些需要修复的问题。虽然代码中存在一些不稳定的部分,但至少现在的缩放效果比之前更为正确。问题依然存在,首先需要进一步调整一些值。
在调试过程中,发现当前场景似乎没有正确居中。尽管变换的数值看起来是正确的,但最终呈现的效果并没有对准屏幕中心。具体原因尚不明确。经过检查,所有的值确实是基于屏幕中心的,但最终显示的效果并没有体现出这一点。看来是在添加这些值时出现了偏移。
目前的设置中,似乎一些基于屏幕中心的计算结果并未按预期正确居中,导致图像的偏移。可能是由于某些参数在传递过程中的问题。尽管在大多数情况下,值是正确的,但最终效果并未反映出应有的居中位置。
此外,还需确认当推送位图到处理流程时,是否正确地将所有的基准点(如敌人基准点)设为零。这一点也需要检查,以确保图形的准确定位和展示。
目前的主要问题是位移和缩放过程中,图像看起来发生了不必要的偏移,需要进一步调查传递的值和计算的准确性,确保所有的值在经过处理后都能正确居中和显示。

领悟时刻:我们的偏移量仍然是以像素为单位的
当前的问题是,偏移量仍然是以像素为单位进行计算,而不是以米为单位。这导致了计算和显示的偏差。虽然这种像素级的处理本身并不是问题,但它可能会在后续引发其他问题,特别是在处理过程中,最终需要转换为米时,所有计算都还停留在像素级别。
如果能够将所有计算都转化为米/像素的比例,可能会更合适。然而,将这些转换留到后期进行处理,可能会导致不必要的对齐问题,因此当前的处理方式还需要进一步优化。在某些情况下,虽然像素为单位的计算是可以接受的,但这种做法仍显得不够理想。
根本的问题在于,如果保持像素级别的处理,接下来的所有计算都必须在像素级别进行,而这虽然在短期内可行,但从长远来看,可能会增加复杂性和问题的发生几率。最终,处理的方式可能需要调整到更加一致的单位体系中,以确保计算和对齐的准确性。
在像素中进行透视计算并调整数值
在当前的工作中,主要问题是如何处理偏移量的单位,从像素转化为米,并确保在整个渲染过程中始终使用一致的单位。偏移量目前还是以像素为单位,这会导致在计算和渲染中出现不一致的情况。虽然这种做法在短期内可以工作,但长远来看可能会引发更复杂的问题。为了更好地处理这些偏移量,目标是将所有的计算都转为米每像素,并在渲染过程中使用相应的比例进行转换。
例如,相机的焦距和地面上的相机距离目前也需要转换为米每像素。这个转换虽然复杂,但可以确保在渲染过程中获得正确的视觉效果。通过调整这些转换值,已经能够让背景的物体呈现出符合透视规则的效果,说明距离问题在逐步得到解决。
尽管看起来通过这些调整,渲染的效果已经接近预期,但依然存在一些疑问,特别是在尺度和焦距的处理上。比如,当焦距值设置较高时,渲染效果变得更加合适,但为什么焦距会如此重要,这个问题还没有完全解决。通过逐步调整这些值,已经可以得到想要的透视效果,但对于非线性问题的理解和解决仍然需要进一步探讨。
总体来说,虽然渲染效果已经达到了目标,但存在一些细节上的不确定性,特别是如何处理不同单位和转换时的非线性效应。这些问题可能需要更多的调试和思考,以确保最终实现的稳定性和一致性。



黑板:再做一次数学计算
通过计算相机与物体的距离来解决某个数学问题。首先,考虑到相机视角和物体的位置,确定了如何通过比率计算目标位置与摄像机的关系。给定一个图示,其中有相机位置、目标位置(p)和目标位置在屏幕上的映射(p')。计算公式中,x坐标和z坐标的比值被用来推算屏幕上的目标位置。
通过这段讨论,公式演示了如何通过目标位置的x坐标与z坐标的关系,乘以一个比例系数,最终得出目标在屏幕上的位置。计算过程中,涉及到了摄像机与地面或目标的相对位置,最终得出合适的映射关系。

眯眼类似于关闭相机的光圈吗?
眯眼并不完全等同于调整相机的光圈。眯眼更像是调整焦距,或者戴上遮光罩。相机的光圈变化更像是眼睛瞳孔的收缩,就像在阳光下,瞳孔收缩来限制光线的进入。这个收缩过程类似于相机的光圈缩小,限制了进入的光量。因此,眯眼与调节焦距和加遮光罩相似,而调整光圈则是瞳孔的收缩。
你是打算乘以 XYZ,而不仅仅是公式中的 XY 吗?
之所以要对 x、y、z 三个变量进行处理,而不仅仅是 x 和 y,是因为需要了解完整的投影效果,以便可以将其作为缩放值。这样做的原因是,投影不仅涉及 x 和 y 轴,还需要考虑 z 轴,从而得到更精确的结果。因此,使用相同的公式处理三个变量,可以一次性获取所有三个轴的投影结果。
不是房间高度是 8 米吗?这大约是正常房间高度的三倍,因此必须增加焦距以压缩所有内容
检查了房间的高度,似乎设置为八米。如果真是这样,那么这个设置就不太合理,可能是设置时出了问题。然而,根据标准的楼层高度,实际高度看起来是正确的,约为十英尺,符合正常的楼层高度。
这个参数不是已经转换成像素了吗?如果是的话,我认为你把米转成像素的操作做了两次
参数是否已经转换为像素时,指出EntityBaseP
没有被转换为像素,而是需要进行转换。已转换为像素的是实体的偏移量,因此无法直接使用米作为单位进行计算,因为转换已经在米到像素的过程中完成。可以考虑使用逆转换,将所有操作保留在米的单位中,之后再进行投影处理,这样结果应该是相同的。虽然这种方法可能不会改变结果,但可以尝试验证这一点。
如果你想用这段代码做一个完整的 3D 游戏,比如第一人称射击游戏,你需要做哪些更改才能给玩家提供可调节视场选项?
要在现有代码中为第一人称射击游戏添加可调的视野(FoV)选项,实际上不需要做太多修改。视野(FoV)控制的是投影的角度,而焦距(focal length)就是控制投影的关键参数。通过调整焦距,可以间接地改变FoV。要实现这一点,首先需要理解FoV是一个角度,它代表了从屏幕的顶部到底部的最大可视角度。
在投影计算中,可以使用三角函数来根据FoV和屏幕的尺寸来计算所需的距离。具体来说,可以利用正切(tangent)函数,根据给定的角度和屏幕的高度来计算出相应的投影距离。这样,只需在现有代码的基础上添加一个用于计算FoV的正切计算,就能支持可调的视野。
因此,改变FoV的实现方法并不需要修改太多代码,只需要增加计算FoV的部分,并利用三角函数计算出相应的距离。这是一个简单的数学应用,能帮助实现动态调整视野的功能。
你认为这需要多久?
根据估算,完成这款游戏大约需要600小时。假设每周工作40小时,600小时相当于15个工作周。这个时间估算虽然看起来合理,但对于大多数开发者来说,这是一个相对较短的时间框架,尤其是在使用自制引擎的情况下。即使按照每天仅工作一个小时的进度,完成这些任务也可能需要接近两年的时间。虽然这是一个非常短的开发周期,但实际上,要完成所有编程工作仍然需要花费大量时间。开发过程的复杂性和细节,使得即便时间相对较短,仍然需要极大的耐心和持续努力才能按计划推进。
没有 OpenGL,没有音频库,没有任何东西。作为自虐狂,你过得怎么样?
没有使用OpenGL,也没有音频库,开发看起来确实像是在自找麻烦。但实际上,渲染和音频播放的优化工作并不复杂,可能需要大约24小时来完成。尽管到目前为止,已经编程了大约100小时,其中大部分时间都花在了解释和讨论上。如果要重新编写OpenGL代码,实际上只需要一周左右的时间,而音频库的编写甚至可以在一天内完成。虽然开发过程中遇到了一些随机问题和技术细节(比如处理Z轴的复杂性),如果选择不处理Z轴,可能能节省50小时以上的时间。尽管如此,开发时间看起来比较长,实际上大部分时间都被解释和讨论占用了。如果仅仅专注于编程,完成这些任务其实并不费时。以纹理映射三角形为例,编写代码的时间大约是20分钟,但解释却花费了1小时40分钟。所以,如果开发进度看起来很慢,可能是因为解释过程占用了大量时间。
你好!作为软件开发者,我知道 C++ 的性能优势很重要。然而,许多基于 REPL 的实时代码开发工具正在出现,简化了网络和游戏开发的过程。你对这种脱离传统软件开发工具的做法有什么看法?
关于代码在运行时的工具,实际上可以在C++中实现实时编码,而不需要依赖于某些慢速的Web语言来达到这一效果。C++并没有限制开发者进行交互式编程,只要代码编写得当,就能够实现实时更新。例如,修改投影方程式时,游戏会实时反映这些变化,而这种操作并不会耗费太多时间。虽然这种方式可能存在一些限制,特别是在处理增量更新时,但对于大多数常见的调整来说,它可以直接工作,不需要使用其他编程语言来实现。总的来说,这种方式并不复杂,花费的时间也很少。
这个游戏会有电影模式吗?
游戏将包含电影模式,虽然会有一些系统机制,游戏内将包括过场动画和复杂的情节设定。尽管不会透露太多细节,但可以确认的是,游戏确实有这些内容。此外,也提到了一些限制,虽然并未详细说明。
渲染器能支持像放大一倍的屏幕那样的缩小功能吗?
渲染系统可以支持各种缩放操作,例如将屏幕缩放到原来的两倍大。为了实现平滑的缩放,可以在渲染中实现不同的缩放效果。当前,当缩放到较小的尺寸时,图像可能会出现闪烁或不平滑的效果,尤其是在图像缩小到一半以下时,这是由于使用了线性过滤,而这种方法在缩放到更小尺寸时无法有效地采样所有像素,导致图像边缘产生颗粒感或锯齿感。
为了避免这种问题,可以使用位图映射技术(mipmap),这种技术能够提供更平滑的缩放效果,尤其是在大幅度缩小时(例如将图像缩小到原始大小的四分之一)。然而,由于在游戏的实际需求中并不需要这种精细的处理,因此并没有实现位图映射,而是选择了简单的线性过滤,以保持性能和避免不必要的开销。
会有很多快速事件吗?
游戏中可能不会采用快速时间事件(Quick Time Events, QTE)。尽管这种机制在一些游戏中比较常见,但并不计划在当前的设计中使用。游戏将避免这种过于依赖时机和按键输入的设计方式,可能会选择更合适的交互方式来提升玩家体验。
Quick Time Events(QTE,快速时间事件)是一种游戏设计机制,玩家在特定的时刻需要按下特定的按钮或执行特定的动作,以应对快速出现的事件或情境。这种机制通常用于动作或剧情驱动型游戏中,用来增强紧张感和代入感。
QTE通常发生在游戏中的过场动画或特定情节中,玩家需要在短时间内根据提示快速反应,例如按下某个键或做出某个动作。成功执行QTE通常会导致剧情的顺利推进,而失败可能导致角色受伤或剧情中断。
经典的例子包括《生化危机4》或《神秘海域》系列等游戏,它们利用QTE来增加游戏的互动性和紧张感。
代码重载的解释在哪里?听起来很有趣
实时代码编辑是一种增强开发体验的技术,能够在运行时对代码进行修改并立即看到效果。这种技术允许开发人员在不停止程序的情况下进行调试和修改,极大提高了开发效率和互动性。在该方案中,开发者可以通过设置循环功能,自动化测试或模拟一些操作场景,避免每次都手动输入操作。比如,当角色经过某个楼梯时,可以设置循环来让游戏反复执行这一行为,简化测试和调试过程。
该方法在许多语言中并不常见,但它能够提供优化代码的所有好处,同时保留对代码的完全修改自由。尽管存在一些限制,如结构布局的动态修改需要更复杂的实现方式,但对于大多数开发需求来说,这种实时编辑非常强大和实用,能够大大提高开发的灵活性和效率。
这个游戏会是什么类型的游戏,目的是什么?
这款游戏是一款类似《上古卷轴》类型的冒险游戏,玩家将在一个森林中探险。游戏的重点是编程,旨在通过复杂的编程机制提供挑战。游戏将涉及多层次的交互,玩家需要在不同层级之间进行缩放和行走,同时处理各种复杂的物体系统和交互。开发的目标是让编程部分具有较高的难度,并且会有一些比较复杂的对象系统。
游戏的渲染部分并不是基于 OpenGL,而是采用自制的渲染系统,目前还在开发中,目标是实现更精细和高效的图形渲染。
当游戏完成时,你期望它看起来和在商业引擎中做出来的一样好吗?
完成后的游戏预计在视觉效果上会超过商用引擎制作的游戏,虽然图形上将使用 OpenGL 进行硬件加速,这与其他引擎类似,但有许多方面会做得更好。与常见的商业引擎相比,游戏不会出现加载屏幕或关卡之间的暂停,所有的过渡都会更加流畅,确保游戏体验更加顺畅。
游戏将支持极其庞大的世界,并且已经做了大量工作来处理这种规模,确保游戏的扩展性远超目前市场上的引擎。此外,游戏的对象系统将比市面上现有的任何商业引擎更强大。
虽然在某些特效上可能不会投入太多精力,因为那通常被认为是廉价的装饰效果,但整体上,这款游戏不会是一个小规模的玩具项目,而是一个在多个方面优于市面上现有引擎的复杂且成熟的系统。
我能从这个频道学到如何成为更好的程序员吗?
这场讲座的目标是希望能帮助提升作为游戏程序员的编程能力,虽然内容主要集中在游戏编程上,但不涉及其他类型的编程。虽然不能保证能帮助提升整体的编程技巧,但希望能对游戏程序员有所帮助,特别是在游戏开发的领域。
你计划为这个游戏做 DLC 吗?
目前正在考虑是否为这款游戏发布DLC。很多细节都已经公开。为了确保游戏中仍然有玩家未预见的惊喜,有可能会发布一个未在直播中展示的DLC包,让玩家在下载后发现一些新的内容和意外的惊喜。不过,这并不是一个确定的计划,只是一个可能的想法。
为什么在更高的缩放下他移动得更慢?
角色在更高的缩放级别下移动更慢的原因是因为渲染还没有进行优化。目前,尽管游戏运行大约是每秒十五帧,实际上使用的是一种非常慢的矩形填充方法。优化工作预计将在一两周内开始进行。由于距离越近,屏幕上填充的像素越多,因此渲染的速度越慢。优化后,渲染速度应该能够得到改善,不再出现这种问题。当前的渲染效率远低于应有的水平,大约比应该的速度慢了20倍左右,因此渲染大区域时速度更慢,而渲染小区域时速度较快。
这个游戏会好玩吗?
是否会好玩并不确定。虽然会尽力使游戏有趣,但由于并非专职游戏设计师,因此不能保证游戏一定会有趣。然而,可以保证的是,游戏的编程质量会很好,但是否好玩则无法承诺。
你计划实现某种着色器支持吗?
已经实现了着色器支持,虽然是通过C语言编写的。实际上,已经完成了一些相对复杂的着色器工作,虽然还没有完全投入使用,因为首先需要处理好一些基础的工作,例如Z值和其他相关问题。不过,已经为照明效果做了着色器的准备工作,其中包括使用反射映射测试过的反射效果。