找回密码
 立即注册
搜索
查看: 2633|回复: 11

[其他] 废帖再利用 如何自己写一个走格子(推箱子类)游戏

[复制链接]
发表于 2021-10-3 03:02 | 显示全部楼层 |阅读模式
本帖最后由 mes 于 2021-11-11 01:34 编辑

关于垂直看地面但仍然可以看到人脸的日式视角
初想似乎不可能,但其实还有各种奇怪的视角,比如边缘是弯曲的鱼眼视角,只是没有什么人用罢了。既然有a这种斜透视
只要旋转一下,不就是那种日式视角了吗。以下是资料
blog.csdn.net/tkokof1/article/details/89152607
docs.unity3d.com/ScriptReference/Camera-projectionMatrix.html
实际上我也没认真看,不过刚好有个脚本至少证明这是可行的
unitylist.com/p/4mi/Unity-oblique-projection

可以看到立方体的顶是正方形
希望有高人直接给个能直接用的,或者只要有正确的Matrix大概也行了。要是没有大概自己摸索也总能摸出来就是了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

     
发表于 2021-10-3 03:36 | 显示全部楼层
你应该学习三角力量2,直接把模型倾斜45度角

—— 来自 S1Fun
回复

使用道具 举报

 楼主| 发表于 2021-11-11 02:19 | 显示全部楼层
并不是很难,如果想挑战可以自己全写,当然耐心和努力还是需要。
工具为godot
首先如何一走是一格
  1. func move_tween(input_x,input_y,obj,spd = 1):
  2.         tween.interpolate_property(obj, "position",obj.position, obj.position + Vector2(input_x * tilew,input_y * tileh),1.0/speed/spd, Tween.TRANS_LINEAR, Tween.EASE_IN_OUT)
  3.         tween.start()
复制代码

因为tween完成后会发信号,也可以用来当完成移动可以显示动画的判断,可以不用脚本连接但为了不会忘建议自己写
  1. $Tween.connect("tween_all_completed",self,"_on_Tween_tween_all_completed")
复制代码

然后就可以
  1. func _on_Tween_tween_all_completed():
  2.         if gameclear:
  3.                 player.set_animation("default")
  4.                 player.playing = false
复制代码

如何接受输入后移动
  1. func _process(_delta):
  2.         if tween.is_active():
  3.                 return
  4.         if gameover || gameclear:
  5.                 return
  6.         input_x = int(Input.is_action_pressed("ui_right")) - int(Input.is_action_pressed("ui_left"))
  7.         input_y = int(Input.is_action_pressed("ui_down")) - int(Input.is_action_pressed("ui_up"))
  8.         if (input_x == 0 && input_y != 0) or (input_x != 0 && input_y == 0):
  9.                 moveplayer(input_x,input_y)
复制代码

如何画出地图,首先地图规格
  1. var map = [
  2.         1,1,1,1,1,1,
  3.         1,0,0,0,0,1,
  4.         1,0,0,0,0,1,
  5.         1,0,0,0,0,1,
  6.         1,1,1,1,1,1,]
复制代码

把图块以animatedsprite作为场景保存
  1. var tile = load("res://tiles.tscn")
复制代码
  1. for x in range(LEVELWIDTH):
  2.                 room.append([])
  3.                 for y in range(LEVELHEIGHT):
  4.                         room[x].append([])
  5.                         placetile(x,y)
复制代码
  1. func placetile(x,y):
  2.         var e = map[y * LEVELWIDTH + x]
  3.         if e > 0:
  4.                 var new_instance = tile.instance()
  5.                 new_instance.position.x = tilew * x
  6.                 new_instance.position.y = tileh * y
  7.                 self.add_child(new_instance)
  8.                 if e == 2:
  9.                         new_instance.set_frame(2)
复制代码

