undertale吧 关注:143,240贴子:1,897,414
  • 9回复贴,共1

UNDERTALE主世界系统教程

只看楼主收藏回复

注:
1.此教程的代码内容全部以GML为基础,所以请Java,C,C++,Python等同志出门左拐去相应的贴吧
2.如此教程有不合理的地方或有更好的优化,请在楼中楼回复


IP属地:浙江1楼2021-08-19 11:42回复
    首先,我们要了解GMS2的文件储存系统,那么我们先在GMS2中找到游戏选项-->窗口--->禁用文件沙盒,将它勾起来


    IP属地:浙江2楼2021-08-19 11:46
    回复


      IP属地:浙江3楼2021-08-19 11:47
      回复
        其次,我们要了解UNDERTALE的保存步骤:
        1.玩家与存档点进行交互,出现存档界面
        2.玩家选择保存,游戏执行保存脚本(在这我将他命名为scr_game_save)
        3.出现档案成功保存的菜单


        IP属地:浙江4楼2021-08-19 11:54
        回复
          那如何执行保存呢,GML有一些内置函数来帮助你保存
          (以下函数来自GM8汉化教程,GMS2的全是英文,我看不懂)
          file_text_open_read(fname)开启指定文件名称的文件进行读取。这个函数返回在其他 函数一定要用的文件id,可以同时开启多个文件(最多32个),当你完成操作时不要忘记关闭 文件。
          file_text_open_write(fname)开启指定文件名称的文件进行写入,如果文件不存在就会 建立一个文件,这个函数返回在其他函数一定要用的文件id。
          file_text_open_append(fname)开启指定文件名称的文件在文件末端加入数据,如果文 件不存在就会建立一个文件,这个函数返回在其他函数一定要用的文件id。
          file_text_close(fileid)关闭指定文件id的文件。
          file_text_write_string(fileid,str)写入字串到指定文件id的文件。
          file_text_write_real(fileid,x)写入实数到指定文件id的文件。 (整数和小数使用一个点来分隔)
          file_text_writeln(fileid)写入换行符到指定文件id的文件。
          file_text_read_string(fileid) 从指定文件id的文件读取一个字符串并返回这个字符串。一行是一个字符串。
          file_text_read_real(fileid)从指定文件id的文件读取一个实数并返回这个实数。
          file_text_readln(fileid)跳过文件中一行的其余部分,从下一行的行头开始读取。
          file_text_eof(fileid) 返回是否到达文件的末尾。
          file_text_eoln(fileid) 返回是否到达这一行的末尾。
          file_exists(fname) 返回指定文件名称的文件是否存在。
          file_delete(fname) 删除指定文件名称的文件。
          file_rename(oldname,newname) 重命名文件,把旧名称改为新名称。
          file_copy(fname,newname)复制指定文件名称的文件到新文件。
          directory_exists(dname)返回指定的目录是否存在。必须是完整路径,不能是相对路径.
          directory_create(dname)如果目录不存在,用指定的名称创建一个新目录(包括指向它的路径)。必须是完整路径,不能是相对路径.
          file_find_first(mask,attr)返回第一个满足遮罩和属性的文件名称,如果文件不存在,会返回空字串。遮罩可以包含路径和字符,例如C:\temp\*.doc。属性允许查看更多的文件。 (当满足遮罩时会经常返回正常文件的名称。)你可以使用以下的常数去查看需要的文件:
          fa_readonly 只读文件
          fa_hidden 隐藏文件
          fa_sysfile 系统文件
          fa_volumeid 卷标文件
          fa_directory 目录
          fa_archive 归档文件
          file_find_next()返回下一个满足之前的遮罩和属性的文件名称,如果文件不存在,会返回 空字串。
          file_find_close() 处理完文件一定要调用这个函数去释放内存。
          file_attributes(fname,attr)返回指定名称的文件是否符合指定的属性,使用以上的常数作为组合。
          以下的函数可以用来改变文件名称,须注意这些函数不会作用于实在的文件,只会处理字串。
          filename_name(fname) 返回指定文件的名称部分,包含拓展名但不包含路径。
          filename_path(fname) 返回指定文件的路径部分,包含最后的"\"。
          filename_dir(fname) 返回指定文件的目录部分,通常跟路径一样但不包括最后的"\"。
          filename_drive(fname) 返回指定文件的卷标。
          filename_ext(fname) 返回指定文件的拓展名,包含前面的点。
          filename_change_ext(fname,newext) 返回将指定文件的拓展名更改为新的拓展名后的文件名(包括最前的点),使用空字串作为新扩展名可以移除扩展名。


          IP属地:浙江5楼2021-08-19 11:57
          回复
            ini部分
            传递特定的参数设定到程式,使用INI文件是一种标准机制,INI文件包含一些片断,每个片 断包含一些名称-数值配对,例如,以下是一个典型的INI文件 :
            [Form]
            Top=100
            Left=100
            Caption=The best game ever
            [Game]
            MaxScore=12324
            这个文件包含两个片断,一个叫Form,另外一个叫Game,第一个片断有三个配对,头两个是 实数,第三个是字串。INI文件很容易去创建和更改。Game Maker有以下的函数去读取和更 改INI文件的数据。
            ini_open (名称)打开指定名称的INI文件,这个INI文件一定要储存在游戏的同一个文件夹。
            ini_close() 关闭目前开启的INI文件。
            ini_read_string (片断,键,预设值)从指定的片断的键读取字串,当键或片断不存在时,会 返回预设值。
            ini_read_real (片断,键,预设值)从指定的片断的键读取实数,当键或片断不存在时,会返 回预设值。
            ini_write_string (片断,键,值)在指定的片断的键写入字串。
            ini_write_real (片断,键,值)在指定的片断的键写入实数。
            ini_key_exists (片断,键)返回指定的片断的键是否存在。
            ini_section_exists (片断)返回指定的片断是否存在。
            ini_key_delete (片断,键)从指定的片断删除键。
            ini_section_delete (片断)删除指定的片断。


            IP属地:浙江6楼2021-08-19 11:59
            回复
              我们的文件函数是直接覆盖原本的文件的


              IP属地:浙江8楼2021-08-19 13:28
              回复
                那么,我们该如何创建一个file文件呢
                首先,我们建立一个实例变量file0(直接用会报错:没有可供读取的file)
                接着,我们输入file0 = file_text_open_write(file0);
                然后,我们就可以用
                file_text_write_string(fileid,str)
                file_text_write_real(fileid,x)
                file_text_writeln(fileid)
                file_text_read_string(fileid)
                来进行写入文件
                最后一定要用
                file_text_close(fileid)
                来关闭打开的file文件


                IP属地:浙江9楼2021-08-19 13:34
                回复
                  那我们该如何读取呢?
                  我们就要用
                  file_text_open_read(fname)
                  file_text_read_string(fileid)
                  file_text_read_real(fileid)
                  file_text_readln(fileid)
                  来读取file
                  (注:这里你是怎么写入的,你就怎么读取,例如你先写入玩家名称,在写入玩家LV,那么,你读取时,也先读取玩家名称,在读取玩家LV)


                  IP属地:浙江10楼2021-08-19 13:37
                  回复
                    接着,我们写一个实例:
                    创建精灵,命名为spr_ball,并给它画上一个图像
                    接着,创建obj_ball,选择精灵为spr_ball
                    接着在步事件里写入:
                    if(keyboard_check_pressed(ord("S")))
                    {
                    scr_game_save();
                    }
                    if(keyboard_check_pressed(ord("L")))
                    {
                    scr_game_load();
                    }
                    switch(keyboard_key)
                    {
                    case vk_up:
                    y-=5;
                    break;
                    case vk_down:
                    y+=5;
                    break;
                    case vk_left:
                    x-=5;
                    break;
                    case vk_right:
                    x+=5;
                    break;
                    }
                    在创建两个脚本,分别命名为:scr_game_save 和 scr_game_load
                    在scr_game_save里写入:
                    file0 = file_text_open_write("file0");
                    file_text_write_real(file0,x);
                    file_text_writeln(file0);
                    file_text_write_real(file0,y);
                    在scr_game_load里写入:
                    file0 = file_text_open_read("file0");
                    x = file_text_read_real(file0,x);
                    file_text_readln(file0);
                    y = file_text_read_real(file0,y);
                    将obj_ball拖入房间中,运行游戏,在一个地方按下S键
                    在移动到其他地方,在按下L键,我们可以发现,obj_ball回到了我们保存的位置


                    IP属地:浙江11楼2021-08-19 14:01
                    回复