Godot 武侠与江湖 开发杂记
开发随笔
git地址: https://github.com/ttwings/WuXiaAndJiangHu_Godot
-
RPGmaker类行走图素材处理
含金量不高,只是作为自己的一点记录。 注:绝大数素材来源于网络,仅为学习使用(极个别是自己绘制的)
- 行走图素材
- 新建Sprite,将序列图纹理素材导入
- 新建AnimationPlayer,新建4个方向的行走动画
- 点击frame右边的钥匙标记,可以快速添加动画
- 添加RayCast射线检测,用于简单碰撞
- 添加脚本,实现控制,脚本未做清理
extends Area2D export(int) var head_id = 0 var tile_size = 32 var can_move = true var facing = 'right' var moves = {'right': Vector2(1, 0), 'left': Vector2(-1, 0), 'up': Vector2(0, -1), 'down': Vector2(0, 1)} var raycasts = {'right': 'RayCastRight', 'left' : 'RayCastLeft', 'up': 'RayCastUp', 'down': 'RayCastDown'} func move(dir): if get_node(raycasts[facing]).is_colliding(): return facing = dir can_move = false $AnimationPlayer.play(facing) $MoveTween.interpolate_property(self, "position", position, position + moves[facing] * tile_size, 0.6, Tween.TRANS_LINEAR, Tween.EASE_IN_OUT) $MoveTween.start() return true func _on_MoveTween_tween_completed( object, key ): can_move = true
-
RPGmaker类自动地图在godot中使用
-
新建Tiledmap,新建TileSet,设置合适的cell大小
-
注意:rpgmaker类,自动地图,表面是3232大小,但在实际处理时,底层是再次分解为1616计算的,因此这里需要设置为16*16
-
点击tilemap里面的tileset下面的"打开编辑器"
-
新建autotile,设置snap options里面的 step为16*16,设置bitmask(这里是自动地图的关键),如图测试,如果不对可以重新编辑
-
注意图中的例子并不完整,剩下的需要自己摸索,下面给点提醒
-
自动地图,需要底层和表层同时设置才行。像例子中并没有弄底层,只考虑了表层,而且图中的素材为网络拼凑而成,缺少合适的底层,并不可取。
-
简单图形的自动地图,如矩形类地毯,可以只管下面的部分,这个时候,cell大小可以设置为3232,同理snap options里面的 step也可以设置为 3232。
-
-
基本保存
func save(content):
var file = File.new()
file.open("user://save_game.dat", file.WRITE)
file.store_string(content)
file.close()
func load():
var file = File.new()
file.open("user://save_game.dat", file.READ)
var content = file.get_as_text()
file.close()
return content
- json的基本使用
var p = JSON.parse('["hello", "world", "!"]')
if typeof(p.result) == TYPE_ARRAY:
print(p.result[0]) # prints 'hello'
else:
print("unexpected results")
-
读取json数据
假如我们有如下数据,并转为JSON。
PS:这里推荐国人制作的excel转lua json等的一个强大工具
func load_data(path:String):
var load_data = File.new()
if not load_data.file_exists(path):
print_debug("not exists file")
return
load_data.open(path,File.READ)
var data_str = load_data.get_as_text()
var p = JSON.parse(data_str)
return p.result
- 获取目录下特定后缀文件
func dir_files(path,suffix):
var dir = Directory.new()
var files = []
if dir.open(path) == OK:
dir.list_dir_begin()
var file_name = dir.get_next()
while (file_name!= ""):
if dir.current_is_dir():
print("Found directory" + file_name)
elif file_name.split(".")[-1] == suffix:
files.append(file_name)
print("Found file: " + file_name)
else:
print("Found file: " + file_name)
file_name = dir.get_next()
else:
print("An error ccurred when trying to access the path.")
return files
-
读取文件夹下图片素材生成动画
假如我们的动画文件在单个文件夹中
extends Node2D
# 选择目录下的png
export(String,DIR) var path
export(String) var anim
func _ready():
$AnimatedSprite.frames = creatAnimation(path)
$AnimatedSprite.speed_scale = 4
$AnimatedSprite.play("default")
pass
func dir_contents(path):
var dir = Directory.new()
var file_list = []
if dir.open(path) == OK:
dir.list_dir_begin()
var file_name = dir.get_next()
while(file_name != ""):
if dir.current_is_dir():
print("Found directory: " + file_name)
else:
if file_name.split(".")[-1] == "png":
file_list.append(file_name)
print("Found file: " + file_name)
file_name = dir.get_next()
else:
print("An Error occurred when trying to access the path.")
return file_list
func creatAnimation(path:String):
var sprite_sheet = dir_contents(path)
var sprite_frames = SpriteFrames.new()
for i in sprite_sheet.size() :
var frame = load(path + "/" + sprite_sheet[i])
sprite_frames.add_frame("default",frame)
return sprite_frames
-
利用ninepach简单风格的对话框
一些国产游戏会用到的内圆弧的风格
做这个效果很简单
-
准备素材
-
新建NinePatchRect然后设置合适的pachmargin
-
将其他的控件放到NinePatchRect下。按钮类,可能需要设置flat为true。否则会调用按钮的风格。 也可以以此风格为主,深入修改Theme,那样需要较多的绘制,不擅长,不做累述。
-