SlideLaser_lvl2.c 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827
  1. //
  2. // Sliding laser.
  3. // The idea here is to have a player slide a laser below a enemy or enemy weapon. When the laser
  4. // stops sliding a laser is shot upwards and it should destroy the threat.
  5. //
  6. // Working on the BOMBDRONE!
  7. //
  8. //
  9. #include "raylib.h"
  10. #include <math.h>
  11. #define MAX_SLIDELASERS 10
  12. #define MAX_CEILTURRETS 10
  13. #define MAX_BULLETS 64
  14. #define MAX_EFFECT 1000
  15. #define MAX_ELEVATORS 100
  16. int myMap[33][11] = {
  17. {1,1,1,1,1,1,1,1,1,1,1},
  18. {1,1,1,1,1,1,1,1,1,1,1},
  19. {1,1,1,1,1,1,1,1,1,1,1},
  20. {1,1,1,1,1,1,1,1,1,1,1},
  21. {1,1,1,1,1,1,1,1,1,1,1},
  22. {1,1,1,1,1,1,1,1,1,1,1},
  23. {1,1,1,1,1,1,1,1,1,1,1},
  24. {1,1,1,1,0,0,0,2,0,0,1},
  25. {1,1,1,1,0,0,0,0,0,0,1},
  26. {1,1,1,1,0,0,0,0,0,0,1},
  27. {1,0,0,0,0,0,0,0,0,0,1},
  28. {1,0,1,1,1,1,1,1,1,1,1},
  29. {1,0,1,1,1,1,1,1,1,1,1},
  30. {1,0,1,0,2,0,1,1,1,1,1},
  31. {1,0,1,0,0,0,1,1,1,1,1},
  32. {1,0,1,0,0,0,1,1,1,1,1},
  33. {1,0,0,0,0,0,1,1,1,1,1},
  34. {1,0,0,0,0,0,0,0,0,0,1},
  35. {1,3,1,1,1,1,1,1,0,0,1},
  36. {1,1,1,1,1,1,1,1,0,0,1},
  37. {1,1,1,0,2,0,0,1,0,0,1},
  38. {1,1,1,0,0,0,0,1,0,0,1},
  39. {1,1,1,0,0,0,0,1,0,0,1},
  40. {1,1,1,0,0,0,0,1,0,0,1},
  41. {1,0,0,0,0,0,0,0,0,0,1},
  42. {1,1,1,1,1,1,1,1,3,3,1},
  43. {1,1,1,1,1,1,1,1,1,1,1},
  44. {1,1,1,1,1,1,1,1,1,1,1},
  45. {1,1,1,1,1,1,1,1,1,1,1},
  46. {1,1,1,1,1,1,1,1,1,1,1},
  47. {1,1,1,1,1,1,1,1,1,1,1},
  48. {1,1,1,1,1,1,1,1,1,1,1},
  49. {1,1,1,1,1,1,1,1,1,1,1}
  50. };
  51. int mapy;
  52. int mapx;
  53. int mapWidth = 11;
  54. int mapHeight = 33;
  55. float tileWidth;
  56. float tileHeight;
  57. typedef struct player{
  58. bool active;
  59. Vector2 position;
  60. int direction; // -1 left, 2 - right
  61. int state; //state 1=elevator(freeze) 2=flying drone(freeze)
  62. int w;
  63. int h;
  64. int numslidelasers;
  65. int keydelaycount;
  66. }player;
  67. static player myplayer = {0};
  68. typedef struct bombdrone{
  69. bool active;
  70. Vector2 position;
  71. int w;
  72. int traveledy;//for resetting the map(stores distance traveled)
  73. int h;
  74. int state; // 1 is countdown
  75. int countdown;
  76. int countdowntime;
  77. }bombdrone;
  78. static bombdrone mybombdrone = {0};
  79. static struct elevator{
  80. bool active;
  81. int state;//0=nothing//1=goingup
  82. Vector2 position;
  83. int floorloc;
  84. int ceilingloc;
  85. int w;
  86. int h;
  87. }elevator;
  88. static struct elevator arr_elevator[MAX_ELEVATORS];
  89. static struct effect2{
  90. bool active;
  91. Vector2 position;
  92. int startdelay;
  93. int radius;
  94. int countdown;
  95. }effect2;
  96. static struct effect2 arr_effect2[MAX_EFFECT];
  97. static struct effect{
  98. bool active;
  99. Vector2 position;
  100. Vector2 inc;
  101. Vector2 incmod;
  102. int w;
  103. int h;
  104. int countdown;
  105. }effect;
  106. static struct effect arr_effect[MAX_EFFECT];
  107. // design.
  108. // shoot x amount of rays into any direction to see if player is there.
  109. // if player is there than the bullet is shot.
  110. static struct bullet{
  111. bool active;
  112. Vector2 position;
  113. Vector2 inc;
  114. int radius;
  115. }bullet;
  116. static struct bullet arr_bullet[MAX_BULLETS];
  117. static struct ceilturret{
  118. bool active;
  119. Vector2 position;
  120. int w;
  121. int h;
  122. int shootdelay;
  123. }aiceilturret;
  124. static struct ceilturret arr_ceilturret[MAX_CEILTURRETS];
  125. static struct slidelaser{
  126. bool active;
  127. int state;
  128. Vector2 position;
  129. Vector2 inc;
  130. Vector2 incdec;
  131. int ceilingloc;
  132. int w;
  133. int h;
  134. }slidelaser;
  135. static struct slidelaser arr_slidelaser[MAX_SLIDELASERS];
  136. //Unit collide with solid blocks true/false
  137. bool recttilecollide(int x, int y, int w, int h, int offsetx,int offsety);
  138. // Our rectsoverlap function. Returns true/false.
  139. static bool rectsoverlap(int x1,int y1,int w1,int h1,int x2,int y2,int w2,int h2);
  140. void createeffect(int x, int y);
  141. void updateentities(int x,int y,int state); // state 2=drone
  142. int screenWidth;
  143. int screenHeight;
  144. int main(void)
  145. {
  146. // Initialization
  147. //--------------------------------------------------------------------------------------
  148. screenWidth = 800;
  149. screenHeight = 600;
  150. tileWidth = ceil((float)(float)screenWidth/(float)mapWidth);
  151. tileHeight = ceil((float)screenHeight/(float)(10));
  152. mapy=-tileHeight*19;
  153. InitWindow(screenWidth, screenHeight, "raylib example.");
  154. SetTargetFPS(60); // Set our game to run at 60 frames-per-second
  155. //--------------------------------------------------------------------------------------
  156. arr_slidelaser[0].active = false;
  157. arr_slidelaser[0].state = 0;
  158. arr_slidelaser[0].position = (Vector2){160,530};
  159. arr_slidelaser[0].w = 16;
  160. arr_slidelaser[0].h = 10;
  161. arr_slidelaser[0].inc.x = 3;
  162. arr_slidelaser[0].incdec.x = 0.02;
  163. myplayer.active = true;
  164. myplayer.w = 16;
  165. myplayer.h = 24;
  166. myplayer.position = (Vector2){100,336};
  167. myplayer.direction = 2;
  168. myplayer.state = 0;
  169. mybombdrone.active = true;
  170. mybombdrone.w = 16;
  171. mybombdrone.h = 16;
  172. mybombdrone.position = (Vector2){120,336};
  173. //create the ceiling turrets
  174. int ceilcount=0;
  175. for(int y=0;y<mapHeight;y++){
  176. for(int x=0;x<mapWidth;x++){
  177. if(myMap[y][x]==2){
  178. myMap[y][x]=0;
  179. arr_ceilturret[ceilcount].active = true;
  180. arr_ceilturret[ceilcount].position.x=x*tileWidth;
  181. arr_ceilturret[ceilcount].position.y=y*tileHeight+mapy;
  182. arr_ceilturret[ceilcount].w = tileWidth/2;
  183. arr_ceilturret[ceilcount].h = tileHeight/2;
  184. ceilcount++;
  185. }
  186. }}
  187. // create the elevators
  188. // design notes : find spot 3 on map and find width.
  189. // find the ceiling
  190. int numelevator=0;
  191. for(int y=0;y<mapHeight;y++){
  192. for(int x=0;x<mapWidth;x++){
  193. if(myMap[y][x]==3){//elevator here
  194. //myMap[y][x]=1;
  195. //find width
  196. int elevatorwidth=0;
  197. int pos=x;
  198. while(myMap[y][pos]==3){
  199. myMap[y][pos]=1;
  200. elevatorwidth++;
  201. pos++;
  202. }
  203. // find ceiling
  204. int ax = x;
  205. int ay = y-1;
  206. int top=0;
  207. while(myMap[ay][ax]==0){
  208. ay--;
  209. top++;
  210. }
  211. top--;
  212. arr_elevator[numelevator].ceilingloc=(y*tileHeight+mapy)-top*tileHeight;
  213. arr_elevator[numelevator].active=true;
  214. arr_elevator[numelevator].w = tileWidth*elevatorwidth;
  215. arr_elevator[numelevator].h = tileHeight;
  216. arr_elevator[numelevator].position.y = y*tileHeight+mapy;
  217. arr_elevator[numelevator].floorloc = y*tileHeight+mapy;
  218. arr_elevator[numelevator].position.x = x*tileWidth;
  219. numelevator++;
  220. //x+=elevatorwidth;
  221. }
  222. }}
  223. // Main game loop
  224. while (!WindowShouldClose()) // Detect window close button or ESC key
  225. {
  226. // Update
  227. //----------------------------------------------------------------------------------
  228. // update the elevators
  229. for(int i=0;i<MAX_ELEVATORS;i++){
  230. if(arr_elevator[i].active==false)continue;
  231. // Elevator doing nothing
  232. if(arr_elevator[i].state==0){
  233. if(rectsoverlap(myplayer.position.x,myplayer.position.y,myplayer.w,myplayer.h+2,
  234. arr_elevator[i].position.x,arr_elevator[i].position.y,arr_elevator[i].w,arr_elevator[i].h)){
  235. if(IsKeyDown(KEY_SPACE) && arr_elevator[i].position.y!=arr_elevator[i].ceilingloc){
  236. myplayer.state=1;
  237. arr_elevator[i].state=1;
  238. }
  239. if(IsKeyDown(KEY_SPACE) && arr_elevator[i].position.y==arr_elevator[i].ceilingloc){
  240. myplayer.state=1;
  241. arr_elevator[i].state=2;
  242. }
  243. }
  244. }
  245. // Elevator going up
  246. if(arr_elevator[i].state==1){
  247. arr_elevator[i].position.y-=2;
  248. updateentities(0,2,0);
  249. mapy+=2;
  250. if(arr_elevator[i].position.y==arr_elevator[i].ceilingloc){
  251. arr_elevator[i].state=0;
  252. myplayer.state=0;
  253. }
  254. }
  255. // Elevator going down
  256. if(arr_elevator[i].state==2){
  257. arr_elevator[i].position.y+=2;
  258. updateentities(0,-2,0);
  259. mapy-=2;
  260. if(arr_elevator[i].position.y==arr_elevator[i].floorloc){
  261. arr_elevator[i].state=0;
  262. myplayer.state=0;
  263. }
  264. }
  265. }
  266. // update the effect 2
  267. for(int i=0;i<MAX_EFFECT;i++){
  268. if(arr_effect2[i].active==false)continue;
  269. arr_effect2[i].countdown--;
  270. if(arr_effect2[i].countdown<0){
  271. arr_effect2[i].active=false;
  272. }
  273. }
  274. // update the effect
  275. for(int i=0;i<MAX_EFFECT;i++){
  276. if(arr_effect[i].active==true){
  277. // When exit the effect and disable
  278. Vector2 oldpos = arr_effect[i].position;
  279. arr_effect[i].countdown--;
  280. if(arr_effect[i].countdown<0)arr_effect[i].active=false;
  281. arr_effect[i].inc.y += arr_effect[i].incmod.y;
  282. if(arr_effect[i].inc.x<0){
  283. arr_effect[i].inc.x-=arr_effect[i].incmod.x;
  284. }else{
  285. arr_effect[i].inc.x+=arr_effect[i].incmod.x;;
  286. }
  287. arr_effect[i].position.x += arr_effect[i].inc.x;
  288. arr_effect[i].position.y += arr_effect[i].inc.y;
  289. if(recttilecollide(arr_effect[i].position.x,arr_effect[i].position.y,1,32,0,-1)){
  290. arr_effect[i].inc.y=-arr_effect[i].inc.y/4;
  291. }
  292. if(recttilecollide(arr_effect[i].position.x,arr_effect[i].position.y,1,6,0,0)){
  293. arr_effect[i].inc.x/=2;
  294. arr_effect[i].position = oldpos;
  295. }
  296. }
  297. }
  298. //Update the bullets
  299. for(int i=0;i<MAX_BULLETS;i++){
  300. if(arr_bullet[i].active==false)continue;
  301. for(int speed=0;speed<8;speed++){
  302. arr_bullet[i].position.x+=arr_bullet[i].inc.x;
  303. arr_bullet[i].position.y+=arr_bullet[i].inc.y;
  304. if(recttilecollide(arr_bullet[i].position.x,arr_bullet[i].position.y,6,6,0,0)){
  305. arr_bullet[i].active=false;
  306. }
  307. }
  308. }
  309. // update the turrets
  310. for(int i=0;i<MAX_CEILTURRETS;i++){
  311. if(arr_ceilturret[i].active==false)continue;
  312. arr_ceilturret[i].shootdelay-=1;
  313. if(arr_ceilturret[i].shootdelay>0)continue;
  314. int touch;//if collided with map count
  315. for(int a=0;a<10;a++){
  316. float angle=(float)GetRandomValue(0,6200)/100;
  317. Vector2 position = arr_ceilturret[i].position;
  318. for(int b=0;b<screenHeight;b++){
  319. position.x += cos(angle)*2;
  320. position.y += sin(angle)*2;
  321. if(recttilecollide(position.x,position.y,6,6,0,0))b=999999;
  322. if(rectsoverlap(position.x,position.y,6,6,myplayer.position.x,myplayer.position.y,myplayer.w,myplayer.h)){
  323. for(int free=0;free<MAX_BULLETS;free++){
  324. if(arr_ceilturret[i].shootdelay<0 && arr_bullet[free].active==false){
  325. arr_bullet[free].active=true;
  326. arr_bullet[free].radius = 6;
  327. arr_bullet[free].position = arr_ceilturret[i].position;
  328. arr_bullet[free].position.x+=GetRandomValue(0,10);
  329. arr_bullet[free].inc.x = cos(angle)*1;
  330. arr_bullet[free].inc.y = sin(angle)*1;
  331. arr_ceilturret[i].shootdelay = 20;
  332. }
  333. }
  334. }
  335. }
  336. }
  337. }
  338. // Update the slidelasers
  339. for(int i=0;i<MAX_SLIDELASERS;i++){
  340. if(arr_slidelaser[i].active==false)continue;
  341. if(arr_slidelaser[i].state==0){
  342. if(arr_slidelaser[i].inc.x>0){
  343. arr_slidelaser[i].inc.x-=arr_slidelaser[i].incdec.x;
  344. }else{
  345. arr_slidelaser[i].inc.x+=arr_slidelaser[i].incdec.x;
  346. }
  347. if((arr_slidelaser[i].inc.x>-0.2 && arr_slidelaser[i].inc.x<0.2) || recttilecollide(arr_slidelaser[i].position.x,arr_slidelaser[i].position.y,arr_slidelaser[i].w,arr_slidelaser[i].h,0,0)){
  348. arr_slidelaser[i].state = 1;
  349. arr_slidelaser[i].inc.x = 0;
  350. // find ceiling(top of the laser beam;)
  351. int ceilingloc;
  352. for(int y=arr_slidelaser[i].position.y;y>0;y--){
  353. if(recttilecollide(arr_slidelaser[i].position.x+4,y,1,1,0,0)){
  354. ceilingloc=y+1;
  355. break;
  356. }
  357. }
  358. arr_slidelaser[i].ceilingloc = ceilingloc;
  359. }
  360. arr_slidelaser[i].position.x+=arr_slidelaser[i].inc.x;
  361. }
  362. // If the laser cuts into the first! ceiling turret then remove it.
  363. if(arr_slidelaser[i].state==1){
  364. if(arr_slidelaser[i].active==true){
  365. for(int j=0;j<MAX_CEILTURRETS;j++){ //DrawRectangle(arr_slidelaser[i].position.x+3,arr_slidelaser[i].ceilingloc,arr_slidelaser[i].w-6,arr_slidelaser[i].position.y-arr_slidelaser[i].ceilingloc,YELLOW);
  366. if(rectsoverlap(arr_slidelaser[i].position.x,arr_slidelaser[i].ceilingloc,arr_slidelaser[i].w,arr_slidelaser[i].position.y-arr_slidelaser[i].ceilingloc,arr_ceilturret[j].position.x-arr_ceilturret[j].w,arr_ceilturret[j].position.y,arr_ceilturret[j].w*2,10)){
  367. if(arr_ceilturret[j].active)createeffect(arr_ceilturret[j].position.x,arr_ceilturret[j].position.y+tileHeight/4);
  368. arr_ceilturret[j].active=false;
  369. }
  370. }
  371. }
  372. }
  373. }
  374. // Update the bombdrone..
  375. if(mybombdrone.active==true && myplayer.state==2){
  376. Vector2 oldpos = mybombdrone.position;
  377. int fast=1;
  378. if(IsKeyDown(KEY_LEFT_SHIFT)){
  379. fast++;
  380. }
  381. if(IsKeyDown(KEY_DOWN)){
  382. for(int i=0;i<fast;i++){
  383. if(recttilecollide(mybombdrone.position.x,mybombdrone.position.y,mybombdrone.w,mybombdrone.h,0,1)==false){
  384. if(mapy>-tileHeight*19){
  385. mapy--;
  386. mybombdrone.traveledy--; // keep a variable that contains the distance traveled.
  387. updateentities(0,-1,2);
  388. }
  389. }
  390. };
  391. //if(mapy<-tileHeight*10)mapy=-tileHeight*10;
  392. //myplayer.position.y += fast;
  393. //myplayer.direction = 2;
  394. }
  395. if(IsKeyDown(KEY_UP)){
  396. for(int i=0;i<fast;i++){
  397. if(recttilecollide(mybombdrone.position.x,mybombdrone.position.y,mybombdrone.w,mybombdrone.h,0,-1)==false){
  398. if(mapy<0){
  399. mapy++;
  400. mybombdrone.traveledy++;
  401. updateentities(0,1,2);
  402. }
  403. }
  404. }
  405. //if(mapy>0)mapy=0;
  406. //myplayer.position.y += fast;
  407. //myplayer.direction = 2;
  408. }
  409. if(IsKeyDown(KEY_RIGHT)){
  410. mybombdrone.position.x += fast;
  411. }
  412. if(IsKeyDown(KEY_LEFT)){
  413. mybombdrone.position.x -= fast;
  414. }
  415. if(recttilecollide(mybombdrone.position.x,mybombdrone.position.y,mybombdrone.w,mybombdrone.h,0,0)){
  416. mybombdrone.position = oldpos;
  417. }
  418. // Explode the Drone
  419. if(IsKeyPressed(KEY_Z)){
  420. mybombdrone.state = 1;
  421. mybombdrone.countdown = 3;
  422. mybombdrone.countdowntime = 60;
  423. }
  424. // Disable the drone.
  425. if(IsKeyPressed(KEY_D)){
  426. if(rectsoverlap(mybombdrone.position.x,mybombdrone.position.y,mybombdrone.w,mybombdrone.h,myplayer.position.x-8,myplayer.position.y-8,myplayer.w+16,myplayer.h+16)==true){
  427. myplayer.state = 0;
  428. myplayer.keydelaycount=20;
  429. }
  430. }
  431. // drone explode!!
  432. if(mybombdrone.state==1){
  433. mybombdrone.countdowntime--;
  434. if(mybombdrone.countdowntime<0){
  435. mybombdrone.countdowntime=60;
  436. mybombdrone.countdown-=1;
  437. if(mybombdrone.countdown==0){//here it explodes!
  438. // Check(!) if it should destroy a ceiling turret
  439. for(int i=0;i<MAX_CEILTURRETS;i++){
  440. if(arr_ceilturret[i].active==false)continue;
  441. //arr_ceilturret[i].active=false;
  442. if(rectsoverlap(mybombdrone.position.x-tileWidth/2,mybombdrone.position.y-tileHeight/2,
  443. tileWidth,tileHeight,
  444. arr_ceilturret[i].position.x-50,arr_ceilturret[i].position.y-50,
  445. 100,100)){
  446. arr_ceilturret[i].active=false;
  447. }
  448. }
  449. //
  450. mybombdrone.state=0;
  451. myplayer.state=0;
  452. createeffect(mybombdrone.position.x,mybombdrone.position.y);
  453. updateentities(0,-mybombdrone.traveledy,2);
  454. mapy-=mybombdrone.traveledy;
  455. mybombdrone.traveledy=0;
  456. }
  457. }
  458. }
  459. }
  460. // Update the player..
  461. if(myplayer.active==true && myplayer.state==0){
  462. if(myplayer.keydelaycount>0)myplayer.keydelaycount--;
  463. Vector2 oldpos = myplayer.position;
  464. int fast=1;
  465. if(IsKeyDown(KEY_LEFT_SHIFT)){
  466. fast++;
  467. }
  468. // if(IsKeyDown(KEY_DOWN)){
  469. // for(int i=0;i<fast;i++){
  470. // if(mapy>-tileHeight*19){
  471. // mapy--;
  472. // updateentities(0,-1,0);
  473. // }
  474. // };
  475. //if(mapy<-tileHeight*10)mapy=-tileHeight*10;
  476. //myplayer.position.y += fast;
  477. //myplayer.direction = 2;
  478. // }
  479. // if(IsKeyDown(KEY_UP)){
  480. // for(int i=0;i<fast;i++){
  481. // if(mapy<0){
  482. // mapy++;
  483. // updateentities(0,1,0);
  484. // }
  485. // }
  486. //if(mapy>0)mapy=0;
  487. //myplayer.position.y += fast;
  488. //myplayer.direction = 2;
  489. // }
  490. if(IsKeyDown(KEY_RIGHT)){
  491. myplayer.position.x += fast;
  492. myplayer.direction = 2;
  493. }
  494. if(IsKeyDown(KEY_LEFT)){
  495. myplayer.position.x -= fast;
  496. myplayer.direction = 1;
  497. }
  498. if(recttilecollide(myplayer.position.x,myplayer.position.y,myplayer.w,myplayer.h,0,0)){
  499. myplayer.position = oldpos;
  500. }
  501. // Enable the drone.
  502. if(IsKeyPressed(KEY_D) && myplayer.keydelaycount==0){
  503. myplayer.state = 2;
  504. if(recttilecollide(myplayer.position.x+20,myplayer.position.y,mybombdrone.w,mybombdrone.h,0,0)==false){
  505. mybombdrone.position.x = myplayer.position.x+16;
  506. }else{
  507. mybombdrone.position.x = myplayer.position.x-16;
  508. }
  509. mybombdrone.position.y = myplayer.position.y;
  510. }
  511. if(IsKeyPressed(KEY_Z)){ // Slide the laser weapon
  512. if(myplayer.numslidelasers<3){
  513. int cl=myplayer.numslidelasers; // current sliding laser number
  514. arr_slidelaser[cl].active = true;
  515. arr_slidelaser[cl].w = 16;
  516. arr_slidelaser[cl].h = 10;
  517. arr_slidelaser[cl].incdec.x = 0.02;
  518. arr_slidelaser[cl].state = 0;
  519. arr_slidelaser[cl].position.x = myplayer.position.x;
  520. arr_slidelaser[cl].position.y = myplayer.position.y+arr_slidelaser[0].h+4;
  521. if(myplayer.direction==1){
  522. arr_slidelaser[cl].inc.x = -1.5*fast;
  523. }else{
  524. arr_slidelaser[cl].inc.x = 1.5*fast;
  525. }
  526. myplayer.numslidelasers++;
  527. }
  528. }
  529. }
  530. //----------------------------------------------------------------------------------
  531. // Draw
  532. //----------------------------------------------------------------------------------
  533. BeginDrawing();
  534. ClearBackground(LIGHTGRAY);
  535. // Draw the turrets
  536. for(int i=0;i<MAX_CEILTURRETS;i++){
  537. if(arr_ceilturret[i].active==false)continue;
  538. DrawEllipse(arr_ceilturret[i].position.x,arr_ceilturret[i].position.y,arr_ceilturret[i].w,arr_ceilturret[i].h,WHITE);
  539. DrawEllipse(arr_ceilturret[i].position.x+4,arr_ceilturret[i].position.y,arr_ceilturret[i].w-4,arr_ceilturret[i].h,BLACK);
  540. DrawEllipse(arr_ceilturret[i].position.x+2,arr_ceilturret[i].position.y+2,arr_ceilturret[i].w-5,arr_ceilturret[i].h-4,YELLOW);
  541. }
  542. // Draw map
  543. for (int y = 0; y< mapHeight ; y++)
  544. {
  545. for (int x = 0; x< mapWidth ; x++)
  546. {
  547. if (myMap[y][x] == 1)
  548. {
  549. DrawRectangle(x*tileWidth,y*tileHeight+mapy,tileWidth,tileHeight,(Color){60,50,250,255});
  550. }
  551. }
  552. }
  553. // draw the player
  554. if(myplayer.active==true){
  555. DrawRectangle(myplayer.position.x,myplayer.position.y,myplayer.w,myplayer.h,GREEN);
  556. }
  557. // draw the bombdrone
  558. if(mybombdrone.active==true && myplayer.state==2){
  559. DrawRectangle(mybombdrone.position.x,mybombdrone.position.y,mybombdrone.w,mybombdrone.h,RED);
  560. if(mybombdrone.state==1){
  561. DrawRectangle(mybombdrone.position.x+2,mybombdrone.position.y+1,mybombdrone.w-4,mybombdrone.h-2,BLACK);
  562. DrawText(FormatText("%1i",mybombdrone.countdown),mybombdrone.position.x+3,mybombdrone.position.y+2,14,WHITE);
  563. }
  564. }
  565. // Draw the slidelasers
  566. for(int i=0;i<MAX_SLIDELASERS;i++){
  567. if(arr_slidelaser[i].active==false)continue;
  568. DrawRectangle(arr_slidelaser[i].position.x,arr_slidelaser[i].position.y,arr_slidelaser[i].w,arr_slidelaser[i].h,GRAY);
  569. if(arr_slidelaser[i].state==1){
  570. DrawRectangle(arr_slidelaser[i].position.x+3,arr_slidelaser[i].ceilingloc,arr_slidelaser[i].w-6,arr_slidelaser[i].position.y-arr_slidelaser[i].ceilingloc,YELLOW);
  571. }
  572. }
  573. // Draw the elevators
  574. for(int i=0;i<MAX_ELEVATORS;i++){
  575. if(arr_elevator[i].active==false)continue;
  576. DrawRectangle(arr_elevator[i].position.x,arr_elevator[i].position.y,arr_elevator[i].w,arr_elevator[i].h,DARKGRAY);
  577. }
  578. // Draw the bullets
  579. for(int i=0;i<MAX_BULLETS;i++){
  580. if(arr_bullet[i].active==false)continue;
  581. DrawCircle(arr_bullet[i].position.x,arr_bullet[i].position.y,6,RED);
  582. }
  583. // draw the effect
  584. for(int i=0;i<MAX_EFFECT;i++){
  585. if(arr_effect[i].active==false)continue;
  586. DrawRectangle(arr_effect[i].position.x,arr_effect[i].position.y,arr_effect[i].w,arr_effect[i].h,RED);
  587. }
  588. // draw the effect2
  589. for(int i=0;i<MAX_EFFECT;i++){
  590. if(arr_effect2[i].active==false)continue;
  591. arr_effect2[i].startdelay--;
  592. if(arr_effect2[i].startdelay>0)continue;
  593. DrawCircle(arr_effect2[i].position.x,arr_effect2[i].position.y,arr_effect2[i].radius,WHITE);
  594. }
  595. // some screen info
  596. if(myplayer.state==0){
  597. DrawText("Cursor Left/Right. Left Shift = Run. Z key = Slide laser. D = Drone",2,2,22,WHITE);
  598. }
  599. if(myplayer.state==2){
  600. DrawText("Cursor L/R/U/D. Left Shift = Fast. Z key = Explode. D = Dock",2,2,22,WHITE);
  601. }
  602. DrawText(FormatText("SlideLasers : %02i",3-myplayer.numslidelasers),2,screenHeight-32,26,WHITE);
  603. //DrawText(FormatText("mpx: %f mpy: %f - bdx:%f bdy: %f",myplayer.position.x,myplayer.position.y,mybombdrone.position.x,mybombdrone.position.y),100,200,22,WHITE);
  604. //DrawText(FormatText("SlideLasers : %f",PI*2.0f),312,screenHeight-32,26,WHITE);
  605. EndDrawing();
  606. //------------------------------- --------------------------------------------------
  607. }
  608. // De-Initialization
  609. //--------------------------------------------------------------------------------------
  610. CloseWindow(); // Close window and OpenGL context
  611. //--------------------------------------------------------------------------------------
  612. return 0;
  613. }
  614. void updateentities(int x, int y,int state){
  615. for(int i=0;i<MAX_CEILTURRETS;i++){
  616. if(arr_ceilturret[i].active==false)continue;
  617. arr_ceilturret[i].position.y+=y;
  618. }
  619. for(int i=0;i<MAX_BULLETS;i++){
  620. if(arr_bullet[i].active==false)continue;
  621. arr_bullet[i].position.y+=y;
  622. }
  623. for(int i=0;i<MAX_EFFECT;i++){
  624. if(arr_effect[i].active==false)continue;
  625. arr_effect[i].position.y+=y;
  626. }
  627. for(int i=0;i<MAX_EFFECT;i++){
  628. if(arr_effect2[i].active==false)continue;
  629. arr_effect2[i].position.y+=y;
  630. }
  631. for(int i=0;i<MAX_SLIDELASERS;i++){
  632. if(arr_slidelaser[i].active==false)continue;
  633. arr_slidelaser[i].position.y+=y;
  634. arr_slidelaser[i].ceilingloc+=y;
  635. }
  636. for(int i=0;i<MAX_ELEVATORS;i++){
  637. if(arr_elevator[i].active==false)continue;
  638. arr_elevator[i].position.y+=y;
  639. arr_elevator[i].ceilingloc+=y;
  640. arr_elevator[i].floorloc+=y;
  641. }
  642. if(state==2){
  643. myplayer.position.x+=x;
  644. myplayer.position.y+=y;
  645. }
  646. }
  647. void createeffect(int posx, int posy){
  648. //int posx = GetRandomValue(0,screenWidth);
  649. //int posy = GetRandomValue(0,screenHeight);
  650. int i=0;
  651. int cnt=0;
  652. while(cnt<5){
  653. i++;
  654. if(i>MAX_EFFECT){
  655. continue;
  656. }
  657. if(arr_effect2[i].active==true){
  658. continue;
  659. }
  660. arr_effect2[i].active = true;
  661. arr_effect2[i].position.x = posx+GetRandomValue(-32,32);
  662. arr_effect2[i].position.y = posy+GetRandomValue(-32,32);
  663. arr_effect2[i].startdelay = GetRandomValue(0,60);
  664. arr_effect2[i].countdown = 10+arr_effect2[i].startdelay;
  665. arr_effect2[i].radius = GetRandomValue(tileWidth/4,tileWidth);
  666. cnt++;
  667. }
  668. i=0;
  669. cnt=0;
  670. while(cnt<32){
  671. i++;
  672. if(i>MAX_EFFECT){
  673. continue;
  674. }
  675. if(arr_effect[i].active==true){
  676. continue;
  677. }
  678. arr_effect[i].active = true;
  679. arr_effect[i].position.x = posx;
  680. arr_effect[i].position.y = posy;
  681. arr_effect[i].w = 16;
  682. arr_effect[i].h = 16;
  683. arr_effect[i].inc.x = GetRandomValue(-1,1);
  684. arr_effect[i].inc.y = GetRandomValue(-5,-2);
  685. arr_effect[i].incmod.x = (float)(GetRandomValue(0,100)/3500.0f);
  686. arr_effect[i].incmod.y = (float)(GetRandomValue(0,100)/1000.0f);//+0.1f;
  687. if(GetRandomValue(0,8)==1){
  688. arr_effect[i].incmod.x*=5;
  689. arr_effect[i].inc.y*=1.5;
  690. }
  691. if(GetRandomValue(0,8)==1){
  692. arr_effect[i].incmod.x*=5;
  693. arr_effect[i].inc.y/=2;
  694. }
  695. arr_effect[i].countdown = GetRandomValue(30,70);
  696. cnt++;
  697. }
  698. }
  699. //Unit collide with solid blocks true/false
  700. bool recttilecollide(int x, int y,int w, int h, int offsetx,int offsety){
  701. y+=abs(mapy);
  702. int cx = (x+offsetx)/tileWidth;
  703. int cy = (y+offsety)/tileHeight;
  704. for(int y2=cy-1; y2<cy+2;y2++){//Note that the - and + are to be set differently with differently sized players
  705. for(int x2=cx-1; x2<cx+2;x2++){
  706. if(x2>=0 && x2<mapWidth && y2>=0 && y2<mapHeight){
  707. if(myMap[y2][x2] == 1){
  708. int x3 = (x2)*tileWidth;
  709. int y3 = (y2)*tileHeight;
  710. if(rectsoverlap(x+offsetx,y+offsety,w,h,x3,y3,tileWidth,tileHeight)){
  711. return true;
  712. }
  713. }
  714. }
  715. }}
  716. return false;
  717. }
  718. // Rectangles overlap
  719. bool rectsoverlap(int x1,int y1,int w1,int h1,int x2,int y2,int w2,int h2){
  720. if(x1 >= (x2 + w2) || (x1 + w1) <= x2) return false;
  721. if(y1 >= (y2 + h2) || (y1 + h1) <= y2) return false;
  722. return true;
  723. }