Godot-StartUP

创建于:2018-07-28

创建人: Justus

44 信息 140 成员
讨论基于Godot以及Unity引擎的游戏开发经验,理论和最佳实践。共享一些通用思路以启发另一种生产工具中的实践。独立开发群QQ: 122017359

Godot 武侠与江湖 开发杂记

ttwings 2019-02-12

开发随笔

git地址: https://github.com/ttwings/WuXiaAndJiangHu_Godot

  • RPGmaker类行走图素材处理

    含金量不高,只是作为自己的一点记录。 注:绝大数素材来源于网络,仅为学习使用(极个别是自己绘制的)

    1. 行走图素材
    Image title


    1. 新建Sprite,将序列图纹理素材导入 
    2. Image title
    3. 新建AnimationPlayer,新建4个方向的行走动画
    4. 点击frame右边的钥匙标记,可以快速添加动画 
    5. Image title
    6. 添加RayCast射线检测,用于简单碰撞 
    7. Image title
    8. 添加脚本,实现控制,脚本未做清理
          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中使用

    1. 新建Tiledmap,新建TileSet,设置合适的cell大小

    2. 注意:rpgmaker类,自动地图,表面是3232大小,但在实际处理时,底层是再次分解为1616计算的,因此这里需要设置为16*16

    3. 点击tilemap里面的tileset下面的"打开编辑器"

    4. 新建autotile,设置snap options里面的 step为16*16,设置bitmask(这里是自动地图的关键),如图测试,如果不对可以重新编辑

      Image title


    5. 注意图中的例子并不完整,剩下的需要自己摸索,下面给点提醒

    6. 自动地图,需要底层和表层同时设置才行。像例子中并没有弄底层,只考虑了表层,而且图中的素材为网络拼凑而成,缺少合适的底层,并不可取。

    7. 简单图形的自动地图,如矩形类地毯,可以只管下面的部分,这个时候,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")
  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
  • 读取文件夹下图片素材生成动画

    假如我们的动画文件在单个文件夹中

            Image title

  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简单风格的对话框

    一些国产游戏会用到的内圆弧的风格 Image titleImage title

    做这个效果很简单

    1. 准备素材 Image title

    2. 新建NinePatchRect然后设置合适的pachmargin Image titleImage title

    3. 将其他的控件放到NinePatchRect下。按钮类,可能需要设置flat为true。否则会调用按钮的风格。 也可以以此风格为主,深入修改Theme,那样需要较多的绘制,不擅长,不做累述。 

(转发自:原日志地址
 

加入 indienova

  • 建立个人/工作室档案
  • 建立开发中的游戏档案
  • 关注个人/工作室动态
  • 寻找合作伙伴共同开发
  • 寻求线上发行
  • 更多服务……
登录/注册