// fade smoke away:
function fadeSmokeTrailPar(PARTICLE* p){
// decrease alpha:
p.alpha -= p.skill_x * time_step;
// if we don't have alpha, kill particle:
if(p.alpha <= 0){ p.lifespan = 0; }
}
// smoke trail particle:
function smokeTrailPar(PARTICLE* p){
// set color to white:
vec_set(p.blue, COLOR_GREY);
// set size:
p.size = 4;
// set gravity:
p.gravity = -0.4;
// set alpha:
p.alpha = 30;
// set fading speed:
p.skill_x = 1;
// set flags:
set(p, MOVE | BRIGHT | BEAM | TRANSLUCENT);
// set event:
p.event = fadeSmokeTrailPar;
}
// main function:
void main(){
// set framerate limit:
fps_max = 500;
// empty level:
level_load("");
// wait 3 frames:
wait(3);
// set camera positions/angles:
vec_set(camera.x, vector(-140, 0, 90));
vec_set(camera.pan, vector(0, -13, 0));
// vectors:
VECTOR vectexVec;
// reset vectors:
vec_fill(vectexVec.x, 0);
// create smoke emmiter:
ENTITY* smokeEnt = ent_create(CUBE_MDL, vector(200, 0, 0), NULL);
// scale it down:
vec_fill(smokeEnt.scale_x, 0.35);
// set it's flags:
set(smokeEnt, PASSABLE | TRANSLUCENT);
// save position:
vec_set(smokeEnt.skill1, smokeEnt.x);
// loop:
while(1){
// reset framerate limit:
fps_max = 500;
// if ENTER is pressed:
if(key_enter){
// decrease framerate limit:
fps_max = 60;
}
// show framerate:
DEBUG_VAR(fps_max, 30);
DEBUG_VAR(num_particles, 50);
// show text:
draw_text("PRESS <ENTER> TO LOWER FRAMERATE!", 10, 10, COLOR_WHITE);
// rotate smoke emitter:
smokeEnt.pan = cycle(smokeEnt.pan + 30 * time_step, 0, 360);
// move it:
smokeEnt.z = smokeEnt.skill3 + fsin(total_ticks * 8, 64);
smokeEnt.y = smokeEnt.skill2 + fcos(total_ticks * 8, 64);
// get position of upper left vertex:
vec_for_vertex(vectexVec.x, smokeEnt, 3);
// create smoke trail with particles:
effect(smokeTrailPar, maxv(1, 40 * time_step), vectexVec.x, nullvector);
// wait one frame:
wait(1);
}
}