feat: initial version
This commit is contained in:
parent
0a67fb21d1
commit
ee790e99d6
12 changed files with 798 additions and 0 deletions
122
srcs/graphics.c
Normal file
122
srcs/graphics.c
Normal file
|
|
@ -0,0 +1,122 @@
|
|||
#include "graphics.h"
|
||||
#include <SDL2/SDL.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include "chip8.h"
|
||||
|
||||
int graphics_init(t_display *display)
|
||||
{
|
||||
if (SDL_Init(SDL_INIT_VIDEO) < 0)
|
||||
{
|
||||
fprintf(stderr, "SDL2 could not initiallize! e=%s\n", SDL_GetError());
|
||||
return (1);
|
||||
}
|
||||
|
||||
display->window = SDL_CreateWindow("c8",
|
||||
SDL_WINDOWPOS_UNDEFINED,
|
||||
SDL_WINDOWPOS_UNDEFINED,
|
||||
SCREEN_WIDTH * SCALE,
|
||||
SCREEN_HEIGHT * SCALE,
|
||||
SDL_WINDOW_SHOWN);
|
||||
if (!display->window)
|
||||
{
|
||||
fprintf(stderr, "Window could not be created! e=%s\n", SDL_GetError());
|
||||
return (1);
|
||||
}
|
||||
|
||||
display->renderer = SDL_CreateRenderer(display->window, -1, SDL_RENDERER_ACCELERATED);
|
||||
if (!display->renderer)
|
||||
{
|
||||
fprintf(stderr, "Renderer could not be created! e=%s\n", SDL_GetError());
|
||||
return (1);
|
||||
}
|
||||
|
||||
display->texture = SDL_CreateTexture(display->renderer, SDL_PIXELFORMAT_ARGB8888,
|
||||
SDL_TEXTUREACCESS_STREAMING,
|
||||
SCREEN_WIDTH,
|
||||
SCREEN_HEIGHT);
|
||||
if (!display->texture)
|
||||
{
|
||||
fprintf(stderr, "Texture could not be created! e=%s\n", SDL_GetError());
|
||||
return (1);
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
void graphics_render(t_chip8 *emu)
|
||||
{
|
||||
for (int i = 0; i < SCREEN_WIDTH * SCREEN_HEIGHT; i++)
|
||||
{
|
||||
uint8_t pixel = emu->memory.screen[i];
|
||||
emu->display.pixels[i] = pixel ? 0xFFFFFFFF : 0xFF000000;
|
||||
}
|
||||
|
||||
SDL_UpdateTexture(emu->display.texture, NULL, emu->display.pixels, SCREEN_WIDTH * sizeof(uint32_t));
|
||||
|
||||
SDL_RenderClear(emu->display.renderer);
|
||||
SDL_RenderCopy(emu->display.renderer, emu->display.texture, NULL, NULL);
|
||||
SDL_RenderPresent(emu->display.renderer);
|
||||
}
|
||||
|
||||
void graphics_cleanup(t_display *display)
|
||||
{
|
||||
SDL_DestroyTexture(display->texture);
|
||||
SDL_DestroyRenderer(display->renderer);
|
||||
SDL_DestroyWindow(display->window);
|
||||
SDL_Quit();
|
||||
}
|
||||
void graphics_draw_sprite(t_chip8 *emu, uint8_t x, uint8_t y, uint8_t n)
|
||||
{
|
||||
uint8_t pixel;
|
||||
uint16_t sprite_address = emu->i;
|
||||
|
||||
uint8_t collision = 0;
|
||||
|
||||
for (int row = 0; row < n; row++)
|
||||
{
|
||||
pixel = emu->memory.memory[sprite_address + row];
|
||||
|
||||
for (int col = 0; col < 8; col++)
|
||||
{
|
||||
if ((pixel & (0x80 >> col)) != 0)
|
||||
{
|
||||
uint16_t screen_x = (x + col) % SCREEN_WIDTH;
|
||||
uint16_t screen_y = (y + row) % SCREEN_HEIGHT;
|
||||
|
||||
if (emu->memory.screen[screen_y * SCREEN_WIDTH + screen_x] == 1)
|
||||
{
|
||||
collision = 1;
|
||||
}
|
||||
|
||||
emu->memory.screen[screen_y * SCREEN_WIDTH + screen_x] ^= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
emu->v[0xF] = collision;
|
||||
}
|
||||
|
||||
int graphics_display_ready()
|
||||
{
|
||||
SDL_Event event;
|
||||
|
||||
while (1)
|
||||
{
|
||||
while (SDL_PollEvent(&event) != 0)
|
||||
{
|
||||
if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_SHOWN)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Check for window close event
|
||||
if (event.type == SDL_QUIT)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
SDL_Delay(10);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue