游戏引擎学习第52天
仓库 : https://gitee.com/mrxiao_com/2d_game
这节的内容相当多
回顾
在游戏中,实体被分为不同的类别:接近玩家的“高频实体”、距离较远并正在模拟的“低频实体”和不进行更新的“休眠实体”。这些实体会根据它们与玩家的距离进行处理,接近玩家的实体会得到更多的更新,而远离玩家的实体则可能有较低的更新频率,甚至可能完全不更新。实体会被映射进出玩家周围的工作环境,当它们被移出时,虽然它们不再完全处于休眠状态,但仍会偶尔接受一些更新。这种结构目前还在实验阶段,未来可能会有所调整。
考虑移除瓦片地图并将瓦片改为实体
在进行实体结构的改进时,我们不再依赖传统的瓷砖地图,而是将所有瓷砖视为活跃实体的一部分。每个实体都有自己的存在和作用,而这些实体的碰撞检测和交互将是非常关键的。在这个过程中,实体与瓷砖的映射关系不再是固定的,而是更加灵活,允许像树木等元素在环境中自然存在并与玩家发生碰撞。为了支持这种结构,需要对碰撞检测系统进行一些调整,包括为实体碰撞分配更多资源。
目前,我们的碰撞检测会随着实体的不同而有所变化。实体的结构会包含一些实际的瓦片数据,但这也带来了新的挑战,需要考虑如何对这些实体进行有效的碰撞检测。为了避免系统过于繁忙,可能需要做一些特殊的细分或优化。尽管这些变化可能会显得有些复杂,但最终的目标是通过多次迭代,得到一个令人满意的系统。
这种思路虽然一开始可能显得有些怪异,但随着系统逐步完善,它将有助于实现更好的结构和更高效的碰撞检测。
测试每个实体与其他所有实体的碰撞 (O(n*n))
目前的做法是暂时假设我们需要对所有实体进行碰撞检测,虽然这种方法会导致碰撞测试的复杂度达到n平方,非常低效,因此在最终版本中无法使用。但在此阶段,我们先假设这种情况发生。
接下来,设想我们为所有的瓦片都创建相应的实体。对于高实体结构,这种做法实际上可以作为一种有力的论证,尤其是与当前使用的休眠实体方式形成对比。当前的休眠实体方式将实体存储在数组中,虽然它能工作,但我们希望能够更灵活地调度高实体,从其他地方调入高频更新的实体。
然而,如何实现这一点还不确定,当前并不清楚如何操作。即便如此,依然决定继续进行下去,观察这一方法的效果。
更新 MovePlayer,执行活动实体的碰撞检测 (接着上一天的继续改代码)
在当前的开发过程中,重点是简化和优化实体碰撞检测的流程。首先,假设我们将对所有实体进行碰撞测试,尽管这种方法在实际应用中效率低下(因为是n平方的复杂度),但它是当前阶段的假设。
接下来,原先需要考虑的每个瓦片的碰撞检测被替换成了对实体的迭代。每个实体被认为是活跃的,且位于特定区域中,碰撞检测将依赖于这些实体而不是瓦片。具体来说,实体的宽度和高度将直接被用于碰撞检测,而不再涉及复杂的空间分割操作。
由于所有实体现在都处于同一空间,原本与空间分割相关的处理被简化,可以完全移除这些多余的代码。当前的重点是计算实体的宽度和高度并进行碰撞测试,步骤变得更为直观和简单。
总之,优化的目标是简化实体间的碰撞检测,减少不必要的计算,确保系统在处理时更加高效。
实体之间的相对位置
目前的工作重点是通过计算实体之间的相对位置来处理碰撞。首先,使用相对位置来确定测试实体与当前实体的关系。通过相对位置,可以轻松地计算出两者之间的差异。计算过程就是通过层次结构来实现,减去两者的相对位置,便能获得玩家的相对位置。
在处理碰撞时,每次迭代都会检测是否发生了碰撞。如果发生碰撞,就会继续处理,并更新相关的实体信息。碰撞处理的方式类似于先前的方法,具体来说,更新实体的位置并加上相关的速度,同时进行必要的裁剪,确保不会穿过墙壁或其他障碍物。
继续循环遍历所有实体,逐一处理每个碰撞,直到所有实体都被检查完毕。在处理过程中,若碰撞发生,相关的更新会被适当修剪,以保持游戏逻辑的一致性。
整体来说,这些步骤与之前的流程保持一致,唯一的变化是通过引入相对位置来简化碰撞检测的计算过程。
考虑不同类型碰撞的不同处理方式
在碰撞检测过程中,首先需要确定碰撞发生时应对的反应。为了处理这一点,需要记住每次与哪个实体发生了碰撞。通过使用实体索引,可以跟踪和标记每个碰撞的对象,这样就能够在处理碰撞时有明确的目标。
当检测到碰撞时,会根据实体的类型决定是否触发特定的反应。例如,碰撞可能会导致玩家的移动被停止,或者触发某种特效。为此,碰撞处理逻辑需要根据不同的实体做出相应的反应。为了简化碰撞检测过程,可以在碰撞检测循环中首先检查是否有有效的实体被碰撞到,如果没有碰撞到有效实体,整个碰撞处理过程可以跳过。
一旦检测到碰撞,并确认是与某个实体发生的,接下来就会处理该实体的碰撞反应。只有在实体存在且发生碰撞时,才需要进一步的处理,否则直接跳出碰撞循环,避免不必要的计算。
这种方法有效地优化了碰撞处理流程,确保只有在必要时才执行更复杂的计算。同时,碰撞反应的具体实现会根据碰撞的实体类型来调整,例如如果是一个门,可能会触发开门的动画或效果。
实现“楼梯”行走
当碰撞发生时,需要获取与碰撞实体相关的所有信息,尽管并不需要关注碰撞过程中的所有细节。在处理碰撞时,可以跳过一些不重要的信息,专注于与玩家交互相关的实体。例如,在涉及到某些对象时,可以不需要处理这些对象的所有属性,只需处理关键的部分,如玩家与这些对象的相对位置。
在游戏中,有些实体需要处于休眠状态,当它们被触发时,需要改变它们的位置或状态。例如,如果一个实体需要被更新,它的相关信息(如坐标)也会随之变化,进而影响到游戏视角(如摄像机)。此外,考虑到高实体与休眠实体的不同,应该设计方法来处理它们之间的差异。
进一步地,游戏中的实体不仅仅是二维的,需要考虑三维坐标系。这一需求将在接下来的开发中得到解决。对于一些特殊实体,例如楼梯,可能需要为其设计特定的交互方式和反应逻辑。在此基础上,逐步积累碰撞处理机制,使得整个游戏的碰撞响应更加多样化。
随着更多的功能逐渐实现,将开始整理和管理大量的数据,确保所有信息都能有效地被处理和控制。这种设计将支持更多类型的实体,并能灵活应对不同情况。
实现 ChangeEntityResidence
在处理实体时,首先需要考虑状态转换,特别是在Residence的状态变化时。例如,当实体的状态从休眠状态转换到高状态时,必须将其从休眠状态移动到高状态;如果实体处于低状态,则需要将其移动到低状态。此外,还需要处理高状态实体的转换,并确保实体的状态始终保持一致。
对于不同的实体,我们需要定义处理规则。对于每个状态,应该明确当实体处于该状态时需要做什么操作。比如,当Residence处于高状态时,它们需要被移动到高空间;而当实体的状态发生变化时,相应的转换操作也应该更新实体的位置或状态。这种转换管理确保了实体的状态始终处于游戏逻辑所期望的位置。
当涉及到复杂的状态转换时,需要考虑到如何处理这些转换。例如,可能会有不同的条件来决定一个实体应该处于哪个状态,并根据这些条件执行相应的操作。此时需要保证这些状态变化不影响其他实体的正常工作,以避免冲突或错误。
总体来说,这些操作在实现过程中较为简单,但要确保在处理每个实体时状态转换能正确执行,以确保游戏逻辑的一致性。
考虑使用缓存来保持高/休眠实体位置一致性
当我们考虑要发布的版本时,出现了一个想法:可以通过一种类似缓存系统的方式来处理实体的状态转换。基本的想法是,不需要一直关注实体的状态,而是能根据需求直接获取特定类型的实体数据。举例来说,当我们在瓷砖地图空间中计算时,可以请求处于“休眠”状态的实体,并保证它是有效的,即使当前实体的状态是“高”,也能在需要时进行反向映射。
这种做法的一个核心概念是,当请求实体时,如果它的状态已经改变,系统会自动进行必要的转换(例如,从“高”到“休眠”或反向)。这样,我们无需担心实体的具体状态,只需要在实际需要时进行相应的映射。为了简化处理过程,考虑在每次移动玩家后进行反向映射,以确保所有实体的状态都得到更新。通过这种方法,每次移动玩家时,都会在最终写回有效的顶级位置。
此外,所有的操作都会发生在“高”状态的实体上,然后再将这些实体推送到“门卫”实体中,确保门卫实体始终有效。这样就不需要单独管理每个实体的状态,而是依赖于系统自动进行转换,确保实体数据的有效性。这种方法使得状态管理更为简洁,并且避免了频繁的映射操作,只有在生成高状态实体时才需要执行一次映射。
总结来说,这种方法的好处在于通过简化实体状态管理,减少了繁琐的映射工作,同时确保了实体数据始终有效。
关于编程技巧的旁白(吐槽)
在编程过程中,重点是通过反复迭代和尝试,逐步完善设计,而不是一开始就尝试完美的预设计。通过这种方式,可以避免过多的前期设计带来的时间浪费,因为前期的计划往往是错误的。实际操作中,先快速实现和试探性设计更有效,在不断的调整和改进中找到最适合的架构。这样做不仅节省了大量时间,也能够让开发者更清楚地理解和掌握实际的需求。
通过这种方式,开发者可以迅速发现问题并进行调整,避免了在不熟悉的领域上花费过多时间。每次原型开发通常只需几个小时,通过这种快速迭代的方法,能够更高效地找到合适的解决方案。总的来说,与其花费大量时间画图和预先设计,不如先在代码中进行尝试和验证,最终以实际经验来驱动架构设计的优化。
在实体更新时重新计算位置到瓦片空间
为了更好地理解如何设计一些功能,首先要做的是将实体的状态处理与坐标转换进行适当的映射。例如,将实体的休眠状态转换为合适的坐标系统,如瓷砖空间。在这一过程中,我们需要通过相机进行坐标转换,并确保每个实体的有效位置,最终能够得到一个合适的瓦片位置。
在设计时,我们意识到,虽然有时会用数学方法进行映射,但是实际操作时,可以依赖已有的映射功能,避免重复编写相同的代码。通过这种方式,可以节省时间,避免过早的设计限制。对于系统架构的探索,尽早进行试验和调整是非常重要的,而不是一开始就做过多的预设计。
每个实体的位置映射都需要考虑到当前的状态,并且避免无效的映射。通过这种方式,我们不仅简化了计算过程,还确保了实体在不同空间中的有效性。这种方法帮助简化了整个流程,使得所有的实体更新和状态转换更加高效和可靠。
总结来说,设计过程应该尽量简单,尽量避免预设太多限制。通过反复试验和迭代,不断完善架构,最终得到最适合的解决方案。同时,在实现过程中,避免不必要的冗余操作,确保系统的高效性。
将实体映射到相机空间
我们需要解决一个问题,就是如何将实体从一个空间映射到另一个空间,特别是从实体空间到相机空间。这要求我们根据当前相机的位置来进行坐标的转换。这个过程实际上是将之前做过的瓦片差异运算应用到现在的情境中,即从当前相机位置减去实体的Entity.Dormant,得到一个新的有效位置。
此外,我们还需要确保实体的状态和相关数据在这个映射过程中得到了适当初始化。例如,实体的“高”状态需要在这个过程中进行初始化,而“休眠”状态的实体需要赋予一个新的位置和方向。对于每个实体,假设它初始时没有速度,并且其z轴位置保持不变。
在这个过程中,虽然涉及了对方向、位置等的计算和更新,但总体来说,关键是确保每个实体的状态和位置在空间转换中得到正确处理。至于命名方面,也有一些调整,。
总之,这一系列的步骤确保了实体在不同空间中的有效性和正确性,同时也考虑到未来可能需要进行的更新和改动。
在调试器中探索代码
首先,我们开始时希望从玩家变为活跃状态的那个点开始。在触发某些事件(例如按下空格键)后,我们将添加一个新的实体,并将其设置为“休眠”状态。这是为了确保实体处于正确的初始状态。接下来,我们初始化玩家并检查实体的不同版本,尽管这些版本的实体此时并未激活或生成实际影响。
然后,我们需要调整相机的位置,并更新实体的位置和状态,以便将其正确映射到游戏世界中。这个过程包括设置实体的“休眠位置”,并根据相机的当前位置调整映射。
在实体初始化过程中,我们还需要确保对“高”实体的正确处理,并完成其他必要的初始化步骤。这个过程中可能会出现一些细节错误,比如忘记设置某些参数,如Residence的位置,导致实体没有被正确标记为“高”。这种情况下,我们需要确保在最后一步为实体正确设置“Residence”,否则它不会被正确识别。
在调试过程中,可能出现某些步骤未执行的情况,例如没有正确触发断点或未添加实体。为了解决这个问题,需要逐步检查每个细节,确保每个操作都得到了正确执行。
最终,我们的目标是确保所有的实体状态和数据在每一步都被正确初始化,并确保游戏世界中的位置和映射关系得到了更新和调整。
当请求更高的Residence,改变Entity的Residence
我们需要进行一些更改。首先,我们将改变实体的Residence状态,实际上可以通过简单的修改来实现。更重要的是,实际上不需要改变Residence本身,只需要确保实体的住址正确映射。这个过程包括检查实体的“Residence”状态,并根据需要更新。
接下来,我们检查实体的索引,确保它与所需的资产匹配,之后设置正确的“高”状态。这里的关键是根据实体所在的位置调整它的状态,确保它的居住地与当前的“高”或其他状态一致。
一旦完成这些检查和调整,我们就可以通过断言来确保Residence状态已正确更新。如果需要调整Residence的居住水平,我们只会允许提升,而不是降低。这是确保逻辑正确性的关键。
然后,我们会继续检查实体的其他属性,像是偏移量和面向方向。这些参数需要通过游戏逻辑动态调整,以便确保实体能够按照预期行为移动。
我们注意到,在某些情况下,实体没有正确碰撞或移动。为了解决这个问题,我们需要确保在每次操作后都正确地添加实体并检查其相互作用,尤其是在碰撞检测方面。通过逐步调试,我们可以找出问题并改进实体之间的交互。
调试实体碰撞
在调试碰撞时,发现一个问题:实体在某些情况下会与自己发生碰撞。为了解决这个问题,需要确保在碰撞检查过程中,不会将实体与自身进行比较。可以通过测试指针是否指向相同的实体来避免这种情况。为了避免对自己进行碰撞检测,可以通过简单的条件判断,确保实体指针不相等,才能进行碰撞检测。
在进行碰撞检测时,第一次检查时,我们不会尝试与同一个实体碰撞。之后,当我们添加玩家实体时,可以确保碰撞检测开启,这样玩家和其他实体才会发生碰撞。
尽管我们已经确保了碰撞的正确性,但在碰撞时,实体的运动并不像预期的那样流畅。这表明系统中可能仍然存在一些问题,例如碰撞算法中的epsilon误差,导致碰撞检测不完全准确,特别是在处理实体的向量和艺术碰撞方面还需要进一步调整和优化。
目前,虽然碰撞检测已经能够正常工作,但系统仍然有一些细节需要修复。
调试粘滞碰撞
在处理碰撞问题时,遇到了一些困难,尽管代码完成了最基本的实现,仍然有一些细节没有被处理。通过对碰撞检测进行调试,发现一些问题可能源于没有正确处理某些特殊情况,比如碰撞时忽略了自身的碰撞检测。这导致了某些情况下碰撞没有正确发生。为了解决这个问题,需要确保碰撞逻辑中排除了自身碰撞的情况。
另外,碰撞系统并没有考虑到所有可能的情况,特别是当没有处理好特定实体的碰撞时,可能导致未能正确检测到碰撞。通过增加必要的判断,确保实体在碰撞时正确响应,可以解决这个问题。
进一步来看,碰撞的改进包括修复了某些实体的状态,确保他们在必要时不再被卡住。通过解决这些问题,至少目前滑行的行为已经恢复正常,虽然仍然有一些小的错误需要修复。最终的目标是确保碰撞系统足够健壮,避免在未来的使用中出现不必要的错误。
接下来,需要进一步改进世界和相机的交互,尤其是在处理相机跟随实体时的行为。这包括一些细节问题,如门与墙的交互,以及如何在相机视野内正确处理实体的显示。虽然目前还没有完全实现这些功能,但正在逐步完善这些方面。
恢复相机运动
在进行相机空间的实验时,主要目标是确保根据摄像机的位置来更新实体的位置。通过计算摄像机的移动,我们可以在游戏世界中调整其他实体的位置,使它们与摄像机的运动方向相反。这样,当摄像机移动时,实体会在屏幕上看起来朝相反方向移动,从而达到正确的视觉效果。
具体来说,首先需要计算摄像机相对当前实体的偏移量。如果摄像机的运动超过了允许的范围,就必须移动实体,以确保它们与摄像机的运动保持一致。这个操作类似于将所有实体的运动与摄像机的移动相对调换方向。
为了实现这一点,我们需要遍历所有实体,并应用相应的偏移量。每次更新时,都会计算出相机移动的距离,并根据这个差异调整所有实体的位置,使它们看起来与摄像机的移动方向相反。
在实施过程中,碰撞检查也变得重要,因为某些墙壁或障碍物可能会阻止实体的移动。因此,需要进一步检查并修复实体在碰撞后的行为,确保它们不会被卡住,或是由于碰撞导致位置错误。
此外,还需要考虑游戏世界的边界和包装问题。由于目前不支持包装功能,实体不能穿越世界的边缘,因此在进行相机和实体移动时需要确保它们不会超出可视区域。
总体来说,这一过程涉及到相机与实体之间的同步更新、碰撞处理以及正确的视觉效果实现,确保游戏世界中的所有元素能够流畅地与相机运动进行配合。
后面的待办事项
我们计划开始处理一些任务。首先,我们将着手放置墙壁和楼梯,并确保它们处于合适的位置。接下来,我们会退一步,仔细观察实体及其他相关内容的当前状态。通过这一过程,我们希望能更清晰地理解各个部分的互动,并进一步调整和优化它们。
具体来说,我们将处理实体的安排,并考虑如何将怪物、生命值等元素添加到场景中,以便能够开始观察实体的构建和运作。我们可能会在这方面进行更多的调整,并进行实验,看看如何优化结构和互动。我们也计划通过发送大量实体并检查“休眠”和“非无人机”阵列的行为,确保这些组件的正常工作。
此外,我们还需要做一些改进,特别是在高优先级、低优先级以及休眠实体的结构上,一旦模拟中有实体参与,我们将确保这些元素的行为是预期中的。我们还会关注没有摄像机的世界,并进行进一步的测试和调整。
接下来,我们会安排一些函数处理工作,尤其是在摄像机移动时的反应,以及新实体和旧实体的处理。在此过程中,我们也会利用一些缩放功能,并针对瓦片和空集进行映射和处理,确保游戏世界的细节和结构得到有效管理。
最终,我们的目标是确保这些改动能顺利完成,并使整个系统运行得更加流畅,达成预期效果。
为什么不频繁更新的实体不能在实体的更新逻辑中进行?
我们讨论了在实体更新逻辑方面的一些挑战,特别是当实体数量非常庞大时,如何优化性能。传统的方法是通过频繁调用虚拟函数来检查每个实体是否需要更新,但这种做法会导致效率低下,尤其是当实体数量达到非常大的规模时,例如一百万个实体。
问题的根本在于,如果每次都对每个实体进行检查并调用虚拟函数,这将需要大量的计算资源,严重影响性能。尤其是在大规模实体场景中,这种做法是不可扩展的,因为随着实体数量的增加,性能会显著下降。
为了应对这一问题,可以通过将实体更新逻辑分成高频和低频两个层次来优化性能。这样,高频更新的实体(例如需要实时更新的敌人)会频繁检查,而低频更新的实体(例如不需要频繁更新的对象)则可以减少检查频率。通过这种方式,可以有效地扩展实体数量,而不会因为性能问题而产生瓶颈。
这种做法的核心优势在于通过减少不必要的虚拟函数调用来优化计算,降低内存开销,并提高整个系统的扩展性。只要我们将低频更新设置得足够低,我们就能保持系统的良好性能,同时不牺牲准确性。
通过这种方法,我们能够在保持性能的同时,扩展实体数量,甚至可以处理大量实体而不影响游戏体验。这种平衡使得系统在处理大量实体时依然高效,且能够根据需求调整更新频率,从而避免了传统方法带来的性能瓶颈。
为什么你想使用 3D 向量来表示位置,尽管 Z 值总是整数?
讨论的重点是为什么在游戏中使用三维向量(x, y, z)来定位实体,而不仅仅依赖于二维坐标。一个常见的问题是,当z值总是整数时,为什么还需要z坐标。
我们开始考虑一个基本问题:在游戏中,实体的坐标需要反映出它们在空间中的位置,并且这些位置会影响渲染和碰撞。比如,在一个有跳跃功能的游戏中,实体可能会离开地面(例如角色跳跃)。此时,z坐标的作用就变得尤为重要,它不仅能表示角色的垂直位置,还能帮助确定实体在三维空间中的前后关系。
通过简单的y坐标来处理前后关系的问题是存在的,因为y坐标越大,表示物体距离镜头越远。然而,仅凭y坐标无法准确地处理一些情况,比如角色跳跃时,他可能在视觉上仍然位于树前方,即使他在y轴上已经上升。
因此,单纯依赖y坐标是不够的。需要引入z坐标,它可以帮助我们理解实体的“高度”并维持正确的排序。这样,尽管y坐标可以表示物体在屏幕上的垂直位置,但z坐标则决定了物体是否在其他物体的前面或后面,从而避免了渲染时出现错误的覆盖关系。
最终,x、y、z三个坐标的结合使得我们能够更准确地渲染和处理实体,尤其是在需要考虑飞行的敌人或跳跃的角色等动态物体时。通过引入z坐标,可以确保跳跃的角色始终保持在树的前面,或者其他物体的前后关系始终正确。这样,三维坐标系统为游戏世界中的物体提供了更丰富的空间表示。
Minkowski 碰撞检测需要轴对齐吗?
在开发过程中,首先实现了一个非常简单的算法,但目前的版本还不够理想,需要进一步改进。随着开发进度的推进,计划做得更好,尤其是在处理旋转和形状变异时。虽然目前没有打算将该算法用于动画旋转,但它能够处理形状的变化,例如圆形等,这对后续的游戏开发会有帮助。
目前,考虑到原型设计的需求,认为不需要太多复杂的组件,可以先实现简单的基础功能(比如注入器)。当开发继续推进时,旋转的处理可能会得到更好的实现,以适应游戏中可能出现的不同形状变换。
在此阶段,所有问题都已经解答完毕,开发者准备结束今天的工作,等待几秒钟以防还有问题出现。
你不是刚刚实现了一个简易的关系数据库吗?你认为这是理解今天代码的好思维模型吗?
在讨论关系数据库时,首先提到了实现一个非常简单的数据库作为底层支持。在某些情况下,关系数据库被认为是一个有效的心智模型,尤其在提到它如何基于键来进行数据的查询和收集时。例如,可以通过键将数据从多个表中提取出来,这在某些场景下是一个非常有用的思考方式。
然而,这种方式也有其局限性,尤其是在现代编程世界中,传统的关系数据库常常无法满足处理更复杂的数据结构和操作需求。比如,许多操作和数据结构(如指针和图形)在传统的查询语言(如SQL)中很难实现,导致开发者不得不依赖存储过程等复杂的机制,这些机制往往会引发许多不希望出现的问题。
因此,虽然关系数据库的基本概念(例如存储和查询)可以是一个有用的起点,但在实际应用中,如果过于依赖传统的关系模型,可能会导致效率低下和实现上的困难。对于那些更复杂的需求,关系数据库可能并不是最好的选择,尤其是对于一些更灵活的数据结构和操作。
我注意到你的角色之间不会发生碰撞。我以为你已经改进过了?
目前,游戏中的碰撞检测系统已经能够正常工作,玩家与其他实体的碰撞是可以观察到的。现在使用的是矩形来表示玩家的足迹,并通过这些矩形来判断是否发生碰撞。虽然这些矩形会在瞬间发生碰撞,但有时并不需要阻止玩家继续前进,尤其是在某些场景下,例如玩家与物体之间的重叠是允许的。
接下来,系统需要确保在渲染时正确处理物体的绘制顺序。为此,需要根据物体的 y 坐标进行排序,以确保当物体在另一个物体后面时,应该在渲染时把它绘制在后面,而不是覆盖在前面。目前,渲染系统并没有根据这种排序来处理,导致物体的绘制顺序可能不符合预期。
总之,碰撞检测系统已经可以正常工作,但渲染系统还需要调整,以确保物体的前后关系得到正确显示。
跳跃时只需要 x, y, z 坐标就能实现吗?[代码更改]
目前的解决方案在处理“跳跃”方面并不理想,尽管它已经能够通过一些基本的运动方程来模拟。跳跃本质上是通过给物体一个向上的速度,然后施加重力来实现的,使用的是三维坐标系统。尽管如此,解决方案的实现尚未经过充分测试,也不完全符合实际需求,特别是在操作上并不够高效或友好,尤其是在涉及到像现金等方面的需求时。
从运动方程的角度来看,跳跃的模拟是基于已知的物理定律,主要包括速度、加速度、时间步长等因素。这些方程帮助计算物体的位移和速度更新,尽管当前的模拟可以进行跳跃动作,但尚未完全优化,可能出现一些不希望的行为,比如物体能够重复跳跃(如双跳、三重跳),且没有限制条件来防止这种情况的发生。
另外,整个系统还需要进一步优化,特别是在对跳跃的速度、重力加速度和地面碰撞的处理上。当前的设置并没有完全解决这些问题,并且在实现上还有些许混乱。尽管如此,基于已有的运动方程和物理原理,系统理论上已经具备跳跃的基础实现,只是尚需更多的细化和测试。
总的来说,虽然基本的跳跃系统可以运作,但它还需要优化和完善,尤其是在控制跳跃高度、限制不必要的跳跃行为和提高操作效率等方面。
我们会为高频实体切换到稀疏存储吗?
计划是使用不同类型的存储结构来管理实体。例如,针对高频振荡器,计划使用一个小型的高频实体数组。此外,还会有一个较大的实体数组来管理其他实体。关于低频实体的存储,还不确定是否会单独分配存储空间,或者低频实体是否会被当作休眠状态的实体进行操作。具体实现方案还需进一步决定和调整。
你会如何处理跳上一个平台或表面并采取新的基准高度?
处理在平台或表面上跳跃并采用新的基准高度,可以根据游戏类型和具体需求有所不同。如果在游戏中没有真正的跳跃动作,只是角色作为动画的一部分进行轻微的弹跳,那么就不需要考虑太多的物理碰撞和高度管理。可以简单地通过设置角色的基准高度(z值)来模拟跳跃。
如果涉及到实体的实际跳跃,可能需要考虑不同的表面高度。例如,当角色站在不同的瓷砖或平台上时,根据表面的z值来调整角色的基准高度。通过检测角色站立的位置,获取该位置的z值作为新的基准高度。此时,角色的z值就是站立表面的z值。
这种处理方式需要根据具体游戏的需求来决定,并且可能因游戏机制不同而有所变化。
你认为平台游戏中的角色或怪物运动物理怎么样?也就是说,我按右键,但它开始加速,而不是直接移动?
在平台游戏或其他类型的游戏中,角色或群体的物理运动通常取决于设计的控制感觉。有些游戏倾向于通过加速和减速来模拟更自然的移动,而不是让角色立即开始或停止运动。这种方式能够让玩家感受到一种更平滑、更渐进的移动方式。加速和减速的过程,可以让角色的移动变得更加连贯,避免那种瞬间的“开关”式的移动,因为这种移动方式通常会显得不够自然,也可能让玩家感觉不舒服。
设计控制时,需要考虑玩家期望的游戏感觉。有些游戏偏向更精确的控制,玩家希望每个动作都能直接反应;而另一些游戏则可能更注重提供一种更灵活、更“游泳”般的控制感,这种感觉更具流畅性。
总的来说,选择加速或瞬间响应的方式,取决于游戏的风格和目标体验,开发者必须根据游戏类型和玩家期望来做出设计决策。
区域的地面是平的,还是会有坡度或 3D 区域(例如山丘)?
决定保持区域平坦的原因是因为不喜欢山丘或斜坡在二维空间中的表现。对于三维空间,山丘可以很好地工作,因为环境是一致的,视角也更自然。然而,在二维空间中,山丘常常不符合预期,可能导致像射击这样的问题:射击会因为地形的影响而碰到地面或其他物体,导致不准确的结果。因此,平坦的地面更符合当前的设计需求。虽然可以有一些悬挂的物体、拱门等遮挡物,但整体上不会有山丘。
你能迅速而轻松地将他脚下的黄色瓦片改为灰色并且圆形,像跳跃的阴影吗?完全不是必须的,但为什么不呢![代码更改]
可以通过修改矩形调用的方式来改变角色脚下的黄色瓷砖,使其变为灰色并呈现圆形的跳跃阴影效果。实现方法之一是使用已存在的阴影图像,将其添加到渲染中,并确保阴影的位置不会随着角色的移动而改变。如果不喜欢矩形图形,可以关闭绘制矩形的功能,改为直接绘制阴影。阴影的透明度(alpha值)可以通过与角色的高度相关的缩放来调整,从而让阴影随高度变化变得更加真实。
具体实现中,可以通过乘以透明度值来控制阴影的强度。当角色跳跃时,阴影会根据高度变化,使其在视觉上看起来更自然。如果透明度值小于零,可以将其限制在零以上,避免出现不自然的效果。最终,这种方法能够确保阴影的变化符合物理和视觉效果的要求。
如果你在房间中间添加墙壁,它们会作为实体处理进行碰撞检测,还是单独处理?
所有的元素,包括房间中的墙壁和树木,都会作为实体处理并参与碰撞检测。具体来说,所有的物体,无论是墙壁、树木还是其他元素,都将作为独立的实体进行管理。当玩家或其他物体在游戏场景中移动时,所有这些实体都会参与计算,确保它们的碰撞和交互被正确处理。
在游戏中,当物体移动到屏幕外时,它们会被委托回分布式映射中进行管理,从而保持性能并确保场景的动态更新。这种处理方式确保了游戏场景的物理交互更为精确,并且能够有效地管理大量的动态物体。
alpha阴影讲解!
为了实现阴影的效果,当角色跳跃时,阴影会逐渐变小。首先,通过加载一个阴影位图并将其绘制在角色下方,阴影就可以呈现出来。随着角色离地面越来越远,更多的光线能够穿过原本遮挡的区域,从而影响阴影的大小。
通过使用阿尔法混合技术,可以控制阴影的透明度。具体来说,通过将角色的透明度与阴影的透明度进行混合,达到随着角色的跳跃阴影逐渐变淡的效果。这个过程利用了阿尔法值,影响了阴影的透明度,模拟出跳跃时阴影逐渐消失的感觉。
虽然当前系统不具备复杂的缩放能力,但可以通过调整阿尔法系数来实现透明度的变化。例如,系数从0到1的变化可以使阴影的透明度逐渐减弱,这个过程非常直观且有效。最终,通过这种方法,阴影随着角色的跳跃高低变化,产生了自然的动态效果。
将矩形改为位图对你的玩家之间的碰撞计算有何影响?
改变矩形的大小并不会直接影响玩家间的碰撞计算。玩家的碰撞计算是基于其他数据结构和算法进行的,而不是仅仅依赖于我们绘制的位图。位图主要用于显示和渲染,并不直接参与物理碰撞计算。因此,改变位图的尺寸或形状(比如矩形的变化)并不会影响到玩家之间的碰撞逻辑,碰撞计算依赖于更底层的物理计算,而非视觉表示。
你不应该在一个线性色彩空间中进行这次混合吗?
讨论中提到了线性颜色空间与伽马曲线的关系。在渲染过程中,提到应该在线性颜色空间中进行混合,但目前并没有做到这一点。伽马曲线被提到作为一个问题,尤其是在显示器的伽马测试中。通过测试的伽马曲线,可以看到图形的每平方米的亮度值(以坎德拉为单位)。尽管如此,目前渲染还没有进入到线性空间的处理阶段,仍处于伽马空间中,未考虑这些线性调整。
游戏的核心机制什么时候开始投入使用?是开发周期的早期还是后期?
在这个项目中,核心游戏机制并不会在早期阶段就介入,而是在较晚的周期才会开始出现。由于这是一个教育性质的项目,目的是教授编程,因此在游戏设计的初期阶段会重点讲解不同的编程部分,而不是直接进行核心游戏机制的设计和迭代。
通常,游戏机制的搭建会在项目初期就进行,但这个项目的目标并不专注于游戏设计,而是更侧重于游戏编程的教育。因此,核心机制的实现将在渲染完成后进行,之后会处理碰撞检测、渲染、音效和音乐等内容。虽然这些内容将逐步完善,游戏本身在早期阶段并不会完全可玩。
在完成这些基本功能后,将进入核心游戏机制的开发阶段,包括碰撞检测、渲染、互动、实体系统等,接下来将花费数月时间处理引擎相关内容,之后才会过渡到其他系统的开发。
从圆形到椭圆形的碰撞检测有没有简便的转换方法?
在讨论从圆到椭圆的转换时,提到将圆形转换为椭圆的操作涉及到一定的计算工作,虽然比处理圆形稍微复杂一些,但并不需要大量额外的工作。在碰撞检测中,椭圆可以通过对圆形进行适当的缩放来实现,这种变换相对简单,可以通过调整圆的半径来使其成为椭圆。
关于是否有一个简单的方式将圆转换为椭圆的问题,答案是可以的,只需通过调整一个轴的缩放比例即可,将圆的某一维度放大或缩小,从而使其变成椭圆形状。这个过程可能涉及到一些数学运算,比如缩放因子,但并不会复杂到需要非常复杂的处理。
你推荐那些刚入门游戏开发的人学习做游戏引擎,而不是使用像 Unity 或 Unreal 这样的引擎吗?
学习游戏引擎的开发与使用现有引擎(如Unity或虚幻)取决于个人的目标。如果目标是成为游戏程序员,那么了解游戏引擎的工作原理是很有帮助的,尽管不一定需要自己编写引擎。但如果主要想做游戏设计而不是游戏引擎开发,可能并不需要深入学习引擎的细节。即使如此,了解渲染等系统的基本原理仍然对游戏设计者有益,因为这些知识有助于理解系统的限制和可能带来的设计机会。不知道这些内容可能会成为设计时的障碍。了解游戏引擎的程度取决于具体的工作计划,不同的角色对这些知识的需求程度不同。
你分配了 alpha 的矩形框,是否就是在角色受到敌人或障碍物伤害时,你用来分配生命值的那个框?
在游戏中,矩形框分配的角色伤害点(hit points)和障碍物的处理方式可能有所不同。例如,在一些游戏中,像《塞尔达传说》那样,伤害点可能与角色的碰撞框直接关联,而在其他游戏中,角色受伤的判定可能更为复杂,涉及到位置和被击中的时机。例如,像《以撒的结合》中的位置判定就有可能依赖于角色的具体位置和敌人攻击的路径。
具体来说,角色受伤的判定可以通过不同方式来处理:例如,碰撞框可能位于角色的前方或后方,攻击如果穿过角色后方可能仍然会造成伤害,而《塞尔达传说》采用的则是更为直接的伤害判定方式。虽然后一种方式更为现实,但可能不容易被玩家理解,因为玩家需要通过一些模糊的判断来识别攻击是否会命中角色。因此,开发者可能需要尝试两种方法,并在游戏运行过程中感受哪种方式更适合游戏的整体感觉。
像素级碰撞检测与整体形状碰撞检测有多常见或实用?哪个更有趣?
像素级碰撞检测是可行的,但它在处理卷积时存在问题,因为在进行像素逐像素检查时,物体可能会发生“隧道效应”,即物体穿透其他物体而没有发生碰撞。此外,像素逐像素检查可能会导致一些不必要的碰撞检测,这在某些情况下并不理想。因此,尽管像素级碰撞检测是可行的,它并不是非常实用。
更常见且实用的方法是使用多边形碰撞检测,特别是使用一个紧凑的多边形。这样的多边形碰撞检测与像素级检测的结果几乎相同,同时还能够处理卷积体积,这使得它比像素级检测更加灵活和高效。因此,推荐使用多边形检测来替代像素逐像素的检测方法。
相关文章:

