mes 发表于 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
https://i.ibb.co/7Cvb1GB/o.png
可以看到立方体的顶是正方形
希望有高人直接给个能直接用的,或者只要有正确的Matrix大概也行了。要是没有大概自己摸索也总能摸出来就是了。

GuardHei 发表于 2021-10-3 03:36

你应该学习三角力量2,直接把模型倾斜45度角

—— 来自 S1Fun

mes 发表于 2021-11-11 02:19

并不是很难,如果想挑战可以自己全写,当然耐心和努力还是需要。
工具为godot
首先如何一走是一格
func move_tween(input_x,input_y,obj,spd = 1):
        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)
        tween.start()
因为tween完成后会发信号,也可以用来当完成移动可以显示动画的判断,可以不用脚本连接但为了不会忘建议自己写
$Tween.connect("tween_all_completed",self,"_on_Tween_tween_all_completed")
然后就可以
func _on_Tween_tween_all_completed():
        if gameclear:
                player.set_animation("default")
                player.playing = false
如何接受输入后移动func _process(_delta):
        if tween.is_active():
                return
        if gameover || gameclear:
                return
        input_x = int(Input.is_action_pressed("ui_right")) - int(Input.is_action_pressed("ui_left"))
        input_y = int(Input.is_action_pressed("ui_down")) - int(Input.is_action_pressed("ui_up"))
        if (input_x == 0 && input_y != 0) or (input_x != 0 && input_y == 0):
                moveplayer(input_x,input_y)
如何画出地图,首先地图规格var map = [
        1,1,1,1,1,1,
        1,0,0,0,0,1,
        1,0,0,0,0,1,
        1,0,0,0,0,1,
        1,1,1,1,1,1,]
把图块以animatedsprite作为场景保存
var tile = load("res://tiles.tscn")
for x in range(LEVELWIDTH):
                room.append([])
                for y in range(LEVELHEIGHT):
                        room.append([])
                        placetile(x,y)
func placetile(x,y):
        var e = map
        if e > 0:
                var new_instance = tile.instance()
                new_instance.position.x = tilew * x
                new_instance.position.y = tileh * y
                self.add_child(new_instance)
                if e == 2:
                        new_instance.set_frame(2)
角色之类也是相同方法放上去,因为我不确定如果加了别的(比如移动地面,只是举例并没用过),而且和角色或箱子重叠怎么搞,所以是分开一个数列,根据实际可以全写在地图里。
移动前的判断就是看角色站在哪格向哪里移,检测那一格上和再过去一格都有什么,就知道怎么移了(如果只是单纯推箱子的话),rpg maker的事件页都能搞出来就不再多说。但要单纯根据地图坐标移动一个图像我也不知怎么办,实际上包括角色和箱子我都用一个数列记下了它们坐标和引用
func placeobj(obj):
        for a in range(1,obj.size()):
                var new_instance = tile.instance()
                new_instance.position.x = tilew * obj
                new_instance.position.y = tileh * obj
                self.add_child(new_instance)
                obj = new_instance
准确来说是根据坐标搜这个数列,如果有就用引用来移动,当然也可以分成两个数列,好像单一类型的这种数列会快点。
应该就这么多了,推箱子和类似的是没问题了

Tring 发表于 2021-11-11 03:06

JRPG里常见的这种视角实际上都是透视不可能的。
就像2L所说,那种图像的透视转换成正常视角后,模型一定都是倾斜躺倒的,而不是正常的直立模型。

Tring 发表于 2021-11-11 03:23

本帖最后由 Tring 于 2021-11-11 03:26 编辑

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

mes 发表于 2021-11-11 13:55

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

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

双刀少女 发表于 2021-11-11 14:00

zayrq 发表于 2021-11-11 14:10

。。。lz给的脚本是一个正交投影的脚本吧。所以实际需要的是在竖直向下视角下仍然能看到角色的脸,是这个意思吗

zxlice 发表于 2021-11-11 14:26

p矩阵跟o矩阵不都有现成公式..

mes 发表于 2021-11-11 15:14


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

foolegg 发表于 2021-11-12 10:53

楼主要的是这个效果么?https://zhuanlan.zhihu.com/p/391608345

mes 发表于 2021-11-12 11:44

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

其实最开始的平行四边形也行,只是边缘线上的面会被裁掉,所以这个方法可能更好吧,但根据原理好像和单纯拉画面效果一样,那用3d模型看起来会不会只是原来的图上下拉长了?
页: [1]
查看完整版本: 废帖再利用 如何自己写一个走格子(推箱子类)游戏