Files
Sokoban/display.c

173 lines
4.9 KiB
C

#include "display.h"
#include "function.h"
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <SDL2/SDL_mutex.h>
#include <SDL2/SDL_rect.h>
#include <SDL2/SDL_render.h>
#include <SDL2/SDL_surface.h>
#include <SDL2/SDL_ttf.h>
#include <stdio.h>
#include <stdlib.h>
void screenDisplay (char **tab, int size)
{
// puts("0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 ");
char element[7] = { ' ', '#', 'S', '.', '*', '@', '+' };
for (int i = 0; i < size; ++i)
{
for (int j = 0; j < size; ++j)
{
printf ("%c ", element[(int)tab[i][j]]);
}
puts ("");
}
}
void screenDisplayGameSDL (char **tab, dis *display_user)
{
unsigned int display_game
= display_user->size_window - display_user->size_menu;
int size = display_game / display_user->size_box;
unsigned int marge = display_user->size_menu / 2;
unsigned int i, j;
for (i = 0; i < display_user->size_box; ++i)
{
for (j = 0; j < display_user->size_box; ++j)
{
SDL_Surface *img;
SDL_Texture *texture;
vect pos = { i * size + marge, j * size };
switch (tab[j][i])
{
case EMPTY:
img = IMG_Load ("empty.png");
break;
case WALL:
img = IMG_Load ("wall.png");
break;
case PLAYER:
img = IMG_Load ("player.png");
break;
case TARGET:
img = IMG_Load ("target.png");
break;
case BOX:
img = IMG_Load ("box.png");
break;
case BOX_ON_TARGET:
img = IMG_Load ("box_on_target.png");
break;
case PLAYER_ON_TARGET:
img = IMG_Load ("player_on_target.png");
break;
}
texture
= SDL_CreateTextureFromSurface (display_user->renderer, img);
displayImage (display_user->renderer, texture, pos, size);
SDL_FreeSurface (img);
SDL_DestroyTexture (texture);
}
}
SDL_RenderPresent (display_user->renderer);
}
int getMaxSize (dis display_user)
{
SDL_Init (SDL_INIT_VIDEO); // init if error
SDL_DisplayMode display;
SDL_GetCurrentDisplayMode (0, &display); // get dim display user
int result = 0;
if (display.w <= display.h)
{
result = display.w;
}
else
{
result = display.h;
}
SDL_Quit ();
int minus_mod = (result - 50) % display_user.size_box;
// printf("DIS :%d, size : %d ,mod : %d\n",result, size_box,minus_mod);
return (result - 50 - minus_mod); // margin
}
void initSDL (dis *display_user)
{
SDL_Init (SDL_INIT_VIDEO);
TTF_Init ();
display_user->window
= SDL_CreateWindow ("Sokoman", SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED, display_user->size_window,
display_user->size_window, SDL_WINDOW_SHOWN);
if (!display_user->window)
{
SDL_Quit ();
perror ("Window null");
exit (-1);
}
display_user->renderer
= SDL_CreateRenderer (display_user->window, -1, SDL_RENDERER_SOFTWARE);
if (!display_user->renderer)
{
SDL_Quit ();
perror ("Renderer null");
exit (-1);
}
}
void displayImage (SDL_Renderer *renderer, SDL_Texture *texture, vect pos,
int size)
{
SDL_Rect rect = { pos.x, pos.y, size, size };
SDL_RenderCopy (renderer, texture, NULL, &rect);
}
void displayTextSDL (dis *display_user, char *text, vect coor, vect size,
int font_size)
{
TTF_Font *Sans = TTF_OpenFont ("Roboto-Regular.ttf", font_size);
SDL_Color white = { 255, 255, 255, 255 };
int text_width, text_height;
SDL_Rect background;
SDL_Surface *surface_text = TTF_RenderText_Solid (Sans, text, white);
TTF_SizeText (Sans, text, &text_height, &text_width);
SDL_Rect message_rect;
message_rect.x = coor.x;
message_rect.y = coor.y;
message_rect.w = text_height;
message_rect.h = text_width;
background.x = coor.x;
background.y = coor.y;
background.w = text_height;
background.h = text_width;
if (message_rect.w > size.y)
{
message_rect.w = size.y;
background.w = size.y;
}
if (message_rect.h > size.x)
{
message_rect.h = size.x;
background.h = size.x;
}
SDL_Texture *message
= SDL_CreateTextureFromSurface (display_user->renderer, surface_text);
SDL_SetRenderDrawColor(display_user->renderer, 0, 0, 0, 255);
SDL_RenderFillRect(display_user->renderer, &background);
SDL_RenderCopy (display_user->renderer, message, NULL, &message_rect);
SDL_RenderPresent (display_user->renderer);
SDL_FreeSurface (surface_text);
SDL_DestroyTexture (message);
TTF_CloseFont(Sans);
}