游戏引擎学习第52天
仓库 : https://gitee.com/mrxiao_com/2d_game 这节的内容相当多 回顾 在游戏中,实体被分为不同的类别:接近玩家的“高频实体”、距离较远并正在模拟的“低频实体”和不进行更新的“休眠实体”。这些实体会根据它们与玩家的距离进行处理,接…...

【热力学与工程流体力学】流体静力学实验,雷诺实验,沿程阻力实验,丘里流量计流量系数测定,局部阻力系数的测定,稳态平板法测定材料的导热系数λ
关注作者了解更多 我的其他CSDN专栏 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 数字信号处理 光电融合集成电路…...
【HTML】根据不同域名设置不同的网站图标(替换 link 中 href 地址)
文章目录 代码实现 <!DOCTYPE html> <html><head><meta charset"utf-8" /><meta http-equiv"x-ua-compatible" content"ieedge,chrome1" /><meta name"viewport" content"widthdevice-width&q…...

使用Navicat从SQL Server导入表数据到MySQL
在表上右键选择导入向导 选择ODBC 1.内输入ip即可,不需要端口号 一定要勾选允许保存密码 选择需要的表,下一步 根据需求,可修改表名、是否新建表 根据需求修改不同表的字段类型和长度 按需选择导入方式...

私有云dbPaaS为何被Gartner技术成熟度曲线标记为“废弃”?
当云计算席卷而来,基于云基础设施的数据库部署也改变了数据库。在传统的私有化部署(On-premises)和公有云部署(Public Cloud)之间,不断融合的混合IT(Mixed IT)形式成为最常见的企业级…...
牛客网 SQL1查询所有列
SQL1查询所有列 select id,device_id,gender,age,university,province from user_profile 每日问题 C 中面向对象编程如何实现数据隐藏? 在C中,面向对象编程(OOP)通过封装(Encapsulation)实现数据隐藏。…...

