本帖最后由 wuojbk 于 2021-8-22 01:36 编辑
最近在群里看到很多兄弟 学会了基础 想做游戏脚本 但是不知道如何下手。
还有的兄弟 做了游戏 不知道如何优化。
今天我来写一篇 游戏开发思路-以及优化
首先思路呢 就是分析游戏种类 以我自己在做的SLG类型游戏来分析。
分析游戏首先就是 登陆注册 单号 多号 过验证 。
--单号不用说了 独立账号无限循环事件。
--说一下 多号 ,多号肯定是有文本或者Sqlite进行保存 取出所有账号 分割成数组 循环,废话不多 直接上代码。
- --取出所有账号
- 账号 = {账号1,账号2,账号3,账号4}
- for key,val in pairs(账号)) do
- 当前账号个数 = key
- 当前账号 = val
-
- --登陆操作
- end
复制代码 --在说一下过验证,比如很多游戏登陆后都会有滑块验证,群文件都有 这里我就直接贴上代码。- --过滑块
- --x1y1x2y2 ==滑块的范围 shadowlen阴影的长度 strat_x 滑动开始坐标x 滑动结束坐标y runtime 滑动时间
- function Sys.swipe_push(x1,y1,x2,y2,shadowlen,start_x,start_y,runtime)
-
- local x1,y1,x2,y2=x1,y1,x2,y2 --滑块的范围
- local shadowLen = shadowlen --阴影的长度,一定要填准确哦
-
- local dt --滑块距离
- local s = "";
- local judge = 0;
- local function slider()
- for i=1,shadowLen do
- s = s..0;
- end
- s2 = "1"..s.."01"
- s3 = "1"..s.."001"
- s4 = "1"..s.."0001"
- s = "1"..s.."1"
- local result=0;
- for y=y1,y2 do
- dt = "" --两个滑块间的距离
- local width,hright,arr = getScreenPixel(x1,y,x2,y);
- for k,v in pairs(arr) do
- local r, g , b = colorToRGB(v)
- local sum = r + g + b;
- if sum < 384 then
- sum = 0;
- else
- sum = 1;
- end
- dt = dt..sum;
- end
- result = string.find(dt,s,331) or string.find(dt,s2,331) or string.find(dt,s3,331) or string.find(dt,s4,331);
- if result ~=nil then
- judge = judge + 1;
- if judge == 6 then
- result = result + x1
- return result;
- end
- end
- end
- end
- keepCapture();
- local tick = tickCount()
- local result = slider();
- print("获取滑块坐标耗时:"..(tick/1000));
- if result == nil then
- releaseCapture();
- return -1
- end
- print(start_x,start_y,result,runtime)
- swipe(start_x,start_y,result-5,start_y,runtime);
- releaseCapture();
- end
复制代码
SLG类型游戏特点 2D,平面,大地图,需要精准坐标,采集。
我的开发思路呢 首先 就是执行方法 main() 这里main所有执行的都是游戏的逻辑 比如登陆注册 活动 打怪 领礼包 等等。。。
- --主程序运行
- function main()
- --模式选择()
- --游戏初始化()
- --登陆()
- --领取礼包()
- --打怪()
- --等等
- end
复制代码 这些都是你游戏的核心处理,你需要一个启动方法来 启动你的核心方法 和控制核心方法执行次数。
我之前说过 你需要定义一个入口方法run() 这个就是你脚本启动执行的第一个方法 ...直接上代码。
- --入口方法
- function run()
- --无限循环主程
- while true do
- main()
- end
- end
复制代码 大家看到我这里是无限循环的,true 换成固定条件次数 就是次数执行 这个根据自己的业务随意更改。
大致游戏整体思路就是这样的,你想做什么样的脚本需要分析游戏,整理思路,先想好在开发 这里提一点就是有能力的兄弟 建议面向对象编程,模块化,高扩展,高维护。
接下来说一下优化,优化部分可能新来的兄弟看着不太懂 没关系 多练习总会看懂。
优化部分 我将从这几点来说 【代码的冗余性】 【低内存占用写法】,【如果调用lua自身垃圾处理】,以及【安卓自身内存管理调用】。
--首先说一下 代码冗余性 我看到很多兄弟 在做一个处理的时候他会写一个方法,下一个相似处理时候还会在写一个方法 这样是很不好的习惯,尽量让代码高复用,压缩 相似逻辑 尽量封装的通用。
--低内存写法 lua的变量很好生成,但是如果 你不加local 关键字他就是全局变量,一直在占用着你的内存,如果你不把变量=nil lua自身的垃圾处理机制也不会回收,这就导致了如果你过多的去写全局变量会大大的占用你的内存,其次 图色的封装 如果你需要找一个图色的集合去循环的查找 你需要重新封装一下图色 废话不多上代码。
- <div class="blockcode"><blockquote>--图色找点综合
- -- table 返回坐标点
- function Sys.findColorAll(图色集合)
- keepCapture()
- for key,val in pairs(图色集合) do
- local x,y = findMultiColor(val[2],val[3],val[4],val[5],val[6],val[7],0,0.9)
- if x ~= -1 and y ~= -1 then
- releaseCapture()
- return val[1],x,y
- end
- end
- releaseCapture()
- return -1,-1,-1
- end
复制代码
先截取内存,在循环找色 最后释放内存 这样会大量节省你截屏的内存消耗。
--如何调用lua自身的 垃圾回收 这里我就直接贴菜鸟教程了 具体如何操作 还是要看你代码的逻辑。
- collectgarbage("collect"): 做一次完整的垃圾收集循环。通过参数 opt 它提供了一组不同的功能:
- collectgarbage("count"): 以 K 字节数为单位返回 Lua 使用的总内存数。 这个值有小数部分,所以只需要乘上 1024 就能得到 Lua 使用的准确字节数(除非溢出)。
- collectgarbage("restart"): 重启垃圾收集器的自动运行。
- collectgarbage("setpause"): 将 arg 设为收集器的 间歇率。 返回 间歇率 的前一个值。
- collectgarbage("setstepmul"): 返回 步进倍率 的前一个值。
- collectgarbage("step"): 单步运行垃圾收集器。 步长"大小"由 arg 控制。 传入 0 时,收集器步进(不可分割的)一步。 传入非 0 值, 收集器收集相当于 Lua 分配这些多(K 字节)内存的工作。 如果收集器结束一个循环将返回 true 。
- collectgarbage("stop"): 停止垃圾收集器的运行。 在调用重启前,收集器只会因显式的调用运行。
复制代码 --安卓自身内存管理 它本身是Linux 系统 自身内存管理已经很强大了 但是有时候长时间的运行也会滞留垃圾文件 这个时候就需要我们手动来执行了。
- 所有设计命令执行的 都需要使用 懒人方法 exec("ls /") 以root执行。
复制代码
今天先说这些 今后会多多去写一些游戏相关的帖子 。
大佬轻喷,觉得有用的兄弟 多多转发 让更多的兄弟学习 大家一起进步。
|