如何在自上而下的横版街机类型游戏中,实现伪3D效果?

0 条评论


  • 5

    Lansi游戏爱好者

    肥皂是我好基友zyydiEricX 等 5人赞同

    你好,从昨天你发问的时候,我就关注了这个问题,但是出于一些因素没有回答,以下我说说我的想法。

    你在所有游戏对象的基类中增加一个Z的属性,Z代表对象的高度,同时增加一个J的属性,J代表跳跃的高度,除此之外,还需要创建XY的属性,这个是存储你人物坐标的参数。

    为什么需要以上这些数据?因为你在2D游戏中要使用第三个方向的参数,但实际上这第三个方向也要使用屏幕坐标的XY来表现,那么你用UNITY中的XY坐标来决定你角色的位置,就很不靠谱。

    那么接下来,你人物在移动的时候,移动的是虚拟的XY坐标参数,跳跃的时候,改变的是J的参数,同时,在每一帧的情况下(考虑性能的话也可以在角色进行移动的情况下)进行显示位置的计算,X如果没有其他要求不变,而显示的Y轴则用虚拟的Y参数和J参数来进行计算,并在虚拟的XY轴处生成影子。

    因为其他物体也存在Z这个高度,那么是否跳的上去,就使用J和Z的对比来进行,同时,也可以根据物体的虚拟XY来决定,这个物体是否阻挡了你的角色前进,如果他是很高,但是其实只是一个圆柱,按理说你是可以从它后面走过去的(前后就是渲染层级的问题了),如果你直接用一个触发器,那么就会算你碰到了阻碍,但是如果你用了虚拟XY坐标,那么能不能通过,是由自身的XY及Z(甚至再加上物体的长宽)来计算的话,那就可以达到,同时也可以用于计算角色和敌人是否在同个轴上

    不要过于依赖UNITY的触发器,效率不高,我第一次在奶牛回答问题,可能会有所遗漏,有问题可以询问我

    更新于 2019-07-26 11:07:54 2 条评论


  • 3

    DragoonKiller

    你实际上需要的应该是: 真·3D场景 + 2D渲染. 你自己做出的"伪Z轴"实际上仍然需要实现"真实Z轴"的所有计算.

    渲染怎么做呢? 首先把摄像机的透视关掉. 然后, 对每个物体设置"遮罩区域", 通过判断角色处于区域的内部还是外部, 决定某个图片是否遮挡角色图片.

    一般横版格斗射击游戏中障碍物的遮罩区域很简单, 就是按物体的y轴分为前后两个部分, 角色如果处于后面的部分则被障碍物遮挡. 你给的参考图片要复杂一些,  右边那个平台的遮罩区域大概是这样的(摄像机在左上, 往右下观察):

    d04abfa130f3814119d056d5106761f3.jpg

    角色处于橙色线所示的部分就会被平台的图片遮住, 否则不会被遮住.

    其它的所有逻辑, 比如在平台上边下边作y轴方向的行走, 还有跳跃等, 和普通的3D一样处理. 不过相对于全方向的3D来说, 你只需要处理立方体碰撞盒或由若干立方体组合而成的碰撞盒, 角色也只能沿着若干个定轴进行移动, 这方面相对于3D游戏会变简单.


    补充:

    有些引擎没有z轴的话... 如何在不使用内置Z轴的情况下实现一个"伪Z轴"?

    首先, 我们把引擎提供的 (x, y) 坐标叫做平面坐标, 你需要额外存储物体的 z 坐标. 然后, 对于各种可以跳上跳下的"平台", 它至少是一个平面: ([x1, x2], [y1, y2], z'). 之后各种交互的判定如下:

    1. 判断角色往上跳时被平台挡住: (x, y) 在 ([x1, x2], [y1, y2]) 范围内, 角色的 z < 平台的 z'.
    2. 判断角色可以站在平台上: (x, y) 在 ([x1, x2], [y1, y2]) 范围内, 角色的 z >= 平台的 z'.
    3. 判断角色被平台从侧面挡住(以及例子中抓住边缘跳跃的动作): (x, y) 在 ([x1, x2], [y1, y2]) 范围内, 但是 z 和 z' 很接近, 或者如果有角色高度参数 h,  可以判断 z' 是否在 [z, z + h] 内.
    4. 对于遮挡关系的判定更麻烦, 但是处理方法类似.

    呃, 实际上就是自己实现一个简陋的3D引擎及碰撞检测. 不是万不得已不要这么做.

    更新于 2019-07-26 10:05:24 2 条评论


  • 1

    RinGBow_VIE"null"

    RinGBow_VIE 赞同

    不要局限于2d

    你做个3d的游戏用2d的素材不就完事了

    发布于 2019-07-31 07:26:50 0 条评论


  • 1

    Kingfeng尝尝我的毒猫!

    Kingfeng 赞同

    我有点没理解【可以高低差的跳跃】,我就先按照我当前的感觉来回答了

    一般来说如果需要在xy平面体系下做出xyz三个坐标的话需要一个转换机制
    f(u,v) = (x,y,z),所以我姑且认为你的意思是,如何在同一个xy坐标下判断两个z坐标的高低

    这就会有一个转折点,如果你游戏本身有Z坐标属性,你只需要用它运算就行。
    对于游戏,会直接使用x,y,z坐标来描述自己在游戏中的位置,这就像游戏的大脑(数据)是3D的,但是最后用2D画在屏幕上

    然后游戏绘画的时候,建立一个转换的方式,吧对应的游戏内真实坐标转换成绘图使用的2D坐标,包括图层


    如果你本身就是用两个坐标x,y来做的
    我个人的意见是加一个钩子,可以获取玩家键盘输入、

    这就很像是快递柜,输入一个密码打开某个门,输入另一个密码打开另一扇门

    吧这个钩子放在需要检测的场景中,用这个钩子勾住玩家的跳跃输入,或者跳跃高度,然后其他对象就可以用这个数据来判断玩家跳到了什么位置。,需要高度信息的物体通过访问这个数据来判断玩家的高度信息,再和自己设定的高度信息进行比对。


    或者原理类似,直接让玩家跳跃动作产生时,回报一个高度给游戏,这个高度会符合玩家跳跃→自由落体的曲线。并且每帧更新

    然后需要玩家高度的情况下就调取这个数字。


    不过如果你的游戏在开发早期,而且需要使用极大量的高度对比,我还是直接建议你用xyz记录,在绘画的时候变换一下就行了

    更新于 2019-07-28 00:23:51 1 条评论


  • 0

    菠萝面包我要做一辈子游戏

    同关注这个问题,我也充满了好奇心。
    印象中有一款叫《CrossCode》(远星物语)的H5游戏。
    这个游戏跳平台是核心玩法之一。
    不仅如此,它也有高度概念,大概分3个等级的高度。


    不知道是否有人来分析一下。

    发布于 2019-07-26 10:33:40 0 条评论


  • 0

    柔王丸力拔山兮气盖世,时不利兮游不驰

    建议不要在“带状卷轴”游戏中 玩跳平台, 空中连击倒是没问题。

    因为2D的带状卷轴游戏, 用画面的Y轴 来表达现实逻辑上的Z轴,而跳跃则是以参数来实现,这样人眼实际上是分不清跳得有多高的。 而跳平台玩法,玩的就是一个精准对落点的预判,如果这点做不到,跳平台是可以跳,但是玩法被限制住了,不好玩。所以 带状卷轴的清版,从80年代末到90年代中后期作品无数,也只有 早年摸索阶段的的 双截龙之类试探性的少玩了几把。 后来都不弄了。

    而且高平台还会挡 后面的东西。

    发布于 2019-07-25 10:54:12 1 条评论


  • 0

    神灯游戏匠心

    需要给 世界定义一个高度概念 也就是 世界Z轴的概念

    之后 实体本身 对于世界 都有个定位
    这样 就可以根据判断实体的Z 实现各种 跳跃  悬浮 等涉及到高度的设计了

    同时  实体 对于 地面概念也能计算出一个值  从而实现影子 概念
    这样 看上去就很真实了

    实体Z加 实体影子 所在地图的 Y 也就是 当前悬浮实体绘制位置
    大概这个情况。。。因为开发游戏中 简单解答一下 希谅解

    发布于 2019-07-24 19:06:50 1 条评论

  • 登录奶牛关账号即可参与讨论

{{question['follower_count']}} 个玩家关注

...

相关元素

相关问题

在游戏开发期间,如何制定最有效的开发计划?

4人关注 2个回答

如何为2D游戏做出空间感、3D感?

72人关注 20个回答

各种点击/放置类游戏的大数字处理有甚特别技巧吗?

9人关注 5个回答

问题被以下收藏夹收录