【经验分享】OpenHarmony5.0.0-release编译RK3568不过问题(已解决)
问题描述 根据操作手册正常拉取代码,然后编译OpenHarmony5.0.0版本rk3568项目 编译命令 ./build.sh --product-name rk3568 --ccache出现如下报错 然后真正开始出错的位置是下面这句log FAILED: ../kernel/src_tmp/linux-5.10/boot_linux ../kernel/checkpoint/c…...
如何使用ERC404协议
ERC404 ERC404协议的性质 ERC404不是一个开发代码工具包,而是一种智能合约标准规范。它就像是一份蓝图或者规则手册,规定了在以太坊区块链上开发特定智能合约应该遵循的接口、函数和事件等规则。如何使用ERC404协议 定义合约接口 首先,在开发智能合约时,要根据ERC404标准定…...

240004基于Jamva+ssm+maven+mysql的房屋租赁系统的设计与实现
基于ssmmavenmysql的房屋租赁系统的设计与实现 1.项目描述2.运行环境3.项目截图4.源码获取 1.项目描述 该项目在原有的基础上进行了优化,包括新增了注册功能,房屋模糊查询功能,管理员和用户信息管理等功能,以及对网站界面进行了优…...
ORACLE RAC ADG备库报错ORA-04021: timeout occurred while waiting to lock object
问题:核心的灾备 RAC ADG 备库,这两天频繁重启,并且报如下错误,通过查看MOS,发现是个BUG ADG备库的ALERT错误日志如下: Errors in file /u01/app/oracle/diag/rdbms/hxxxsz/hxxxsz1/trace/hxxxsz1_lgwr_69…...

