Microthread that making curving laser look smoothly.
task Beam( parameters ){ // Microthread that controls the movement of a curving laser.
let obj=Obj_Create(OBJ_SHOT);
CurveLaserBase02(obj,parameters); // curving laser effects will appear following the movement of an object "obj".
while(!Obj_BeDeleted(obj)){
// Put codes that control bullet movement you want.
yield;
}
}
task CurveLaserBase02(let object,let X,let Y,let spd,let wid,let ang,let grap,let killtime){ // Microthread that set basic parameters and commands to draw laser graphic.
Obj_SetPosition(object,X,Y); // Set a starting position of laser.
Obj_SetSpeed(object,spd); // Set a starting speed of laser.
Obj_SetAngle(object,ang); // Set a starting angle of laser.
ObjShot_ToItem(object,false);
ObjShot_SetBombResist(object,true);
while(!Obj_BeDeleted(object)){
EffectForLaser02(object,Obj_GetX(object),Obj_GetY(object),Obj_GetSpeed(object),wid,Obj_GetAngle(object),grap,killtime); // Create laser effect every 2 frames until starting bullet (microthread Beam) disappears.
wait(1);
yield;}
}
task EffectForLaser02(let obj1,let X,let Y,let spd,let wid,let ang,let grap,let killtime){ // Microthread that draws laser graphic.[/i]
let obj=Obj_Create(OBJ_LASER); // Creates laser graphic object.
let alpha=0;
let length=(int(200/3*spd))/10; // Laser graphic length. If this parameter is too long, laser will look like chainsaw when spinning or so. If too short, laser will look like a rosary.
let width=wid;
Obj_SetPosition(obj,X,Y);
Obj_SetAngle(obj,ang);
ObjShot_SetGraphic(obj,grap);
ObjLaser_SetSource(obj,false);
ObjLaser_SetLength(obj,0); // If this parameter is not set 0, front tip of a laser will look too sharp.
ObjLaser_SetWidth(obj,width);
Obj_SetCollisionToPlayer(obj,true);
Obj_SetAutoDelete(obj,true);
ObjShot_ToItem(obj,false);
ObjShot_SetBombResist(obj,true);
Obj_SetAlpha(obj,alpha);
loop(5){ // First 5 frames. This also makes front tip of a laser look smoothly.
alpha+=(255)/5;
Obj_SetAlpha(obj,alpha);
yield;}
Obj_SetAlpha(obj,alpha);
ObjLaser_SetLength(obj,length);
let tAngle=Obj_GetAngle(obj1);
Obj_SetAngle(obj,(ang+tAngle)/2); // To make the line of a laser smoothly.
let fac=Collision_Line_Circle(Obj_GetX(obj),Obj_GetY(obj),Obj_GetX(obj)+spd*4*cos(Obj_GetAngle(obj)),Obj_GetY(obj)+spd*4*sin(Obj_GetAngle(obj)),ObjLaser_GetWidth(obj)*0.5,GetPlayerX,GetPlayerY,6); // There was a error that laser don't hit characters, so I had to add this parameter. This parameter determines whether your character hit by this laser.
let k=0;
let wi=0;
let gtime=0;
loop(killtime-5){
if(fac && GetTimeOfPlayerInvincibility==0){ShootDownPlayer;} // Bang! You're dead. Not when you're using a bomb or just ressurected.
k++;
wi=int(width*(0.75+0.25*cos(k*90/(killtime-5)))); // Just adjusting the width of a laser to look pretty.
Obj_SetAlpha(obj,alpha);
ObjLaser_SetLength(obj,ObjLaser_GetLength(obj));
ObjLaser_SetWidth(obj,wi);
yield;}
Obj_Delete(obj);
}