GameMaker Studio 2

创建于:2017-04-19

创建人: dougen

190 信息 1080 成员
游戏开发工具 GameMaker Studio 2 的讨论小组
骨折好少女@GameMaker Studio 2 的内容(查看所有内容
GMS用SteamSDK No.4 找到创意工坊下载文件

当玩家在创意工坊里面下载了东西 不管是皮肤 还是地图等 都是在一个个文件夹里面而已

找到对应的位置 然后自己内容 验证就行了 过程我懒得管 我就教 如何找到位置而已

然后在意的就是 我写代码的时候 会忽略steamAPI 启动验证等玩意 


首先 给你们看一下分析结果的内容

一个list 两个 Map

1.用户订阅内容的ID列表

2.订阅内容下载状况

3.订阅内容的信息

Image title



估计直接一个创建能够写完吧


讲一下目的性 我要做的内容是 筛选 能够使用的 创意工坊物品文件架 载入这个list 里面

FileList = ds_list_create();

首先我们要获 用户订阅内容的ID列表

IDList = ds_list_create();
steam_ugc_get_subscribed_items( IDList );

把信息塞入 map里面面 筛选 然后 加入文件列表里面

for (var i = 0; i < ds_list_size(IDList); ++i) {
//创建和载入
     var  Update = ds_map_create()
  steam_ugc_get_item_update_info(IDList[|i],Update);

 var  Install = ds_map_create();
  steam_ugc_get_item_install_info(IDList[|i],Install);


//这里 执行筛选 
    if Update[?"is_installed"] //验证是否安装
    if !Instanll[?"Legacy_item"] //google那边翻译是遗留文件
    {
        ds_list_add(FileList,Install[?"folder"]);//文件夹的位置就在这里了
}



//清理残渣是个好习惯
ds_map_destroy(Install);
ds_map_destroy(Update);


 }
(转发自:原日志地址
GMS用SteamSDK No.5 做一个创意工坊的页面

这一篇内容搁着留个坑


想用的话直接用这个

steam_activate_overlay_browser("你家创意工坊网页")

直接跳出来就是了

(转发自:原日志地址
GMS用SteamSDK No.4 找到创意工坊下载文件

当玩家在创意工坊里面下载了东西 不管是皮肤 还是地图等 都是在一个个文件夹里面而已

找到对应的位置 然后自己内容 验证就行了 过程我懒得管 我就教 如何找到位置而已

然后在意的就是 我写代码的时候 会忽略steamAPI 启动验证等玩意 


首先 给你们看一下分析结果的内容

一个list 两个 Map

1.用户订阅内容的ID列表

2.订阅内容下载状况

3.订阅内容的信息

Image title



估计直接一个创建能够写完吧


讲一下目的性 我要做的内容是 筛选 能够使用的 创意工坊物品文件架 载入这个list 里面

FileList = ds_list_create();

首先我们要获 用户订阅内容的ID列表

IDList = ds_list_create();
steam_ugc_get_subscribed_items( IDList );

把信息塞入 map里面面 筛选 然后 加入文件列表里面

for (var i = 0; i < ds_list_size(IDList); ++i) {
//创建和载入
     var  Update = ds_map_create()
  steam_ugc_get_item_update_info(IDList[|i],Update);

 var  Install = ds_map_create();
  steam_ugc_get_item_install_info(IDList[|i],Install);


//这里 执行筛选 
    if Update[?"is_installed"] //验证是否安装
    if !Instanll[?"Legacy_item"] //google那边翻译是遗留文件
    {
        ds_list_add(FileList,Install[?"folder"]);//文件夹的位置就在这里了
}



//清理残渣是个好习惯
ds_map_destroy(Install);
ds_map_destroy(Update);


 }
(转发自:原日志地址
[ 分享 ]GMSandGMS2巨婴级别的安卓输出配置_算了勺子都够到脸前自己咬吧


作案工具

  1. 巨婴套装: https://pan.baidu.com/s/1mj0Tcuc
  2. 一台64位的电脑(64能跑gms2 32的只有gms1选择 上面带的JDK是64 的 32的自己解决)
  3. gms1或者gms2的安卓输出端口(管你正版盗版 你就得先有才行)

开始配置

Gms的设置

  1. 视野看向软件左上角
  2. File 按钮
  3. Preferences 按钮 弹出窗口 看往窗口上侧
  4. Android 按钮 看向窗口左侧
  5. Keystore 界面 按下 偏右下的 Generate 按钮 
  6. SDK 界面 选择 SDK NDK JDK 的文件位置

全局游戏设定 

Image title

Image title




  1. 窗口上侧 Android 按钮
  2. 左侧 General
  3. Image title

Image title




然后导出和测试就自便了

(转发自:原日志地址
[ 分享 ]GMS2 打开潘多拉魔盒 之 将未初始化的变量值设定为0

GM8里面一个极其好用的功能

能让打错字的变量 或者懒得初化的变量 直接设定

绕过了 可以绕过 烦人的报错

Image title



其实也就是去使用 一下 variable 系列的变量而已

也就是介绍下思路而已

比如 Set 一个变量就是

variable_instance_set(id,argument0,argument1)

Get 一个变量就是 

if !variable_instance_exists(id,argument0)
variable_instance_set(id,argument0,0)

return variable_instance_get(id,argument0)

顺带一提到的就是

asset_get_index()

简单讲就是 用 字符串 找到 对应的的引索

sprite_run  =  asset_get_index("sprite_run")


也就是提供一种思路 用 字符串 组合一起 来寻找对应的引索

   不过相对的 计算找出来之后记得 找个变量塞好 用变量塞个引索不费地方 现在大家内存多的很

(转发自:原日志地址
[ 分享 ]Gms2 单屏幕双视野

成品

Image title


准备

开启视野

Image title

  1. 使用视野
  2. 视野输出合着一倍窗口差不多 摄像机的任意吧 其他有的没得我喜欢代码设定
  3. 0和1视野都勾选使用


逻辑

  1. 我们会使用表面
  2. 将两个表面内容绘制在GUI

代码

//创建事件

surf1 = -1

surf2 = -1

//下面都在gui
//背景
var Size = 1280/sprite_get_width(sprite0)
draw_sprite_ext(sprite0,0,0,0,Size,Size,0,c_white,1)

draw_set_color(c_red)
//表面1
if !surface_exists(surf1)
   {
   surf1 = surface_create(camera_get_view_width(view_camera[0]), camera_get_view_height(view_camera[0]));
   view_surface_id[0] = surf1;
   }
   else
   {
  draw_surface_stretched(surf1, 32, 32,1280 /3 ,720/3 );
  draw_rectangle( 32, 32,1280 /3+32 ,720/3 +32,1)
   }
   //表面2
   if !surface_exists(surf2)
   {
   surf2 = surface_create(camera_get_view_width(view_camera[1]), camera_get_view_height(view_camera[1]));
   view_surface_id[1] = surf2;
   }
   else
   {
  draw_surface_stretched(surf2, 1280 /3+128, 32,1280 /3 ,720/3 );
  draw_rectangle(1280/3+128, 32,1280 /3 +1280/3+128,720/3+32,1)
   }

(转发自:原日志地址
GMS2 中文换行

首先是目的

  • 很简单就是老子想要中文换行

然后就是谈谈烦心的事情

我工程通常或多或少的会考虑外置文档 这个时候
  • 外置的内容无论是 中文还是英文 反正只要是外置就没法使用  的gms2新功能 “\x” 系列(在str中加入 可以达到 tab 换行等效果)
  • 新功能无法使用 但是戈麦斯2 还是留了个接口 string_hash_to_newline (文本中加入#字换行)
  • draw_text_ext 写在能让一行字就这样宽 其他文本的内容往下挤 但是啊 但是啊 这玩意是给英文的 也就是 以空格等字符为分界线啊 别的不说 就讲空格 往外置文本中文里面打 除非你像我这样打字一般不用标点符号 

解决理念

拆开 往每一句话后面 加入个 “#” 


代码

str = "这是一段中文。这是一段中文。这是一段中文。这是一段"
var L = string_length(str)
L = L div 7 //一行7个字就这样打算了(真挤) 整出一下长度看一下需要分配几行字

//第一行字
i = 0
T[i] = string_copy(str,1+i*7,7) + "#"
 //中间
for (i=1; i<L; i+=1)
{
 T[i] = string_copy(str,1+i*7,7) + "#"
};

//收尾
 T[i] = string_copy(str,1+i*7,7)




//把他们都合并起来 
 var A = i+1
var str2 = ""
 for (i=0; i<A+1; i+=1)
 {
str2 +=T[i] 
 };

//转个码再赛回去
str =  string_hash_to_newline(str2)

细节见仁见智地自己调整吧

(转发自:原日志地址
GMS2 GUi 的简单使用

直接明了的讲吧

首先 就是 Gui不随着窗口大小 的变化 而变化

首先 确定一下 游戏的一倍的窗口大小

比如 我的得游戏 是 1280*720的 反正这种东西八仙过海

size = x

display_set_gui_size(width*size, height*size);

然后 大家照常绘制就行了 

知道 gui的 原点是屏幕左上角 向下 向右延伸就好

关于size 嘛 就是 拿来 进行 2倍的图 一倍绘制 的做法而已

(为了让字体 高清 看着一倍大小 其实 是23倍的大了)

draw_sprite_ext( sprite, subimg, x*size, y*size, xscale, yscale, rot, colour, alpha );

其实也有别的方法 我就是乐意这样做而已


然后就是 将gui作为 按钮 用了

var device = 0;//作为电脑只用上0就好了

if  (device_mouse_y_to_gui(device)=yy ) and  (device_mouse_x_to_gui(device)=xx)

{执行}


(转发自:原日志地址
个人用的在GMS2里面的攻击攻击系统
  1. 成品


Image title

我来展示一个 一把飞刀 穿过每个人只吃一次伤害的做法吧(后面展示的东西有点魔法了)

目标效果

做到每个人仅仅被攻击一次的效果

效果作用

划定一个范围 范围内的敌人 会被记录 然后进行 每个敌人仅仅造成 一次伤害 的行为

清理掉 记录后 即可再次进行伤害行为

作案工具

  • Multi_Object_Collisions系列的脚本

代码很简单我直接贴出来算了

collision_multiple( x,y,argument0);
//红色部分就是可以修改的内容 除了instance_place 外还可以使用 collision系列 反正安装需要替换就是了

var x1 = argument0;
var y1 = argument1;
var obj = argument2;

var list = ds_list_create();
do
{
    var  hit = instance_place(x1, y1, obj); 
    if (hit != noone)
    {
        ///Add the colliding object to the list {
        ///deactivate it so that we don't collide with it again.
        ///It'll be reactivated later on...
        ds_list_add(list, hit);
        instance_deactivate_object(hit);
    }
} until (hit == noone);

///Reactivate all the objects which were deactivated
if (ds_list_size(list) > 0)
for (var i = 0; i < ds_list_size(list); i++)
{
    instance_activate_object(list[|i]);
}

///Return the list of objects OR noone
return list;

  • 一个叫做AtkStep的脚本


var AColBox = argument0;


if ds_list_size(AColBox) > 0 {
for (i = 0; i < ds_list_size(AColBox); i += 1) {
if ds_list_find_index(AtkList, ds_list_find_value(AColBox, i)) = -1 {
ds_list_add(AtkList, ds_list_find_value(AColBox, i))
//每加入一个草一个

var Col = ds_list_find_value(AColBox, i);//这家伙就是目标了

if (object_get_parent(Col.object_index) = 目标的父对象) //我想你们肯定需要 对攻击的不同 类型进行不同的处理 在这里直接分类 

{Col.HP -= max(0,self.ATK )//self 表示的是自身 目标的HP减少 自身的攻击力 Max的作用 是在计算攻击的 时候 考虑进去防御力 的话 负数不久给敌人加血了?

//******************这两句是 击飞的范例 乐意可以考究一下
 //Col.vx = (max(0,self.AFlyH - Col.DFlyH)+abs(Col.vx))*self.facing //目标.横向移动速度 = (max(0,自身.击飞力度 - 目标。击飞补正)+ 目标现在的移动速度的绝对值)*自身攻击的方向[只有-1和1]
// Col.vy = -max(0,self.AFlyV - Col.DFlyV);
//*******************************
}

}
}}


创建事件


AtkList = ds_list_create();//记录 被攻击过的目标 
//我通过启用 计时器时间【0】 来周期性清理 AtkList 这样就能持续对人进行攻击了 比如火焰的 多段连续伤害
AtkListCleanTime = -1;//不使用就写个-1
alarm[0] = AtkListCleanTime;

Atk = 1;//攻击力 其实我这边还有一堆信息 反正挑个最简单的讲解

步事件

var AColBox = collision_multiple( x,y,怪物);
AtkStep(AColBox);


计时器[0]事件

ds_list_clear(AtkList)

alarm[0] = AtkListCleanTime;//通过自己调用自己 这样持续清理


销毁事件 

日常收拾手尾

ds_list_destroy(AtkList);



关于如何 自爆嘛 

比如我这个飞刀 就是添加了个离开房间范围就销毁

比如 火焰持续燃烧 再价格计时器 到了自己销毁


好了卖弄的都卖弄完了()

我先转几天制作吧


(转发自:原日志地址
个人用的在GMS2里面的对话框系统

成品

Image title

制作目标

我们看一下成品 

首先讲好 文字绘制的效果都是直接使用这个 自定义绘图脚本 而达成的

这个脚本我考虑使用的使用的功能部分是

  • 字体变色
  • 绘制精灵
  • 修改字体

其余的部分我并不去考虑

对话框是根据文字的长度向前推进  对话有逐渐打字的效果
没有考虑限制文本框的长宽 有我自己全程手打文本 添加#号进行分行
没有考虑长文本的下翻滚阅览方式


本次的对话框的单位是32像素 绘制的字体是 32像素 对话框素材也是32像素 

前期准备

  1. 文本用的csv (记得保存为u-8格式)Image title

  2. 自定义绘图脚本

  3. 对自定义绘图脚本做些手脚Image title

  4. csv一打开其实就是个拿英文句号分割开内容的文档 如果在正文中也英文句号,我所使用的自定义绘图脚本就毫无疑问得爆炸了,所以我替换为了一个低频的符号。




  5. GMS2正版一个

  6. 随时翻阅的GMS2帮助手册

  7. 差点忘记补充的素材 "自己娶个好听的名字_strip10"(这样就能直接塞进工作区了)

Image title


触发事件

首先我这个对话框是独立obj 我遇到npc并且场上没有另外的对话框 按上创建出对话框的实例

if (place_meeting(x,y,oParPlayer)) //npc碰到主角
and keyboard_check_pressed(vk_up) //按下了上
and !instance_exists(oDialogueBox) //在场没有其他对话框
 {
global.Text = Text.csv//通过修改这个global.Text读取不同的文本
instance_create(x,y,oDialogueBox)//创建(记住这个是偷懒行为)
}



创建事件

讲对话文本csv的内容 做出一个map塞进一个list 的感觉


Image title

var CSV = load_csv(global.Text);//读取文本
var CSVH = ds_grid_height(CSV);//获得文本的高度



TextList = ds_list_create()//这里就是讲文本塞入的地方

for (var i=1; i<CSVH; i+=1)//进行塞文本
{
   var Map = ds_map_create();
ds_map_add(Map,"Text",CSV[# 2,i])
ds_map_add(Map,"Name",CSV[# 1,i])
ds_map_add(Map,"No",i)
ds_list_add(TextList,Map)
};

count = 0;//缓冲
TextNo = 0;//缓冲

//对话框坐标
X= 720-96;
Y = 420;


步事件

var List = TextList[| TextNo]//对应那一句演出内容
var str = List[? "Text"]//对话文字部分

count += 1 count = min(count, string_length(str));

//逐渐播放时 按下确定全部显示
if (string_length(str) > count) and(keyboard_check_pressed(global.kAttack) or keyboard_check_pressed(vk_enter)) {

    count = string_length(str);
    //exit;
}

//逐渐播放结束后 下确定 下一句
if (string_length(str) = count) and(TextNo < ds_list_size(TextList) - 1) and(keyboard_check_pressed(global.kAttack) or keyboard_check_pressed(vk_enter))

{
    TextNo++;
    count = 0;
    //exit;
}
//都播放结束 关闭
if (string_length(str) = count) and(TextNo = ds_list_size(TextList) - 1) and(keyboard_check_pressed(global.kAttack) or keyboard_check_pressed(vk_enter))

{
    instance_destroy();
}

绘制GUI事件

根据文字的逐渐增多并且 改变9格宫

var List = TextList[| TextNo]
var str = List[? "Text"]



//用于得出绘制文字的长宽 塞进 Text 这个数组里面 [0]对话文本 不涉及[]内的文本 [1]文字长度 [2]文章高度 反正不是拿来看的
var Text = draw_text_custom( - 3200000000000000, -320000000000, string_typing_custom(str, count), 1)


var XX = X - (Text[1] div 32) * 32 + 32;
var YY = Y;
//******************************这部分绘制 9格宫**************//

var Dspr = 上面的素材
//1
draw_sprite(Dspr, 1, XX, YY)
//2
for (W = 1; W < (Text[1] div 32) + 2; W += 1) {
    draw_sprite(Dspr, 2, XX + W * 32, YY)
};
//3
draw_sprite(Dspr, 3, XX + W * 32, YY)

var YY = 32 + Y;

for (H = 0; H < (Text[2] div 32) + 1; H += 1) {
    //4
    draw_sprite(Dspr, 4, XX, YY + H * 32)
    //5
    for (W = 1; W < (Text[1] div 32) + 2; W += 1) {
        draw_sprite(Dspr, 5, XX + W * 32, YY + H * 32)
    };
    //6
    draw_sprite(Dspr, 6, XX + W * 32, YY + H * 32)
};

var YY = 64 + H * 32 - 32 + Y;
//7
draw_sprite(Dspr, 7, XX, YY)
//8
for (W = 1; W < (Text[1] div 32) + 2; W += 1) {
    draw_sprite(Dspr, 8, XX + W * 32, YY)
};
//9
draw_sprite(Dspr, 9, XX + W * 32, YY)

//0
draw_sprite(Dspr, 0, XX + (W) * 32, Y + (1) * 32)//就是那个尖角的玩意 因为他 全体变成了 32*64了


//***********************************格子绘制结束******//
var XX = X - (Text[1] div 32) * 32 + 32;//根据文本推前的部分
var YY = Y;

texture_set_interpolation(true)


//绘制文字咯
draw_set_color(c_white) ;
draw_set_font(global.Font)
draw_text_custom(XX + 32, YY + 32, string_typing_custom(str, count), 1)

销毁事件

反正是拿来善后的

ds_list_clear(TextList)


(转发自:原日志地址
在GMS2绘制中文

关于如何绘制文字的部分看这边 这篇文章就是做点简单的补充而已



方法通常为两种 自己按照需要吧

GMS2内部Font进行添加中文

Image title

Image title

上面的部分看着按钮都能理解 不过现在添加了0-3000范围的字正在卡死中 这也是个很大的问题。

一般 按下面的 正常 数字 字母 ascll 都够了。(这些都是数字符号英文)

用 打开写好的对话文档啊(从文件获取)或者 代码行间的字给塞进去(从代码中获取)一般是够的,你要是吧一本常用8000字塞进去你就祈祷吧。


外置字体添加

首位准备下些东西(不用看了你家微软雅黑)Image title

然后拉进你的工作区里面(就红色区域以内)就会加入你的 内含文件 里面了

Image title


最后 找个地方 比如第一个房间创建时的代码 或者 第一个创建的obj的创建或者 创建时的代码 之类的地方 反正就是要最先 单次 运行的地方

Image title


写上

globalvar Font;
Font =font_add("msyh.ttc",32,0, 0, 0, 65535)
//font_add("你内含文件里面的字体名字",设定字体大小,0,0,0,65535)



设定好字体 弄好绘制 按下F5

运行后等个几分钟(debug窗口都能卡掉的程度)我们就可以看见绘制出来的中文啦

Image title

当然也可以完全不需要丧心病狂地吧22m的微软雅黑塞进去,折衷的办法塞个字体数量够用的字体就行了


(转发自:原日志地址

加入 indienova

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