【QA】2017第52周

今天这几个问题都不是后台来的,是在QQ群里大家沟通的过程中产生的,权且也做个记录:)

之前代码判断动画结束的勘误

在上一期QA最后用了这样一个代码来判断动画是否播放结束

if (image_index == image_number - 1) {
    ///这里可以写要处理的代码
}

群里有朋友在使用过程终于发现动画会在倒数第二帧就结束
在经过一系列的测试和验证之后发现"image_index"的数值变化受动画播放速度的影响
而且这个数是浮点数不是整数递进的,使用"=="判断有可能会出问题(提前终止、失效等)
最好使用">"进行判断,或用“floor()”对“image_index”向下取整

if (image_index > image_number - 1) {
    ///这里可以写要处理的代码
}
if (floor(image_index) == image_number - 1) {
    ///这里可以写要处理的代码
}

自定义计时器

在GMS2中每个对象都可以添加12个Alarm作为计时器使用,通常而言应该是能满足需求的。
但也会有一些情况可能不够用,这种情况下要么多设几个对象来处理倒计时事件,或者就必须自定义计时器了。
下面介绍一个简单的计时器实现思路,供有需要的朋友参考

//在需要触发倒计时的地方设置,根据room_speed设置30s计时器,避免后续修改游戏fps导致数值影响计时长度
timer = room_speed * 30 
//step事件
timer -- ; //在step事件中随着游戏允许不断递减
if (timer <= 0){
    //倒计时结束时需要触发的事件
    //如有必要还可以在最后加入重置计时器的相关代码
}

room_speed和game_get_speed

其实这个问题是跟着上一个问题讨论的延展,在许多教程里都会看到大佬们用room_speed来获取游戏的FPS,然后用这个值来控制一些数值避免后续修改游戏FPS时影响数值计算,不够在GMS2中的room属性面板貌似已经找不到设置room_speed的地方了,只有在游戏选项中可以设置游戏整体FPS
[]
同时可以用game_get_speed这个函数来获取这个属性,room_speed这个函数其实已经不用了,目前只是为了兼容老版本而有所保留,建议在后续需要使用FPS值时都采用新函数。

技能CD状态简易版

这个问题同样是群里的朋友提出的,通常我们在游戏中使用技能时,技能图标都会蒙上一层暗色的半透明蒙版,然后随着时间的推移逐渐消失,最后技能冷却完成以后才可以重新使用。
[]
这种时钟形的冷却蒙版已经找到了老版的实现教程,不过目前在GMS2中还没成功还在研究,成功以后单独再介绍,这里先介绍一种简单的替代方案,柱形冷却效果,如下图
[]
思路就是当释放技能时在技能图标所在区域绘制一个半透明蒙版,如果是纯粹的矩形可以直接绘制矩形,如果是不规则的图案则可以先添加一个蒙版精灵,然后用draw_sprite_part_ext

if cool_down {
    CD_time -- ;   //冷却时间递减
    var p = CD_time / CD_max; // 根据冷却时间最大值计算冷却进度百分比
    var s = spr_jinengmengban; // 定义绘制蒙版图案
    var w = sprite_get_width(s); // 获取蒙版宽度
    var h = sprite_get_height(s);// 获取蒙版高度
    draw_sprite_part_ext(s, 0, 0, 0, w, h*p, x-w/2, y+h/2, 1,-1, c_black, .5);//绘制黑色半透明的蒙版
}

其中将蒙版的高度与冷却时间进行了关联,因此随着冷却时间的变化蒙版也就会逐步消失了,当然也可以根据实际需求关联宽度属性来做成左右方向的冷却动画。


OK,本期QA到此结束:)

2017-12-21 20:07
Comments
Write a Comment