残影教学
gamemaker吧
全部回复
仅看楼主
level 1
滑稽_电脑 楼主
/// 创建
//残影数量
shadow_num = 5;
//初始化残影
for(var _i = 0; _i<shadow_num; _i++)
{
shadow_arr[_i, 0] = x;
shadow_arr[_i, 1] = y;
shadow_arr[_i, 2] = z;
shadow_arr[_i, 3] = image_index;
}
//定时添加
shadow_tim = 5; //残影长度
alarm[0] = shadow_tim;
/// 计时器0
for(var _i=shadow_num-1; _i>0; _i--)
{
shadow_arr[_i, 0] = shadow_arr[_i-1, 0];
shadow_arr[_i, 1] = shadow_arr[_i-1, 1];
shadow_arr[_i, 2] = shadow_arr[_i-1, 2];
shadow_arr[_i, 3] = shadow_arr[_i-1, 3];
}
shadow_arr[0, 0] = x;
shadow_arr[0, 1] = y;
shadow_arr[0, 2] = z;
shadow_arr[0, 3] = image_index;
//重启定时器
alarm[0] = shadow_tim;
/// 绘制
scr_draw_shadow(shadow_num, shadow_arr);
/// 脚本
function scr_draw_shadow(){
for(var _i=0; _i<argument0; _i++)
{
draw_sprite_ext(sprite_index, image_number, argument1[_i,0], argument1[_i,1] + argument1[_i,2], image_xscale * argument1[_i, 3], image_yscale, image_angle, image_blend, 0.7 -_i / argument0);
}
}
[滑稽]初始的残影,其他的自信调整
2024年12月29日 10点12分 1
level 1
滑稽_电脑 楼主
[滑稽]GMS 2.3之后的版本
2024年12月29日 10点12分 2
level 1
滑稽_电脑 楼主
2024年12月29日 10点12分 3
吧务
level 13
嗯,读了一遍,是上图的下面这种,不过似乎有些区别。0.7 -_i / argument0(脚本里draw函数的alpha部分)决定了这里残影的透明是阶梯式变化的,咱感觉这里连续变化的观感更理想。另外如果是教学的话,咱是建议把相当于常量的东西都放到创建事件里定义,比如
shadow_tim = 5; //残影长度
2024年12月31日 09点12分 4
@滑稽_电脑 emmmmmm,咱说的是shadow_tim这个参数,代表了“隔多少帧刷新一次残影状态”,创建一个新的,挤掉一个旧的。而在这个时间之内,0号残影的alpha是一直维持在0.7的,并在它变为1号残影的时候瞬间变成0.5。顺便4号残影的alpha一直是-0.1所以没显示→_→
2025年01月02日 01点01分
[滑稽]本来就在创建里,计时器有编号。 draw_sprite_ext 第一项 和 第二项用来记录 sprite 的动作 和 帧数。 [滑稽]透明度自己改就行了,加多了反而用不了,因为就记录了5帧,shadow_num = 60 ,这时候就可以变成渐变了。[滑稽]
2024年12月31日 09点12分
透明度更长度有关,长度越长,透明度过渡越平滑。如果独立出来一个参数专门计算透明度,反而会出现各种奇怪的问题。
2024年12月31日 09点12分
@滑稽_电脑 理论上把alarm[0]/shadow_tim也作为参数传递进去,就能做到刷新周期内的alpha随时间渐变。理论上_i / argument0整个括起来乘个0.7就能防止最后几个残影的alpha小于0(至于几个就看你shadow_num设置了多少)。
2025年01月02日 01点01分
1