GMS用SteamSDK No.4 找到创意工坊下载文件
当玩家在创意工坊里面下载了东西 不管是皮肤 还是地图等 都是在一个个文件夹里面而已
找到对应的位置 然后自己内容 验证就行了 过程我懒得管 我就教 如何找到位置而已
然后在意的就是 我写代码的时候 会忽略steamAPI 启动验证等玩意
首先 给你们看一下分析结果的内容
一个list 两个 Map
1.用户订阅内容的ID列表
2.订阅内容下载状况
3.订阅内容的信息
估计直接一个创建能够写完吧
讲一下目的性 我要做的内容是 筛选 能够使用的 创意工坊物品的 文件架 载入这个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 做一个创意工坊的页面
GMS用SteamSDK No.4 找到创意工坊下载文件
当玩家在创意工坊里面下载了东西 不管是皮肤 还是地图等 都是在一个个文件夹里面而已
找到对应的位置 然后自己内容 验证就行了 过程我懒得管 我就教 如何找到位置而已
然后在意的就是 我写代码的时候 会忽略steamAPI 启动验证等玩意
首先 给你们看一下分析结果的内容
一个list 两个 Map
1.用户订阅内容的ID列表
2.订阅内容下载状况
3.订阅内容的信息
估计直接一个创建能够写完吧
讲一下目的性 我要做的内容是 筛选 能够使用的 创意工坊物品的 文件架 载入这个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巨婴级别的安卓输出配置_算了勺子都够到脸前自己咬吧
作案工具
- 巨婴套装: https://pan.baidu.com/s/1mj0Tcuc
- 一台64位的电脑(64能跑gms2 32的只有gms1选择 上面带的JDK是64 的 32的自己解决)
- gms1或者gms2的安卓输出端口(管你正版盗版 你就得先有才行)
开始配置
Gms的设置
- 视野看向软件左上角
- File 按钮
- Preferences 按钮 弹出窗口 看往窗口上侧
- Android 按钮 看向窗口左侧
- Keystore 界面 按下 偏右下的 Generate 按钮
- SDK 界面 选择 SDK NDK JDK 的文件位置
全局游戏设定
- 窗口上侧 Android 按钮
- 左侧 General
然后导出和测试就自便了
[ 分享 ]GMS2 打开潘多拉魔盒 之 将未初始化的变量值设定为0
GM8里面一个极其好用的功能
能让打错字的变量 或者懒得初化的变量 直接设定
绕过了 可以绕过 烦人的报错
其实也就是去使用 一下 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 单屏幕双视野
成品
准备
开启视野
- 使用视野
- 视野输出合着一倍窗口差不多 摄像机的任意吧 其他有的没得我喜欢代码设定
- 0和1视野都勾选使用
逻辑
- 我们会使用表面
- 将两个表面内容绘制在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里面的攻击攻击系统
成品
我来展示一个 一把飞刀 穿过每个人只吃一次伤害的做法吧(后面展示的东西有点魔法了)
目标效果
做到每个人仅仅被攻击一次的效果
效果作用
划定一个范围 范围内的敌人 会被记录 然后进行 每个敌人仅仅造成 一次伤害 的行为
清理掉 记录后 即可再次进行伤害行为
作案工具
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里面的对话框系统
成品
制作目标
我们看一下成品
首先讲好 文字绘制的效果都是直接使用这个 自定义绘图脚本 而达成的
这个脚本我考虑使用的使用的功能部分是
字体变色
绘制精灵
修改字体
其余的部分我并不去考虑
对话框是根据文字的长度向前推进 对话有逐渐打字的效果
没有考虑限制文本框的长宽 有我自己全程手打文本 添加#号进行分行
没有考虑长文本的下翻滚阅览方式
本次的对话框的单位是32像素 绘制的字体是 32像素 对话框素材也是32像素
前期准备
文本用的csv (记得保存为u-8格式)
自定义绘图脚本
对自定义绘图脚本做些手脚
csv一打开其实就是个拿英文句号分割开内容的文档 如果在正文中也英文句号,我所使用的自定义绘图脚本就毫无疑问得爆炸了,所以我替换为了一个低频的符号。GMS2正版一个
随时翻阅的GMS2帮助手册
差点忘记补充的素材 "自己娶个好听的名字_strip10"(这样就能直接塞进工作区了)
触发事件
首先我这个对话框是独立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 的感觉
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进行添加中文
上面的部分看着按钮都能理解 不过现在添加了0-3000范围的字正在卡死中 这也是个很大的问题。
一般 按下面的 正常 数字 字母 ascll 都够了。(这些都是数字符号英文)
用 打开写好的对话文档啊(从文件获取)或者 代码行间的字给塞进去(从代码中获取)一般是够的,你要是吧一本常用8000字塞进去你就祈祷吧。
外置字体添加
首位准备下些东西(不用看了你家微软雅黑)
然后拉进你的工作区里面(就红色区域以内)就会加入你的 内含文件 里面了
最后 找个地方 比如第一个房间创建时的代码 或者 第一个创建的obj的创建或者 创建时的代码 之类的地方 反正就是要最先 单次 运行的地方
写上
globalvar Font; Font =font_add("msyh.ttc",32,0, 0, 0, 65535) //font_add("你内含文件里面的字体名字",设定字体大小,0,0,0,65535)
设定好字体 弄好绘制 按下F5
运行后等个几分钟(debug窗口都能卡掉的程度)我们就可以看见绘制出来的中文啦
当然也可以完全不需要丧心病狂地吧22m的微软雅黑塞进去,折衷的办法塞个字体数量够用的字体就行了