半肾
精华
|
战斗力 鹅
|
回帖 0
注册时间 2006-10-18
|
楼主 |
发表于 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[x].append([])
- placetile(x,y)
复制代码- func placetile(x,y):
- var e = map[y * LEVELWIDTH + x]
- 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[a][1]
- new_instance.position.y = tileh * obj[a][2]
- self.add_child(new_instance)
- obj[a][3] = new_instance
复制代码
准确来说是根据坐标搜这个数列,如果有就用引用来移动,当然也可以分成两个数列,好像单一类型的这种数列会快点。
应该就这么多了,推箱子和类似的是没问题了 |
|