CAPL如何设置或修改CANoe TCP/IP协议栈的底层配置
在CANoe中创建网络节点作为以太网主机时,可以给其配置独立的TCP/IP Stack。 配置的协议栈有一些底层配置参数可以在界面上设置或修改,比如: MTU上图中MTU显示500只是图形界面显示错误,正确值是1500。 TCP延迟确认这些参数也可以通过CAPL动态配置,甚至CAPL还可以配置很多界…...

git使用教程(超详细)-透彻理解git
一.核心基础 核心概念有六个 首先请把与svn有关的一切概念暂时从你的脑海中移除掉,我们要重新认识本文所讲述的所有概念。 1.worktree worktree是一个目录,你在这里对文件进行增加、删除、修改。也就是我们常说的工作区。在git中worktree必须要与一个…...

【2024 Dec 超实时】编辑安装llama.cpp并运行llama
首先讲一下环境 这是2024 年12月,llama.cpp 的编译需要cmake 呜呜呜 网上教程都是make 跑的。反正我现在装的时候make已经不再适用了,因为工具的版本,捣鼓了很久。 ubuntu 18 conda env内置安装。 以下是可以完美编译llama.cpp的测试工具版…...

Docker介绍、安装、namespace、cgroup、镜像-Dya 01
0. 容器简介 从生活上来说,容器是一种工具,可以装东西的工具,如衣柜、背包、行李箱等等。 从IT技术方面来说,容器是一种全新的虚拟化技术,它提高了硬件资源利用率,结合k8s还可以让企业业务快速横向扩容、业…...

