doublejointed.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464
  1. /*******************************************************************************************
  2. *
  3. * raylib [textures] example - Texture loading and drawing a part defined by a rectangle
  4. *
  5. * This example has been created using raylib 1.3 (www.raylib.com)
  6. * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
  7. *
  8. * Copyright (c) 2014 Ramon Santamaria (@raysan5)
  9. *
  10. ********************************************************************************************/
  11. #include "raylib.h"
  12. #define MAX_FRAME_SPEED 15
  13. #define MIN_FRAME_SPEED 1
  14. #define animIdle 0
  15. #define animKick 1
  16. #define animHit1 2
  17. #define animUcut 3
  18. #define animHit2 4
  19. #define animWalk 5
  20. #define animDamage 6
  21. #define animFlying 7
  22. #define MAX_PLAYERS 1
  23. typedef struct player{
  24. bool active;
  25. float facing; //-1 left, 1 right
  26. Vector2 position;
  27. int w;
  28. int h;
  29. int score;
  30. int health;
  31. int currentFrame;
  32. int currentAnim; // which animation is currenty active
  33. int lastAnim;
  34. int framesCounter;
  35. int frame_start;
  36. int frame_end;
  37. int keynothingtime; // when key is down this is zero (used to disable animations..)
  38. int lastFiretime;
  39. int lastFireAnim;
  40. }player;
  41. static struct player p[MAX_PLAYERS];
  42. // controls for player (true/false) ,,add function to read keyboard/joypad/touchscreen
  43. bool LEFT;
  44. bool RIGHT;
  45. bool UP;
  46. bool DOWN;
  47. bool FIRE1;
  48. bool FIRE2;
  49. // currentframe hold the current position of the cells (typewriter style)
  50. int currentFrame;
  51. int framesSpeed = 8; // Number of spritesheet frames shown by second
  52. Rectangle frameRec = { 0.0f, 0.0f, (float)96, (float)96 };
  53. int frame_start = 0;
  54. int frame_end = 0;
  55. int frame_kickstart = 1;
  56. int frame_kickend = 3;
  57. int frame_hit1start = 16;
  58. int frame_hit1end = 18;
  59. int frame_ucutstart = 31;
  60. int frame_ucutend = 33;
  61. int frame_hit2start = 46;
  62. int frame_hit2end = 48;
  63. int frame_walkstart = 61;
  64. int frame_walkend = 62;
  65. int frame_damagestart = 76;
  66. int frame_damageend = 77;
  67. int frame_flyingstart = 92;
  68. int frame_flyingend = 93;
  69. int frame_idlestart = 1;
  70. int frame_idleend = 1;
  71. // this sets the frame to start and sets start and end position(loop)
  72. void setanimation(int anim);
  73. void drawplayers();
  74. void updateplayer(int player);
  75. void setplayeranimation(int player, int anim);
  76. void playercontrols(int player);
  77. Texture2D scarfy;
  78. Texture2D backg;
  79. int main(void)
  80. {
  81. // Initialization
  82. //--------------------------------------------------------------------------------------
  83. const int screenWidth = 1400;
  84. const int screenHeight = 768;
  85. InitWindow(screenWidth, screenHeight, "raylib [texture] example - texture rectangle");
  86. // NOTE: Textures MUST be loaded after Window initialization (OpenGL context is required)
  87. //Texture2D scarfy = LoadTexture("resources/mrskelly.png"); // Texture loading
  88. //Texture2D backg = LoadTexture("resources/onedragon.png");
  89. scarfy = LoadTexture("resources/mrskelly.png"); // Texture loading
  90. backg = LoadTexture("resources/onedragon.png");
  91. Vector2 position = { 350.0f, 480.0f };
  92. //Rectangle frameRec = { 0.0f, 0.0f, (float)96, (float)96 };
  93. //int currentFrame = frame_kickstart;
  94. int framesCounter = 0;
  95. SetTargetFPS(60); // Set our game to run at 60 frames-per-second
  96. //--------------------------------------------------------------------------------------
  97. //setanimation(animKick);
  98. //setanimation(animFlying);
  99. p[0].facing=1;
  100. p[0].position.y = 370;
  101. p[0].position.x = 320;
  102. setplayeranimation(0,animIdle);
  103. //other sprites -
  104. int mod=0;
  105. // Main game loop
  106. while (!WindowShouldClose()) // Detect window close button or ESC key
  107. {
  108. playercontrols(0);
  109. updateplayer(0);
  110. /*
  111. // Update
  112. //----------------------------------------------------------------------------------
  113. framesCounter++;
  114. // Switch between characters
  115. if(GetRandomValue(0,100)==1){
  116. setanimation(GetRandomValue(1,7));
  117. switch(GetRandomValue(0,2)){
  118. case 0:
  119. mod=0;
  120. break;
  121. case 1:
  122. mod=5;
  123. break;
  124. case 2:
  125. mod = 9;
  126. break;
  127. }
  128. }
  129. if (framesCounter >= (60/framesSpeed))
  130. {
  131. framesCounter = 0;
  132. currentFrame++;
  133. if (currentFrame > frame_end) currentFrame = frame_start;
  134. int ypos = currentFrame/15;
  135. frameRec.y = (float)(currentFrame/15)*(float)96;
  136. frameRec.x = (float)((currentFrame+mod)-ypos*15)*(float)96;
  137. }
  138. // temp controls
  139. if (IsKeyDown(KEY_RIGHT)) position.x+=2;
  140. else if (IsKeyDown(KEY_LEFT)) position.x-=2;
  141. if (IsKeyDown(KEY_DOWN)) position.y+=2;
  142. else if (IsKeyDown(KEY_UP)) position.y-=2;
  143. */
  144. //----------------------------------------------------------------------------------
  145. // Draw
  146. //----------------------------------------------------------------------------------
  147. BeginDrawing();
  148. ClearBackground(RAYWHITE);
  149. DrawTexture(backg, 0, 0, WHITE);
  150. DrawTexture(scarfy, 15, 40, WHITE);
  151. drawplayers();
  152. /*
  153. DrawRectangleLines(15, 40, scarfy.width, scarfy.height, LIME);
  154. DrawRectangleLines(15 + (int)frameRec.x, 40 + (int)frameRec.y, (int)frameRec.width, (int)frameRec.height, RED);
  155. DrawText("FRAME SPEED: ", 165, 210, 10, DARKGRAY);
  156. DrawText(TextFormat("%02i FPS", framesSpeed), 575, 210, 10, DARKGRAY);
  157. DrawText("PRESS RIGHT/LEFT KEYS to CHANGE SPEED!", 290, 240, 10, DARKGRAY);
  158. for (int i = 0; i < MAX_FRAME_SPEED; i++)
  159. {
  160. if (i < framesSpeed) DrawRectangle(250 + 21*i, 205, 20, 20, RED);
  161. DrawRectangleLines(250 + 21*i, 205, 20, 20, MAROON);
  162. }
  163. //DrawTextureRec(scarfy, frameRec, position, WHITE); // Draw part of the texture
  164. DrawTextureRec(scarfy, frameRec, (Vector2){position.x+96,position.y}, WHITE); // Draw part of the texture
  165. DrawTexturePro(scarfy, (Rectangle){frameRec.x,frameRec.y,-96,96},// the -96 (-)means mirror on x axis
  166. (Rectangle){position.x,position.y,96,96},
  167. (Vector2){0,0},0,WHITE);
  168. DrawText("(c) Scarfy sprite by Eiden Marsal", screenWidth - 200, screenHeight - 20, 10, GRAY);
  169. */
  170. DrawRectangle(0,2,screenWidth,23,WHITE);
  171. DrawText("Cursor LEFT/RIGHT/UP/DOWN Z(FIRE1)/X(FIRE2)", 0, 0, 30, BLACK);
  172. EndDrawing();
  173. //----------------------------------------------------------------------------------
  174. }
  175. // De-Initialization
  176. //--------------------------------------------------------------------------------------
  177. UnloadTexture(scarfy); // Texture unloading
  178. CloseWindow(); // Close window and OpenGL context
  179. //--------------------------------------------------------------------------------------
  180. return 0;
  181. }
  182. void setanimation(int anim){
  183. switch(anim){
  184. case animKick:
  185. frame_start = frame_kickstart;
  186. frame_end = frame_kickend;
  187. break;
  188. case animHit1:
  189. frame_start = frame_hit1start;
  190. frame_end = frame_hit1end;
  191. break;
  192. case animUcut:
  193. frame_start = frame_ucutstart;
  194. frame_end = frame_ucutend;
  195. break;
  196. case animHit2:
  197. frame_start = frame_hit2start;
  198. frame_end = frame_hit2end;
  199. break;
  200. case animWalk:
  201. frame_start = frame_walkstart;
  202. frame_end = frame_walkend;
  203. break;
  204. case animDamage:
  205. frame_start = frame_damagestart;
  206. frame_end = frame_damageend;
  207. break;
  208. case animFlying:
  209. frame_start = frame_flyingstart;
  210. frame_end = frame_flyingend;
  211. break;
  212. }
  213. currentFrame = frame_start;
  214. }
  215. void drawplayers(){
  216. if(p[0].facing==1){
  217. DrawTextureRec(scarfy, frameRec, (Vector2){p[0].position.x,p[0].position.y}, WHITE); // Draw part of the texture
  218. }else{
  219. DrawTexturePro(scarfy, (Rectangle){frameRec.x,frameRec.y,-96,96},// the -96 (-)means mirror on x axis
  220. (Rectangle){p[0].position.x,p[0].position.y,96,96},
  221. (Vector2){0,0},0,WHITE);
  222. }
  223. }
  224. void setplayeranimation(int player, int anim){
  225. p[player].lastAnim = anim;
  226. switch(anim){
  227. case animIdle:
  228. p[player].frame_start = frame_idlestart;
  229. p[player].frame_end = frame_idleend;
  230. p[player].currentFrame = p[player].frame_start;
  231. break;
  232. case animKick:
  233. p[player].frame_start = frame_kickstart;
  234. p[player].frame_end = frame_kickend;
  235. p[player].currentFrame = p[player].frame_start;
  236. break;
  237. case animHit1:
  238. p[player].frame_start = frame_hit1start;
  239. p[player].frame_end = frame_hit1end;
  240. p[player].currentFrame = p[player].frame_start;
  241. break;
  242. case animUcut:
  243. p[player].frame_start = frame_ucutstart;
  244. p[player].frame_end = frame_ucutend;
  245. p[player].currentFrame = p[player].frame_start;
  246. break;
  247. case animHit2:
  248. p[player].frame_start = frame_hit2start;
  249. p[player].frame_end = frame_hit2end;
  250. p[player].currentFrame = p[player].frame_start;
  251. break;
  252. case animWalk:
  253. if(p[0].currentAnim!=animWalk){
  254. p[player].frame_start = frame_walkstart;
  255. p[player].frame_end = frame_walkend;
  256. p[player].currentFrame = p[player].frame_start;
  257. }
  258. break;
  259. case animDamage:
  260. p[player].frame_start = frame_damagestart;
  261. p[player].frame_end = frame_damageend;
  262. p[player].currentFrame = p[player].frame_start;
  263. break;
  264. case animFlying:
  265. p[player].frame_start = frame_flyingstart;
  266. p[player].frame_end = frame_flyingend;
  267. p[player].currentFrame = p[player].frame_start;
  268. break;
  269. }
  270. p[player].currentAnim = anim;
  271. }
  272. void updateplayer(int player){
  273. // animation
  274. p[player].lastFiretime++;
  275. p[player].keynothingtime++;
  276. p[player].framesCounter++;
  277. if (p[0].framesCounter >= (60/framesSpeed))
  278. {
  279. p[0].framesCounter = 0;
  280. p[0].currentFrame++;
  281. if (p[0].currentFrame > p[0].frame_end) p[0].currentFrame = p[0].frame_start;
  282. int ypos = p[0].currentFrame/15;
  283. frameRec.y = (float)(p[0].currentFrame/15)*(float)96;
  284. frameRec.x = (float)((p[0].currentFrame)-ypos*15)*(float)96;
  285. }
  286. // player movement
  287. if(p[player].currentAnim == animWalk && p[player].keynothingtime>1){
  288. setplayeranimation(player,animIdle);
  289. }
  290. if(p[player].currentAnim == animHit1 && p[player].keynothingtime>15){
  291. setplayeranimation(player,animIdle);
  292. }
  293. if(p[player].currentAnim == animHit2 && p[player].keynothingtime>15){
  294. setplayeranimation(player,animIdle);
  295. }
  296. if(p[player].currentAnim == animKick && p[player].keynothingtime>15){
  297. setplayeranimation(player,animIdle);
  298. }
  299. if(LEFT==false && RIGHT==false && UP==false && DOWN==false && FIRE1){
  300. if(p[player].lastFireAnim==animHit2){
  301. setplayeranimation(player,animHit1);
  302. p[player].lastFireAnim=animHit1;
  303. }else{
  304. setplayeranimation(player,animHit2);
  305. p[player].lastFireAnim=animHit2;
  306. }
  307. FIRE1=false;
  308. }
  309. if(LEFT==false && RIGHT==false && UP==false && DOWN==false && FIRE2){
  310. setplayeranimation(player,animKick);
  311. FIRE2=false;
  312. }
  313. if (RIGHT){
  314. p[player].lastFiretime=50;
  315. p[0].facing = 1;
  316. p[0].position.x+=2;
  317. RIGHT=false;
  318. setplayeranimation(player,animWalk);
  319. }
  320. else if (LEFT){
  321. p[player].lastFiretime=50;
  322. p[0].facing=-1;
  323. p[0].position.x-=2;
  324. LEFT=false;
  325. setplayeranimation(player,animWalk);
  326. }
  327. if (DOWN){
  328. p[player].lastFiretime=50;
  329. p[0].position.y+=2;
  330. DOWN=false;
  331. setplayeranimation(player,animWalk);
  332. }
  333. else if (UP){
  334. p[player].lastFiretime=50;
  335. p[0].position.y-=2;
  336. UP=false;
  337. setplayeranimation(player,animWalk);
  338. }
  339. }
  340. void playercontrols(int player){
  341. if (p[player].lastFiretime>30 && IsKeyDown(KEY_Z) && FIRE1==false && FIRE2==false){
  342. FIRE1 = true;
  343. p[player].lastFiretime=0;
  344. p[player].keynothingtime = 0;
  345. }
  346. if (p[player].lastFiretime>30 && IsKeyDown(KEY_X) && FIRE1==false && FIRE2==false){
  347. FIRE2 = true;
  348. p[player].lastFiretime=0;
  349. p[player].keynothingtime = 0;
  350. }
  351. if (IsKeyDown(KEY_RIGHT)){
  352. RIGHT = true;
  353. LEFT = false;
  354. p[player].keynothingtime = 0;
  355. }
  356. else if (IsKeyDown(KEY_LEFT)){
  357. LEFT = true;
  358. RIGHT = false;
  359. p[player].keynothingtime = 0;
  360. }
  361. if (IsKeyDown(KEY_DOWN)){
  362. DOWN = true;
  363. UP = false;
  364. p[player].keynothingtime = 0;
  365. }
  366. else if (IsKeyDown(KEY_UP)){
  367. UP = true;
  368. DOWN = false;
  369. p[player].keynothingtime = 0;
  370. }
  371. }