Posted By: MasterQ32
Simple jump'n'run template - 11/29/16 10:43
Hey Guys!
This is a simple, mario-like platformer without complex math, only a simple gravity, collectable coin blocks and moveable blocks. Have Fun!
This is a simple, mario-like platformer without complex math, only a simple gravity, collectable coin blocks and moveable blocks. Have Fun!
Code:
#include <acknex.h> #include <default.c> #include <keys.c> #define MOVE_FLAGS (USE_BOX|IGNORE_PASSABLE|IGNORE_PASSENTS) var score = 0; action block() { my.flags |= LIGHT; my.red = 0; my.green = 32; my.blue = 0; } action coin() { my.flags |= (PASSABLE | LIGHT); my.red = 255; my.green = 255; my.blue = 0; my.ambient = 100; my.scale_x = 0.1; vec_scale(my.scale_x, 0.7); var sz = my.z; var vz = 20; var z = 0; while(my.z >= sz) { wait(1); my.z += vz * time_step; vz -= 5 * time_step; my.pan += 35 * time_step; } ent_remove(me); } action physblock() { my.flags |= LIGHT; my.red = 0; my.green = 0; my.blue = 32; var vel_z = 0; while(1) { vel_z -= 3 * time_step; if(vel_z != 0 && c_move(me, nullvector, vector(0, 0, vel_z * time_step), MOVE_FLAGS) == 0) { vel_z = 0; } if(my.skill2 != 0) { var vel_x = 5 * sign(my.x - player.x) * time_step; c_move(me, nullvector, vector(vel_x, 0, 0), MOVE_FLAGS); } my.skill2 = 0; wait(1); } } action coinblock() { my.flags |= LIGHT; // my.material = mtl_unlit; my.red = 255; my.green = 255; my.blue = 0; my.skill3 = 1; while(my.skill3 > 0) { while(my.skill1 == 0) { wait(1); } score += 1; my.skill1 = 0; my.skill3 -= 1; ent_create(SPHERE_MDL, my.x, coin); } my.red = 0; my.green = 0; my.blue = 0; //ent_remove(me); } action player_control() { my.flags |= (LIGHT | UNLIT); var vel_x = 0; var vel_z = 0; var ground = 0; var wall = 0; var ceiling = 0; while(1) { vel_z -= 3 * time_step; vel_x += (1 + 4 * wall) * (key_cur - key_cul) * time_step; vel_x *= 0.9; if((ground || wall) && key_hit("space")) { vel_z = 12; } if(vel_z != 0 && c_move(me, nullvector, vector(0, 0, vel_z * time_step), MOVE_FLAGS) == 0) { if(vel_z > 0) ceiling = 1; else ground = 1; if(abs(normal.x) > 0.5) { ground = 0; ceiling = 0; } vel_z = 0; } else { ground = 0; ceiling = 0; } if(vel_x != 0 && c_move(me, nullvector, vector(vel_x, 0, 0), MOVE_FLAGS) == 0) { vel_x = 0; wall = 1; } else { wall = 0; } if(c_trace(my.x, vector(my.x, my.y, my.z + 12 * sign(vel_z)), USE_POLYGON | IGNORE_PASSABLE | IGNORE_PASSENTS) != 0) { if(you) { you.skill1 = 1; } } if(c_trace(my.x, vector(my.x + 12 * sign(vel_x), my.y, my.z), USE_POLYGON | IGNORE_PASSABLE | IGNORE_PASSENTS) != 0) { if(you) { you.skill2 = 1; } } wait(1); } } function spawnphys() { ent_create(CUBE_MDL, vector(192, 0, 48), physblock); } function main() { fps_max = 60; d3d_antialias = 9; level_load(NULL); var x, y; for(x = 0; x < 16; x++) { ent_create(CUBE_MDL, vector(16*x, 0, 0), block); if(x==0 || x==3 || x==4) { ent_create(CUBE_MDL, vector(16*x, 0, 16), block); } if(x==3) { ent_create(CUBE_MDL, vector(16*x, 0, 32), block); } } ent_create(CUBE_MDL, vector(128, 0, 48), coinblock); you = ent_create(CUBE_MDL, vector(128+16, 0, 48), coinblock); you.skill3 = 10; on_e = spawnphys; spawnphys(); player = ent_create(SPHERE_MDL, vector(64, 0, 32), player_control); camera.pan = 90; proc_mode = PROC_LATE; while(1) { camera.x = player.x; camera.y = player.y - 256; camera.z = player.z; DEBUG_VAR(score, screen_size.y - 32); wait(1); } }