角色之类也是相同方法放上去,因为我不确定如果加了别的(比如移动地面,只是举例并没用过),而且和角色或箱子重叠怎么搞,所以是分开一个数列,根据实际可以全写在地图里。
移动前的判断就是看角色站在哪格向哪里移,检测那一格上和再过去一格都有什么,就知道怎么移了(如果只是单纯推箱子的话),rpg maker的事件页都能搞出来就不再多说。但要单纯根据地图坐标移动一个图像我也不知怎么办,实际上包括角色和箱子我都用一个数列记下了它们坐标和引用
  1. func placeobj(obj):
  2.         for a in range(1,obj.size()):
  3.                 var new_instance = tile.instance()
  4.                 new_instance.position.x = tilew * obj[a][1]
  5.                 new_instance.position.y = tileh * obj[a][2]
  6.                 self.add_child(new_instance)
  7.                 obj[a][3] = new_instance
复制代码

准确来说是根据坐标搜这个数列,如果有就用引用来移动,当然也可以分成两个数列,好像单一类型的这种数列会快点。
应该就这么多了,推箱子和类似的是没问题了
回复

使用道具 举报

     
发表于 2021-11-11 03:06 | 显示全部楼层
JRPG里常见的这种视角实际上都是透视不可能的。
就像2L所说,那种图像的透视转换成正常视角后,模型一定都是倾斜躺倒的,而不是正常的直立模型。
回复

使用道具 举报

     
发表于 2021-11-11 03:23 | 显示全部楼层
本帖最后由 Tring 于 2021-11-11 03:26 编辑

另外还有一种取巧的方法实现类似视角的,是八方旅人里用的方法。
使用非正交视图,镜头正对主角,然后移轴。
这种做法只能保证主角永远正面朝向镜头,会让Z轴偏离主角的物体扭曲得比较反直觉,但是因为移轴通常自带景深模糊,所以八方旅人里并不太感觉的出来。
然而即使是这种做法,也并不是JRPG里的那种效果,因为地面允许倾斜的角度很有限,而且有明显的透视形变。
回复

使用道具 举报

 楼主| 发表于 2021-11-11 13:55 | 显示全部楼层
Tring 发表于 2021-11-11 03:06
JRPG里常见的这种视角实际上都是透视不可能的。
就像2L所说,那种图像的透视转换成正常视角后,模型一定都 ...

是可能的,但现在回去看可能都不是正规按这个透视画而是混合了两三种透视,比如角色投影是个椭圆,但有的长宽一样的物体看着是长宽一样。平视的问题是,完全破坏了地面一格是一个正方形这个基本需要,从以前玩过来会感到十分难受。
回复

使用道具 举报

     
发表于 2021-11-11 14:00 | 显示全部楼层
为什么我感觉lz说得中文读起来这么累。。
没懂,主楼这个图不是标准的orthogonal和perspective吗,p矩阵不是可以直接得到的吗..
回复

使用道具 举报

     
发表于 2021-11-11 14:10 | 显示全部楼层
。。。lz给的脚本是一个正交投影的脚本吧。所以实际需要的是在竖直向下视角下仍然能看到角色的脸,是这个意思吗
回复

使用道具 举报

     
发表于 2021-11-11 14:26 | 显示全部楼层
p矩阵跟o矩阵不都有现成公式..
回复

使用道具 举报

 楼主| 发表于 2021-11-11 15:14 | 显示全部楼层

这就是现成的例子,必须垂直向下看地面,但还要看到角色的脸,并且墙不能挡住角色。很显然这种透视不存在,但把墙不能挡住角色去掉的话是可以的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

     
发表于 2021-11-12 10:53 来自手机 | 显示全部楼层
楼主要的是这个效果么?https://zhuanlan.zhihu.com/p/391608345
回复

使用道具 举报

 楼主| 发表于 2021-11-12 11:44 | 显示全部楼层
foolegg 发表于 2021-11-12 10:53
楼主要的是这个效果么?https://zhuanlan.zhihu.com/p/391608345

其实最开始的平行四边形也行,只是边缘线上的面会被裁掉,所以这个方法可能更好吧,但根据原理好像和单纯拉画面效果一样,那用3d模型看起来会不会只是原来的图上下拉长了?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2024-9-24 19:24 , Processed in 0.116142 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表