diff options
author | Fabio Maciel <6810827+fabiomaciel@users.noreply.github.com> | 2022-12-07 17:49:43 -0300 |
---|---|---|
committer | Fabio Maciel <6810827+fabiomaciel@users.noreply.github.com> | 2022-12-07 17:49:43 -0300 |
commit | 3b62cccc277e1e2bc465528a7b9a06e8ee09629f (patch) | |
tree | a97ef67c6b88923c459ff981e0fc45262592422b /src/main.c | |
parent | d9e4bcd542f3efe97e6b8951ee47f10c223a6bf3 (diff) | |
parent | 394ffe17766082c6895208f3fc5710a53cb4f01f (diff) |
Merge remote-tracking branch 'johnny/master'
Diffstat (limited to 'src/main.c')
-rw-r--r-- | src/main.c | 103 |
1 files changed, 79 insertions, 24 deletions
@@ -1,64 +1,119 @@ +/* +* Copyright (c) 2021, Johnny Richard +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* 2. Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following disclaimer in the documentation +* and/or other materials provided with the distribution. +* +* 3. Neither the name of the copyright holder nor the names of its +* contributors may be used to endorse or promote products derived from +* this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + #include <stdio.h> #include <stdlib.h> #include <stdbool.h> +#include <math.h> #include <SDL.h> #include "controller.h" +#include "player.h" const int SCREEN_WIDTH = 640; const int SCREEN_HEIGHT = 480; -int +int main (int argc, char *args[]) { - SDL_Window* window = NULL; - SDL_Surface* screenSurface = NULL; if (SDL_Init(SDL_INIT_VIDEO) < 0) { - fprintf(stderr, "SDL could not initialize! SDL_Error: %s\n", SDL_GetError()); + fprintf( + stderr, + "SDL could not be initialized! SDL_Error: %s\n", + SDL_GetError() + ); return EXIT_FAILURE; } - window = SDL_CreateWindow( - "SDL Tutorial", - SDL_WINDOWPOS_UNDEFINED, - SDL_WINDOWPOS_UNDEFINED, - SCREEN_WIDTH, SCREEN_HEIGHT, - SDL_WINDOW_SHOWN + SDL_Window* window = SDL_CreateWindow( + "Blast Attack", + SDL_WINDOWPOS_UNDEFINED, + SDL_WINDOWPOS_UNDEFINED, + SCREEN_WIDTH, SCREEN_HEIGHT, + SDL_WINDOW_RESIZABLE ); - if (window == NULL) { fprintf(stderr, "Window could not be created! SDL_Error: %s\n", SDL_GetError()); return EXIT_FAILURE; } - - SDL_Rect rect = { .x = 0, .y = 0, .w = 20, .h = 20 }; + + SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); + if (renderer == NULL) { + fprintf(stderr, "Could not create renderer: %s\n", SDL_GetError()); + return EXIT_FAILURE; + } + + if (SDL_RenderSetLogicalSize(renderer, SCREEN_WIDTH, SCREEN_HEIGHT) < 0) { + fprintf(stderr, "Could not set logical size: %s\n", SDL_GetError()); + return EXIT_FAILURE; + } + + SDL_Rect bg_rect = { .x = 0, .y = 0, .w = SCREEN_WIDTH, .h = SCREEN_HEIGHT }; bool quit = false; - controller_t controller = {0}; + controller_t ctrl = {0}; + + player_t player; + player_init(&player); while (!quit) { - screenSurface = SDL_GetWindowSurface(window); - SDL_FillRect(screenSurface, NULL, SDL_MapRGB(screenSurface->format, 0xFF, 0xFF, 0xFF)); + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 1); + SDL_RenderClear(renderer); + + uint64_t start = SDL_GetPerformanceCounter(); + + SDL_SetRenderDrawColor(renderer, 0XCC, 0XCC, 0XCC, 1); + SDL_RenderFillRect(renderer, &bg_rect); SDL_Event event; - while (SDL_PollEvent(&event) != 0) { + while (SDL_PollEvent(&event) != 0) { if (event.type == SDL_QUIT) { quit = true; } - controller_update(&controller, &event); + controller_update(&ctrl, &event); } - if (controller.up) rect.y -= 1; - if (controller.down) rect.y += 1; - if (controller.left) rect.x -= 1; - if (controller.right) rect.x += 1; + player_update(&player, &ctrl, SCREEN_WIDTH, SCREEN_HEIGHT); + player_draw(&player, renderer); + + SDL_RenderPresent(renderer); + + uint64_t end = SDL_GetPerformanceCounter(); - SDL_FillRect(screenSurface, &rect, SDL_MapRGB(screenSurface->format, 0xFF, 0x0, 0x0)); - SDL_UpdateWindowSurface(window); + float elapsedMS = (end - start) / (float)SDL_GetPerformanceFrequency() * 1000.0f; + SDL_Delay(floor(16.666f - elapsedMS)); } + SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); return EXIT_SUCCESS; |