docker 搭建自动唤醒UpSnap工具
1、拉取阿里UpSnap镜像 docker pull crpi-k5k93ldwfc7o75ip.cn-hangzhou.personal.cr.aliyuncs.com/upsnap/upsnap:4 2、创建docker-compose.yml文件,进行配置: version: "3" services:upsnap:container_name: upsnapimage: crpi-k5k93ldwf…...

3D一览通在线协同设计,助力汽车钣金件设计与制造数字化升级
汽车行业已迎来智能化的汹涌浪潮,在此背景下,零部件制造商唯有积极应对,以智能制造为核心驱动力,方能跟上行业发展步调,在激烈的市场竞争中抢占先机。作为整车制造不可或缺的核心组件之一,汽车钣金件亦需紧…...
基于Matlab实现三维地球模型(源码)
利用MATLAB强大的图形处理能力和数学计算功能构建的可视化应用。这个模型允许用户在三维空间中观察地球,并且能够动态地旋转地球模型,同时还可以模拟卫星在其周围的运动轨迹,为学习地球科学、天文学以及航天工程等领域提供了一个直观的教学工…...

【Tomcat】第五站:Servlet容器
Tomcat启动后,获取到项目当中所有的servlet的WebServlet中的配置信息。将配置信息和类对象都写入一个map集合当中。 map就是一个key-value类型的集合。 在MyTomcat中我们获取到了类对象和注解值。 Tomcat与请求连通 1. ServletConfigMapping 1. 创建一个config包…...

CTF 攻防世界 Web: FlatScience write-up
题目名称-FlatScience 网址 index 目录中没有发现提示信息,链接会跳转到论文。 目前没有发现有用信息,尝试目录扫描。 目录扫描 注意到存在 robots.txt 和 login.php。 访问 robots.txt 这里表明还存在 admin.php admin.php 分析 在这里尝试一些 sql…...
【SpringBoot中MySQL生成唯一ID的常见方法】
SpringBoot中MySQL生成唯一ID的常见方法 在Spring Boot中,为MySQL生成唯一ID有多种方式,每种方式都有其特定的概念、优越点和使用场景。以下是详细的说明和代码示例: UUID 概念: UUID(Universally Unique Identifier࿰…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...

什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...

一些实用的chrome扩展0x01
简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序,无论是测试应用程序、搜寻漏洞还是收集情报,它们都能提升工作流程。 FoxyProxy 代理管理工具,此扩展简化了使用代理(如 Burp…...
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
一、前言 在HarmonyOS 5的应用开发模型中,featureAbility是旧版FA模型(Feature Ability)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文获取方式,而非依赖featureAbility。 FA大概是API7之…...
Vue 3 + WebSocket 实战:公司通知实时推送功能详解
📢 Vue 3 WebSocket 实战:公司通知实时推送功能详解 📌 收藏 点赞 关注,项目中要用到推送功能时就不怕找不到了! 实时通知是企业系统中常见的功能,比如:管理员发布通知后,所有用户…...