Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Copyright 2019 YorKnEz
- */
- #include <SDL2/SDL.h>
- #include <stdio.h>
- #include <cstdlib>
- #include <time.h>
- #define TITLE "Dino Game"
- typedef unsigned int uint;
- uint16_t window_height = 480, window_width = 1024;
- uint fps = 60, frames = 0, score;
- uint minframetime = 1000 / fps;
- bool quit = false, nextob = true;
- SDL_Keycode keycode = SDLK_d;
- typedef struct Object {
- int x;
- int y;
- int width;
- int height;
- int type;
- int fly;
- char hitbox[22][27];
- } Object;
- Object dinosaur = { 100, 308, 18, 22, 0 }, obstacle1, obstacle2;
- char dinosaur_walk0_hitbox[22][27] = {
- " 111111 ",
- " 11 11111",
- " 11111111",
- " 11111111",
- " 11111111",
- " 11111 ",
- " 11111 ",
- " 11111111",
- "1 11111 ",
- "1 111111 ",
- "11 1111111111 ",
- "111 111111111 1 ",
- "11111111111111 ",
- "11111111111111 ",
- " 1111111111111 ",
- " 11111111111 ",
- " 11111111 ",
- " 1111111 ",
- " 111 11 ",
- " 11 1 ",
- " 1 1 ",
- " 11 11 "
- };
- char dinosaur_walk1_hitbox[22][27] = {
- " 111111 ",
- " 11 11111",
- " 11111111",
- " 11111111",
- " 11111111",
- " 11111 ",
- " 11111 ",
- " 11111111",
- "1 11111 ",
- "1 111111 ",
- "11 1111111111 ",
- "111 111111111 1 ",
- "11111111111111 ",
- "11111111111111 ",
- " 1111111111111 ",
- " 11111111111 ",
- " 11111111 ",
- " 1111111 ",
- " 1 11 ",
- " 11 1 ",
- " 1 ",
- " 11 "
- };
- char dinosaur_walk2_hitbox[22][27] = {
- " 111111 ",
- " 11 11111",
- " 11111111",
- " 11111111",
- " 11111111",
- " 11111 ",
- " 11111 ",
- " 11111111",
- "1 11111 ",
- "1 111111 ",
- "11 1111111111 ",
- "111 111111111 1 ",
- "11111111111111 ",
- "11111111111111 ",
- " 1111111111111 ",
- " 11111111111 ",
- " 11111111 ",
- " 1111111 ",
- " 111 1 ",
- " 11 11 ",
- " 1 ",
- " 11 "
- };
- char dinosaur_walk3_hitbox[22][27] = {
- "1 1111111 ",
- "111 1111111 111111111",
- "1111111111111111111 111111",
- " 1111111111111111111111111",
- " 111111111111111111111111",
- " 11111111111111111111111",
- " 111111111111111111 ",
- " 1111111111 1111111 ",
- " 111111 1 ",
- " 111 1 11 ",
- " 11 11 ",
- " 1 ",
- " 11 "
- };
- char dinosaur_walk4_hitbox[22][27] = {
- "1 1111111 ",
- "111 1111111 111111111",
- "1111111111111111111 111111",
- " 1111111111111111111111111",
- " 111111111111111111111111",
- " 11111111111111111111111",
- " 111111111111111111 ",
- " 1111111111 1111111 ",
- " 111111 1 ",
- " 1 111 11 ",
- " 11 11 ",
- " 1 ",
- " 11 "
- };
- int walk = 1;
- void update_dino_hitbox() {
- if (walk == 1) {
- for (int i = 0; i < dinosaur.height; i++) {
- for (int j = 0; j < dinosaur.width; j++) {
- dinosaur.hitbox[i][j] = dinosaur_walk2_hitbox[i][j];
- }
- }
- walk = 2;
- } else if (walk == 2) {
- for (int i = 0; i < dinosaur.height; i++) {
- for (int j = 0; j < dinosaur.width; j++) {
- dinosaur.hitbox[i][j] = dinosaur_walk1_hitbox[i][j];
- }
- }
- walk = 1;
- } else if (walk == 3) {
- for (int i = 0; i < dinosaur.height; i++) {
- for (int j = 0; j < dinosaur.width; j++) {
- dinosaur.hitbox[i][j] = dinosaur_walk0_hitbox[i][j];
- }
- }
- walk = 2;
- } else if (walk == 4) {
- for (int i = 0; i < dinosaur.height; i++) {
- for (int j = 0; j < dinosaur.width; j++) {
- dinosaur.hitbox[i][j] = dinosaur_walk4_hitbox[i][j];
- }
- }
- walk = 5;
- } else if (walk == 5) {
- for (int i = 0; i < dinosaur.height; i++) {
- for (int j = 0; j < dinosaur.width; j++) {
- dinosaur.hitbox[i][j] = dinosaur_walk3_hitbox[i][j];
- }
- }
- walk = 4;
- }
- }
- char obstacle1_hitbox[22][27] = {
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " 1111 ",
- " 1111111 ",
- " 111111111 ",
- " 11111111111 ",
- " 111111111111 ",
- " 1111111111111 ",
- " 111111111111111 ",
- " 111111111111111 ",
- " 111111111111111 ",
- " 1111111111111111 ",
- " 11111111111111111",
- "111111111111111111",
- "111111111111111111",
- };
- char obstacle2_hitbox[22][27] = {
- " 111 ",
- " 11111 ",
- " 11111 ",
- " 11111 ",
- " 11111 1 ",
- " 11111 111 ",
- " 1 11111 111 ",
- " 111 11111 111 ",
- " 111 111111111 ",
- " 111 111111111 ",
- " 111111111111 ",
- " 111111111 ",
- " 11111111 ",
- " 11111 ",
- " 11111 ",
- " 11111 ",
- " 11111 ",
- " 11111 ",
- " 11111 ",
- " 1 111111 1 ",
- " 1 ",
- " 1 1 "
- };
- char obstacle3_hitbox[22][27] = {
- " 11 ",
- " 1111 11 ",
- " 11111 111 ",
- " 11111 1111 ",
- " 111 11111 1111 ",
- "11111111111111111111111111",
- " 1111111111111 ",
- " 1111111 ",
- " ",
- " ",
- " "
- };
- char obstacle3_hitbox2[22][27] = {
- " ",
- " ",
- " ",
- " ",
- " 111 11111111 ",
- "11111111111111111111111111",
- " 1111111111111 ",
- " 111111111 ",
- " 11111 1111 ",
- " 11111 111 ",
- " 111 "
- };
- char zero[5][4] = {
- "111",
- "1 1",
- "1 1",
- "1 1",
- "111"
- },
- one[5][4] = {
- "11 ",
- " 1 ",
- " 1 ",
- " 1 ",
- "111"
- },
- two[5][4] = {
- "111",
- " 1",
- "111",
- "1 ",
- "111"
- },
- three[5][4] = {
- "111",
- " 1",
- "111",
- " 1",
- "111"
- },
- four[5][4] = {
- " 1",
- " 11",
- "1 1",
- "111",
- " 1"
- },
- five[5][4] = {
- "111",
- "1 ",
- "111",
- " 1",
- "111"
- },
- six[5][4] = {
- "111",
- "1 ",
- "111",
- "1 1",
- "111"
- },
- seven[5][4] = {
- "111",
- " 1",
- " 1 ",
- "1 ",
- "1 "
- },
- eight[5][4] = {
- "111",
- "1 1",
- "111",
- "1 1",
- "111"
- },
- nine[5][4] = {
- "111",
- "1 1",
- "111",
- " 1",
- "111"
- },
- digit1[5][4] = {
- "111",
- "1 1",
- "1 1",
- "1 1",
- "111"
- },
- digit2[5][4] = {
- "111",
- "1 1",
- "1 1",
- "1 1",
- "111"
- },
- digit3[5][4] = {
- "111",
- "1 1",
- "1 1",
- "1 1",
- "111"
- },
- digit4[5][4] = {
- "111",
- "1 1",
- "1 1",
- "1 1",
- "111"
- },
- digit5[5][4] = {
- "111",
- "1 1",
- "1 1",
- "1 1",
- "111"
- },
- digit6[5][4] = {
- "111",
- "1 1",
- "1 1",
- "1 1",
- "111"
- },
- digit[5][4] = {
- "111",
- "1 1",
- "1 1",
- "1 1",
- "111"
- };
- void digit_update (char digit[5][4], char new_digit[5][4]) {
- for (int i = 0; i < 5; i++) {
- for (int j = 0; j < 3; j++) {
- digit[i][j] = new_digit[i][j];
- }
- }
- }
- void update_digits () {
- int score_cpy = score;
- int digit_cnt = 0;
- /*digit_update(digit1, zero);
- digit_update(digit2, zero);
- digit_update(digit3, zero);
- digit_update(digit4, zero);
- digit_update(digit5, zero);
- digit_update(digit6, zero);*/
- while (score_cpy != 0) {
- for (int i = 0; i < 10; i++) {
- if (score_cpy % 10 == i) {
- if (i == 0) {
- digit_update(digit, zero);
- } else if (i == 1) {
- digit_update(digit, one);
- } else if (i == 2) {
- digit_update(digit, two);
- } else if (i == 3) {
- digit_update(digit, three);
- } else if (i == 4) {
- digit_update(digit, four);
- } else if (i == 5) {
- digit_update(digit, five);
- } else if (i == 6) {
- digit_update(digit, six);
- } else if (i == 7) {
- digit_update(digit, seven);
- } else if (i == 8) {
- digit_update(digit, eight);
- } else if (i == 9) {
- digit_update(digit, nine);
- }
- if (digit_cnt == 0) {
- digit_update(digit1, digit);
- } else if (digit_cnt == 1) {
- digit_update(digit2, digit);
- } else if (digit_cnt == 2) {
- digit_update(digit3, digit);
- } else if (digit_cnt == 3) {
- digit_update(digit4, digit);
- } else if (digit_cnt == 4) {
- digit_update(digit5, digit);
- } else if (digit_cnt == 5) {
- digit_update(digit6, digit);
- }
- }
- }
- digit_cnt++;
- score_cpy /= 10;
- }
- }
- int initial_y = 308;
- float obstacle_v = 10, initial_v = 65, velocity = 65, gravity = -20, dt = 0.16;
- bool jump = false, duck = false;
- void events(SDL_Window *window);
- void draw(SDL_Renderer *renderer);
- void update (float dt, int &y) {
- y -= velocity * dt;
- velocity += gravity * dt;
- if (initial_y == dinosaur.y) {
- jump = false;
- velocity = initial_v;
- }
- if (dinosaur.y > 308) {
- dinosaur.y = 308;
- velocity = initial_v;
- jump = false;
- }
- }
- void generate_obstacle (Object &obstacle) {
- obstacle.type = rand() % 99 + 1;
- if (obstacle.type % 3 == 0) {
- obstacle = { window_width + 1, 308, 18, 22, 1, 0 };
- for (int i = 0; i < obstacle.height; i++) {
- for (int j = 0; j < obstacle.width; j++) {
- obstacle.hitbox[i][j] = obstacle1_hitbox[i][j];
- }
- }
- } else if (obstacle.type % 2 == 0) {
- obstacle = { window_width + 1, 308, 18, 22, 2, 0 };
- for (int i = 0; i < obstacle.height; i++) {
- for (int j = 0; j < obstacle.width; j++) {
- obstacle.hitbox[i][j] = obstacle2_hitbox[i][j];
- }
- }
- } else if (obstacle.type % 3 != 0 && obstacle.type % 2 != 0) {
- int y = rand() % 3 + 1;
- if (y == 1) {
- obstacle = { window_width + 1, 248, 26, 11, 3, 1 };
- } else if (y == 2) {
- obstacle = { window_width + 1, 292, 26, 11, 3, 1 };
- } else if (y == 3) {
- obstacle = { window_width + 1, 352, 26, 11, 3, 1 };
- }
- for (int i = 0; i < obstacle.height; i++) {
- for (int j = 0; j < obstacle.width; j++) {
- obstacle.hitbox[i][j] = obstacle3_hitbox[i][j];
- }
- }
- }
- }
- void copy_obstacle (Object &obstacle1, Object &obstacle2) {
- obstacle1.height = obstacle2.height;
- obstacle1.width = obstacle2.width;
- obstacle1.x = obstacle2.x;
- obstacle1.y = obstacle2.y;
- obstacle1.type = obstacle2.type;
- obstacle1.fly = obstacle2.fly;
- for (int i = 0; i < obstacle1.height; i++) {
- for (int j = 0; j < obstacle1.width; j++) {
- obstacle1.hitbox[i][j] = obstacle2.hitbox[i][j];
- }
- }
- }
- void obstacle3_animation (Object &obstacle) {
- if (obstacle.fly) {
- for (int i = 0; i < obstacle.height; i++) {
- for (int j = 0; j < obstacle.width; j++) {
- obstacle.hitbox[i][j] = obstacle3_hitbox2[i][j];
- }
- }
- obstacle.fly = 0;
- } else if (!obstacle.fly) {
- for (int i = 0; i < obstacle.height; i++) {
- for (int j = 0; j < obstacle.width; j++) {
- obstacle.hitbox[i][j] = obstacle3_hitbox[i][j];
- }
- }
- obstacle.fly = 1;
- }
- }
- bool collision (Object object) {
- for (int i = 0; i < dinosaur.height; i++) {
- for (int j = 0; j < dinosaur.width; j++) {
- if (dinosaur.hitbox[i][j] == '1') {
- if ((dinosaur.x + (j * 4) >= object.x) && (dinosaur.x + (j*4) < object.x + (object.width * 4)) && (dinosaur.y + (i*4) >= object.y) && (dinosaur.y + (i*4) < object.y + (object.height * 4))) {
- for (int k = 0; k < object.height; k++) {
- for (int l = 0; l < object.width; l++) {
- if (object.hitbox[k][l] == '1') {
- if ((dinosaur.x + (j*4) >= object.x + (l*4) && dinosaur.x + (j*4) <= object.x + ((l+1)*4)-1) && (dinosaur.y + (i*4) >= object.y + (k*4) && dinosaur.y + (i*4) <= object.y + ((k+1)*4)-1)) {
- return true;
- }
- }
- }
- }
- }
- }
- }
- }
- /*if (object.x + (object.width*4) >= dinosaur.x && dinosaur.x + (dinosaur.width*4) >= object.x && object.y + (object.height*4) >= dinosaur.y && dinosaur.y + (dinosaur.height*4) >= object.y) {
- return true;
- }*/
- return false;
- }
- int main(int argv, char** args)
- {
- srand(time(NULL));
- SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS);
- SDL_Window *window =
- SDL_CreateWindow(
- TITLE,
- SDL_WINDOWPOS_CENTERED,
- SDL_WINDOWPOS_CENTERED,
- window_width,
- window_height,
- SDL_WINDOW_SHOWN);
- SDL_Renderer *renderer =
- SDL_CreateRenderer(
- window,
- -1,
- SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
- generate_obstacle(obstacle1);
- // INITIALIZE DINO HITBOX
- for (int i = 0; i < dinosaur.height; i++) {
- for (int j = 0; j < dinosaur.width; j++) {
- dinosaur.hitbox[i][j] = dinosaur_walk0_hitbox[i][j];
- }
- }
- while (!quit) {
- int start = SDL_GetTicks();
- frames++;
- printf("%d %f (o1: %d, o2: %d) %d\n", start, obstacle_v, obstacle1.x, obstacle2.x, frames);
- events(window);
- if (frames % 2 == 0) {
- score++;
- update_digits();
- }
- if (jump) {
- walk = 3;
- update_dino_hitbox();
- update(dt, dinosaur.y);
- }
- if (frames % 6 == 0) {
- if (duck) update_dino_hitbox();
- if (!jump && !duck) update_dino_hitbox();
- if (obstacle1.type == 3) obstacle3_animation(obstacle1);
- if (obstacle2.type == 3) obstacle3_animation(obstacle2);
- }
- if (collision(obstacle1) || collision(obstacle2)) quit = true;
- if (obstacle1.x + obstacle1.width * 4 <= window_width-(500 + rand() % 100) && nextob) {
- generate_obstacle(obstacle2);
- nextob = false;
- }
- if (obstacle1.x + obstacle1.width * 4 < 0) {
- copy_obstacle(obstacle1, obstacle2);
- nextob = true;
- if (obstacle2.x > window_width)
- generate_obstacle(obstacle2);
- }
- draw(renderer);
- SDL_RenderPresent(renderer);
- int time = SDL_GetTicks() - start;
- int sleepTime = minframetime - time;
- if (sleepTime > 0) {
- SDL_Delay(sleepTime);
- }
- if (frames % 300 == 0) {
- obstacle_v += 0.25;
- if (obstacle_v > 15) {
- obstacle_v = 15;
- }
- }
- }
- SDL_DestroyWindow(window);
- SDL_DestroyRenderer(renderer);
- SDL_Quit();
- return 0;
- }
- void events(SDL_Window *window) {
- SDL_Event event;
- while (SDL_PollEvent(&event) != 0) {
- if (event.type == SDL_QUIT) {
- quit = true;
- } else if (event.type == SDL_KEYDOWN) {
- SDL_Keycode new_keycode = event.key.keysym.sym;
- if (new_keycode == SDLK_SPACE && !duck) {
- jump = true;
- keycode = new_keycode;
- break;
- } else if (new_keycode == SDLK_s && !duck && !jump) {
- duck = true;
- dinosaur.width = 26;
- dinosaur.height = 13;
- dinosaur.y = 340;
- walk = 4;
- update_dino_hitbox();
- break;
- } else if (new_keycode == SDLK_s && duck) {
- duck = false;
- dinosaur.width = 18;
- dinosaur.height = 22;
- dinosaur.y = 308;
- walk = 2;
- update_dino_hitbox();
- break;
- }
- }
- }
- }
- void draw(SDL_Renderer *renderer) {
- SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
- SDL_RenderClear(renderer);
- SDL_Rect rect = { 0, 0, window_width, window_height};
- SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
- SDL_RenderFillRect(renderer, &rect);
- rect = { 0, window_height-100, window_width, 1};
- SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
- SDL_RenderFillRect(renderer, &rect);
- // <--- START DRAW DINOSAUR --->
- for (int i = 0; i < dinosaur.height; i++) {
- for (int j = 0; j < dinosaur.width; j++) {
- if (dinosaur.hitbox[i][j] == '1') {
- SDL_Rect rect = { dinosaur.x + j*4, dinosaur.y + i*4, 4, 4};
- SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
- SDL_RenderFillRect(renderer, &rect);
- }
- }
- }
- // <--- END DRAW DINOSAUR --->
- // <--- START DRAW OBSTACLES --->
- for (int i = 0; i < obstacle1.height; i++) {
- for (int j = 0; j < obstacle1.width; j++) {
- if (obstacle1.hitbox[i][j] == '1') {
- SDL_Rect rect = { obstacle1.x + j*4, obstacle1.y + i*4, 4, 4};
- SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
- SDL_RenderFillRect(renderer, &rect);
- }
- }
- }
- obstacle1.x -= obstacle_v;
- for (int i = 0; i < obstacle2.height; i++) {
- for (int j = 0; j < obstacle2.width; j++) {
- if (obstacle2.hitbox[i][j] == '1') {
- SDL_Rect rect = { obstacle2.x + j*4, obstacle2.y + i*4, 4, 4};
- SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
- SDL_RenderFillRect(renderer, &rect);
- }
- }
- }
- obstacle2.x -= obstacle_v;
- // <--- END DRAW OBSTACLES --->
- // <--- START DRAW SCORE --->
- for (int k = 0; k < 6; k++) {
- for (int i = 0; i < 5; i++) {
- for (int j = 0; j < 3; j++) {
- if (k == 0) {
- if (digit6[i][j] == '1') {
- SDL_Rect rect = { ((j+(k*3)) * 10), (i * 10), 10, 10 };
- SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
- SDL_RenderFillRect(renderer, &rect);
- }
- } else if (k == 1) {
- if (digit5[i][j] == '1') {
- SDL_Rect rect = { ((j+(k*3)+1) * 10), (i * 10), 10, 10 };
- SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
- SDL_RenderFillRect(renderer, &rect);
- }
- } else if (k == 2) {
- if (digit4[i][j] == '1') {
- SDL_Rect rect = { ((j+(k*3)+2) * 10), (i * 10), 10, 10 };
- SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
- SDL_RenderFillRect(renderer, &rect);
- }
- } else if (k == 3) {
- if (digit3[i][j] == '1') {
- SDL_Rect rect = { ((j+(k*3)+3) * 10), (i * 10), 10, 10 };
- SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
- SDL_RenderFillRect(renderer, &rect);
- }
- } else if (k == 4) {
- if (digit2[i][j] == '1') {
- SDL_Rect rect = { ((j+(k*3)+4) * 10), (i * 10), 10, 10 };
- SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
- SDL_RenderFillRect(renderer, &rect);
- }
- } else if (k == 5) {
- if (digit1[i][j] == '1') {
- SDL_Rect rect = { ((j+(k*3)+5) * 10), (i * 10), 10, 10 };
- SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
- SDL_RenderFillRect(renderer, &rect);
- }
- }
- }
- }
- }
- // <--- END DRAW SCORE --->
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement