1
This commit is contained in:
		
							parent
							
								
									545c2481f1
								
							
						
					
					
						commit
						4b4c76796d
					
				
							
								
								
									
										54
									
								
								a4/a3/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								a4/a3/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,54 @@ | ||||
| game | ||||
| 
 | ||||
| # Prerequisites | ||||
| *.d | ||||
| 
 | ||||
| # Object files | ||||
| *.o | ||||
| *.ko | ||||
| *.obj | ||||
| *.elf | ||||
| 
 | ||||
| # Linker output | ||||
| *.ilk | ||||
| *.map | ||||
| *.exp | ||||
| 
 | ||||
| # Precompiled Headers | ||||
| *.gch | ||||
| *.pch | ||||
| 
 | ||||
| # Libraries | ||||
| *.lib | ||||
| *.a | ||||
| *.la | ||||
| *.lo | ||||
| 
 | ||||
| # Shared objects (inc. Windows DLLs) | ||||
| *.dll | ||||
| *.so | ||||
| *.so.* | ||||
| *.dylib | ||||
| 
 | ||||
| # Executables | ||||
| *.exe | ||||
| *.out | ||||
| *.app | ||||
| *.i*86 | ||||
| *.x86_64 | ||||
| *.hex | ||||
| 
 | ||||
| # Debug files | ||||
| *.dSYM/ | ||||
| *.su | ||||
| *.idb | ||||
| *.pdb | ||||
| 
 | ||||
| # Kernel Module Compile Results | ||||
| *.mod* | ||||
| *.cmd | ||||
| .tmp_versions/ | ||||
| modules.order | ||||
| Module.symvers | ||||
| Mkfile.old | ||||
| dkms.conf | ||||
							
								
								
									
										29
									
								
								a4/a3/LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								a4/a3/LICENSE
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | ||||
| BSD 3-Clause License | ||||
| 
 | ||||
| Copyright (c) 2019, Daniel Hládek | ||||
| All rights reserved. | ||||
| 
 | ||||
| Redistribution and use in source and binary forms, with or without | ||||
| modification, are permitted provided that the following conditions are met: | ||||
| 
 | ||||
| * Redistributions of source code must retain the above copyright notice, this | ||||
|   list of conditions and the following disclaimer. | ||||
| 
 | ||||
| * 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. | ||||
| 
 | ||||
| * 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. | ||||
							
								
								
									
										14
									
								
								a4/a3/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								a4/a3/Makefile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | ||||
| CFLAGS=-std=c99 -Wall -g | ||||
| 
 | ||||
| all: game | ||||
| 
 | ||||
| %.o: %.c | ||||
| 	gcc $(CFLAGS) -c $< -o $@ | ||||
| 
 | ||||
| clean: | ||||
| 	rm *.o | ||||
| 	rm game | ||||
| 
 | ||||
| game: main.o game.o world.o | ||||
| 	gcc main.o game.o world.o -lcurses -lm -o game | ||||
| 
 | ||||
							
								
								
									
										78
									
								
								a4/a3/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								a4/a3/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,78 @@ | ||||
| # World Game Library | ||||
| 
 | ||||
| Learn asycnronous C programming by a game. | ||||
| 
 | ||||
| The library implements a game loop for a character-based ncurses game; | ||||
| 
 | ||||
| The library finds out the event types: | ||||
| 
 | ||||
| - start and end | ||||
| - mouse events | ||||
| - keyboard events | ||||
| - screen resize events | ||||
| 
 | ||||
| It can print colors and arbitrary characters on the screen.  | ||||
| Running is interrupted when character is drawn out of the screen. | ||||
| 
 | ||||
| ## Installation and Running | ||||
| 
 | ||||
| Make sure, that `ncurses` is installed. | ||||
| 
 | ||||
| Clone this repository. | ||||
| 
 | ||||
| Compile: | ||||
| 
 | ||||
| ```c | ||||
| make | ||||
| ``` | ||||
| 	 | ||||
| Run: | ||||
| 
 | ||||
| ```c | ||||
| ./game | ||||
| ``` | ||||
| 
 | ||||
| ## Make your own game | ||||
| 
 | ||||
| The game happens in a rectangular world of colorful characters.  | ||||
| Your goal as a programmer is to modify the world according to the pressed keys and the internal game state. | ||||
| The library implements the game loop and draws the world to screen. | ||||
| 
 | ||||
| Your game in file `game.c` consists of two functions: | ||||
| 
 | ||||
| - `void* init_game()` is called in the beginning. Here you can initialize the internal state of the game. | ||||
| The function should return  a pointer to an instance of the initial game state `game`. | ||||
| - `int game_event(struct event* event,void* game)` | ||||
| is called by the game loop in periodic interval or when a key was pressed. Non-zero return value or `Ctrl+C` key interrupts the game loop. | ||||
| 
 | ||||
| The world variable represents state of two-dimensional grid of characters on the screen. The screen matrix looks like this: | ||||
| 
 | ||||
| ``` | ||||
|    origin | ||||
|    [0,0]     width | ||||
|   +--------------------+ | ||||
| h |                    | | ||||
| e |                    | | ||||
| i |                    | | ||||
| g |                    | | ||||
| h |                    | | ||||
| t |                    | | ||||
|   +--------------------+ | ||||
| ``` | ||||
| 
 | ||||
| The world  has the following parameters: | ||||
| 
 | ||||
| - `int height`: y-dimension of the grid. | ||||
| - `int width`: x-dimension of the grid. | ||||
| - `int interval`: maximum time between steps in milliseconds. | ||||
| 
 | ||||
| ### The Event Function | ||||
| 
 | ||||
| The `int game_event(struct event* event,void* game)` | ||||
|  function should: | ||||
| 
 | ||||
| 1. Read the game state (from the `void* game`) pointer. | ||||
| 1. Examine the pressed key from event pointer. If the `key` variable is non-zero, a key was pressed. According to the pressed key, modify the game state `game`. | ||||
| 1. Draw the game state. In the beginning of the step function the screen is empty. | ||||
| 1. Returning non-zero value ends the game loop.  | ||||
| 
 | ||||
							
								
								
									
										108
									
								
								a4/a3/game.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								a4/a3/game.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,108 @@ | ||||
| #include <curses.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include "world.h" | ||||
| #include "game.h" | ||||
| 
 | ||||
| // Funkcia sa zavolá na začiatku hry
 | ||||
| void* init_game() { | ||||
|     // Vytvoríme stav hry
 | ||||
|     struct game* stav = calloc(1, sizeof(struct game)); | ||||
|      | ||||
|     // Nastavíme počiatočné pozície
 | ||||
|     stav->myska_x = 5; | ||||
|     stav->myska_y = 5; | ||||
|     stav->macka_smer_x = 0; | ||||
|     stav->macka_smer_y = 0; | ||||
|     stav->macka_x = 15; | ||||
|     stav->macka_y = 15; | ||||
|     stav->skore = 0; | ||||
|     stav->koniec_hry = 0; | ||||
|     strcpy(stav->sprava, "Chyt myšku! Používaj šípky."); | ||||
|      | ||||
|     return stav; | ||||
| } | ||||
| 
 | ||||
| // Hlavná herná slučka - volá sa stále dokola
 | ||||
| int game_event(struct event* event, void* game) { | ||||
|     struct game* stav = game; | ||||
|      | ||||
|     // Ak stlačil ESC, koniec hry
 | ||||
|     if (event->type == EVENT_ESC) { | ||||
|         return 1; | ||||
|     } | ||||
|      | ||||
|     // Ak je koniec hry, nič nerob
 | ||||
|     if (stav->koniec_hry) { | ||||
|         return 0; | ||||
|     } | ||||
|      | ||||
|     // Kontrola, či mačka chytila myšku
 | ||||
|     if (stav->macka_x == stav->myska_x && stav->macka_y == stav->myska_y) { | ||||
|         stav->skore++; | ||||
|         sprintf(stav->sprava, "Skóre: %d", stav->skore); | ||||
|          | ||||
|         // Nastav novú náhodnú pozíciu myšky
 | ||||
|         stav->myska_x = rand() % event->width; | ||||
|         stav->myska_y = rand() % event->height; | ||||
|     } | ||||
|      | ||||
|     // Pohyb mačky podľa klávesnice
 | ||||
|     if (event->type == EVENT_KEY) { | ||||
|         if (event->key == KEY_UP) { | ||||
|             stav->macka_smer_x = 0; | ||||
|             stav->macka_smer_y = -1; | ||||
|         } | ||||
|         else if (event->key == KEY_DOWN) { | ||||
|             stav->macka_smer_x = 0; | ||||
|             stav->macka_smer_y = 1; | ||||
|         } | ||||
|         else if (event->key == KEY_LEFT) { | ||||
|             stav->macka_smer_x = -1; | ||||
|             stav->macka_smer_y = 0; | ||||
|         } | ||||
|         else if (event->key == KEY_RIGHT) { | ||||
|             stav->macka_smer_x = 1; | ||||
|             stav->macka_smer_y = 0; | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     // Automatický pohyb mačky (každý časový interval)
 | ||||
|     if (event->type == EVENT_TIMEOUT) { | ||||
|         // Pohyb mačky
 | ||||
|         int nova_x = stav->macka_x + stav->macka_smer_x; | ||||
|         int nova_y = stav->macka_y + stav->macka_smer_y; | ||||
|          | ||||
|         // Kontrola, či je pohyb v rámci obrazovky
 | ||||
|         if (nova_x >= 0 && nova_x < event->width && nova_y >= 0 && nova_y < event->height) { | ||||
|             stav->macka_x = nova_x; | ||||
|             stav->macka_y = nova_y; | ||||
|         } | ||||
|          | ||||
|         // Náhodný pohyb myšky (1 ku 4 šanca, že sa pohne)
 | ||||
|         if (rand() % 4 == 0) { | ||||
|             int smer = rand() % 4; | ||||
|             switch (smer) { | ||||
|                 case 0: if (stav->myska_y > 0) stav->myska_y--; break; | ||||
|                 case 1: if (stav->myska_y < event->height-1) stav->myska_y++; break; | ||||
|                 case 2: if (stav->myska_x > 0) stav->myska_x--; break; | ||||
|                 case 3: if (stav->myska_x < event->width-1) stav->myska_x++; break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     // Vykreslenie hry
 | ||||
|     clear_screen(); | ||||
|      | ||||
|     // Vykreslenie mačky (žltá na červenom)
 | ||||
|     set_color_cell('M', stav->macka_x, stav->macka_y, COLOR_YELLOW, COLOR_RED); | ||||
|      | ||||
|     // Vykreslenie myšky (biela na modrom)
 | ||||
|     set_color_cell('m', stav->myska_x, stav->myska_y, COLOR_WHITE, COLOR_BLUE); | ||||
|      | ||||
|     // Vykreslenie správy
 | ||||
|     set_message(stav->sprava, 1, 0); | ||||
|      | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
							
								
								
									
										30
									
								
								a4/a3/game.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								a4/a3/game.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | ||||
| #ifndef _GAME_H_INCLUDE_ | ||||
| #define _GAME_H_INCLUDE_ | ||||
| #include "world.h" | ||||
| 
 | ||||
| // Set of variables that expresses state of the game.
 | ||||
| // 
 | ||||
| struct game { | ||||
|     // X speed of the cat
 | ||||
|     int catx; | ||||
|     // Y speed  of the cat
 | ||||
|     int caty; | ||||
|     // X position of the cat
 | ||||
|     int catx_position; | ||||
|     // Y opsition of the cat
 | ||||
|     int caty_position;; | ||||
|     // X position of the mouse
 | ||||
|     int mousex; | ||||
|     // Y position of the mouse
 | ||||
|     int mousey; | ||||
|     // Funky message
 | ||||
|     char message[100]; | ||||
| }; | ||||
| 
 | ||||
| // Returns pointer to  newly allocated state
 | ||||
| void* init_game(); | ||||
| 
 | ||||
| // Changes world according to the game state (pressed key, screen size or other event)
 | ||||
| int game_event(struct event* event,void* game); | ||||
| 
 | ||||
| #endif | ||||
							
								
								
									
										9
									
								
								a4/a3/main.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								a4/a3/main.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | ||||
| #include "game.h" | ||||
| #include "world.h" | ||||
| #include <stdlib.h> | ||||
| 
 | ||||
| 
 | ||||
| int main(int argc, char** argv){ | ||||
|     start_world(init_game,game_event,free); | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										198
									
								
								a4/a3/world.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										198
									
								
								a4/a3/world.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,198 @@ | ||||
| #include "world.h" | ||||
| #include <assert.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <time.h> | ||||
| 
 | ||||
| int TIMEOUT; | ||||
| 
 | ||||
| void abort_game(const char* message){ | ||||
|     endwin(); | ||||
|     puts(message); | ||||
|     exit(1); | ||||
| } | ||||
| 
 | ||||
| void check_bounds(const char* source,int x, int y){ | ||||
|     char msg[200]; | ||||
|     if (x < 0 || x >= COLS){ | ||||
|         sprintf(msg,"%s:: width %d is out of bounds (0,%d)",source,x,COLS); | ||||
|         abort_game(msg); | ||||
|     } | ||||
|     if (y < 0 || y >= LINES){ | ||||
|         sprintf(msg,"%s:: height %d is out of bounds (0,%d)",source,y,LINES); | ||||
|         abort_game(msg); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void clear_screen(){ | ||||
|     // Clear screen
 | ||||
|     mvaddch(0,0,' '); | ||||
|     int screenchars = LINES*COLS; | ||||
|     for (int j = 1; j < screenchars;j++ ){ | ||||
|         addch(' '); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void game_speed(int value){ | ||||
|     if (value < 0){ | ||||
|         abort_game("world_seed:: cannot be negative\n"); | ||||
|     } | ||||
|     TIMEOUT =value; | ||||
| } | ||||
| 
 | ||||
| void set_message(const char* message,int x,int y) { | ||||
|     int l = strlen(message); | ||||
|     for (int i = 0; i < l; i++){ | ||||
|         check_bounds("set_message",x+i,y); | ||||
|         set_cell(message[i],x+i,y); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void assert_message(int event,const char* message){ | ||||
|     if (event == 0){ | ||||
|         abort_game(message); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| void set_cell(int character,int x,int y) { | ||||
|     check_bounds("set_cell",x,y); | ||||
|     set_color_cell(character,x,y,COLOR_WHITE,COLOR_BLACK); | ||||
| } | ||||
| 
 | ||||
| void set_color_cell(int character,int x,int y,short front_color,short back_color){ | ||||
|     check_bounds("set_color_cell",x,y); | ||||
|     if (has_colors()){ | ||||
|         int pair = COLOR_COUNT * front_color + back_color;  | ||||
|         attron(COLOR_PAIR(pair)); | ||||
|         mvaddch(y,x,character); | ||||
|         attroff(COLOR_PAIR(pair)); | ||||
|     } | ||||
|     else{ | ||||
|         mvaddch(y,x,character); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| int start_world(void* (*init_game)(),int (*world_event)(struct event* event,void* game),void (*destroy_game)(void*)){ | ||||
|     srand(time(NULL)); | ||||
|     int r = 1; | ||||
|     // Speed global variable
 | ||||
|     TIMEOUT = 100; | ||||
|     if (initscr() == NULL){ | ||||
|         // TODO Which Error?
 | ||||
|         puts("Curses Error."); | ||||
|         return -1; | ||||
|     } | ||||
|     noecho(); // Nevypisuj vstup na obrazovku
 | ||||
|     cbreak(); // Zabudni starý vstup
 | ||||
|     nodelay(stdscr,TRUE); // Nečakaj na stlačenie
 | ||||
|     keypad(stdscr,TRUE); // Aktivuje šípky
 | ||||
|     curs_set(FALSE); // Neviditeľný kurzor
 | ||||
|     /* Get all the mouse events */ | ||||
|     mousemask(ALL_MOUSE_EVENTS, NULL); | ||||
|     MEVENT mouse_event; | ||||
|     if (has_colors()){ // Zistenie či terminál podporuje farby
 | ||||
|         start_color(); | ||||
|         for (int i = 0; i < COLOR_COUNT;i++){ | ||||
|             for (int j = 0; j < COLOR_COUNT;j++){ | ||||
|                 init_pair(i * COLOR_COUNT + j, i,j); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     else { | ||||
|         puts("No colors!\n"); | ||||
|     } | ||||
|     void* game = NULL; | ||||
|     if (init_game != NULL){ | ||||
|          game = init_game(); | ||||
|          assert_message(game != NULL,"init_game:: should return non null pointer"); | ||||
|     } | ||||
|     timeout(TIMEOUT); | ||||
|     // Initial step
 | ||||
|     struct event event; | ||||
|     memset(&event,0,sizeof(struct event)); | ||||
|     event.height = LINES; | ||||
|     event.width = COLS; | ||||
|     event.type = EVENT_START; | ||||
|     clock_t start_time = clock(); | ||||
|     clock_t last_timeout = start_time; | ||||
|     clock_t next_timeout = last_timeout + TIMEOUT; | ||||
|     event.time_ms = start_time; | ||||
|     // Start event
 | ||||
|     r = world_event(&event,game); | ||||
|     refresh(); | ||||
|     while (!r) { | ||||
|         memset(&event,0,sizeof(struct event)); | ||||
|         event.height = LINES; | ||||
|         event.width = COLS; | ||||
|         event.key = getch(); | ||||
|         // No key was pressed
 | ||||
|         if (event.key == ERR){ | ||||
|             event.type = EVENT_TIMEOUT; | ||||
|             last_timeout = clock(); | ||||
|             next_timeout = last_timeout + TIMEOUT; | ||||
|         } | ||||
|         // Mouse event
 | ||||
|         else if (event.key == KEY_MOUSE ){ | ||||
|             event.type = EVENT_MOUSE; | ||||
|             if(getmouse(&mouse_event) == OK){ | ||||
|                 event.mouse_x = mouse_event.x; | ||||
|                 event.mouse_y = mouse_event.y; | ||||
|                 if(mouse_event.bstate & BUTTON1_PRESSED){ | ||||
|                     event.mouse_left = 1; | ||||
|                 } | ||||
|                 if(mouse_event.bstate & BUTTON2_PRESSED){ | ||||
|                     event.mouse_middle = 1; | ||||
|                 } | ||||
|                 if(mouse_event.bstate & BUTTON3_PRESSED){ | ||||
|                     event.mouse_right = 1; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         else if (event.key == KEY_RESIZE) { | ||||
|             event.type = EVENT_RESIZE; | ||||
|         } | ||||
|         else{ | ||||
|             event.type = EVENT_KEY; | ||||
|             if (event.key == 27){ | ||||
|                 int k = getch(); | ||||
|                 if (k == -1){ | ||||
|                     // Esc Was pressed
 | ||||
|                     event.type = EVENT_ESC; | ||||
|                 } | ||||
|                 else { | ||||
|                     // Alt was pressed
 | ||||
|                     event.key = k; | ||||
|                     event.alt_key = 1; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         // Draw new world
 | ||||
|         event.time_ms = clock(); | ||||
|         r = world_event(&event,game); | ||||
|         refresh(); | ||||
|         event.time_ms = clock(); | ||||
|         // set new timeout
 | ||||
|         int nt = next_timeout - event.time_ms; | ||||
|         //printf("%d\n",nt);
 | ||||
|         if (nt > 0){ | ||||
|             timeout(nt); | ||||
|         } | ||||
|         else { | ||||
|             timeout(TIMEOUT); | ||||
|             next_timeout = event.time_ms + TIMEOUT; | ||||
|         } | ||||
|     } | ||||
|     memset(&event,0,sizeof(struct event)); | ||||
|     event.height = LINES; | ||||
|     event.width = COLS; | ||||
|     event.type = EVENT_END; | ||||
|     event.time_ms = clock(); | ||||
|     world_event(&event,game); | ||||
|     if (destroy_game != NULL){ | ||||
|         destroy_game(game); | ||||
|     } | ||||
|     endwin(); | ||||
|     return r; | ||||
| }; | ||||
							
								
								
									
										113
									
								
								a4/a3/world.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								a4/a3/world.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,113 @@ | ||||
| #ifndef _WORLD_H_ | ||||
| #define _WORLD_H_ | ||||
| 
 | ||||
| #include <curses.h> | ||||
| 
 | ||||
| /**
 | ||||
|  * World represented as a rectangular matrix of colorful characters. | ||||
|  *  | ||||
|  * Point [0,0] is displayed the upper left corner of the screen. | ||||
|  *  | ||||
|  */ | ||||
| 
 | ||||
| enum event_type { | ||||
|     EVENT_START, | ||||
|     EVENT_TIMEOUT, | ||||
|     EVENT_KEY, | ||||
|     EVENT_MOUSE, | ||||
|     EVENT_RESIZE, | ||||
|     EVENT_ESC, | ||||
|     EVENT_END, | ||||
| }; | ||||
| 
 | ||||
| struct event { | ||||
|     /**
 | ||||
|      * Last width of the screen. | ||||
|      */ | ||||
|     int width; | ||||
|     /**
 | ||||
|      * Last height of the screen. | ||||
|      */ | ||||
|     int height; | ||||
|     /**
 | ||||
|      * Last pressed key or Curses event. | ||||
|      * | ||||
|      * Special event  values: | ||||
|      * ERR if timeout, | ||||
|      * KEY_RESIZE if screen resize | ||||
|      * KEY_EVENT, other event, | ||||
|      * KEY_MOUSE, mouse clicked | ||||
|      * | ||||
|      * Key values: | ||||
|      * | ||||
|      * ' ' Space | ||||
|      * KEY_DOWN Arrow down | ||||
|      * KEY_UP Arrow up | ||||
|      * KEY_LEFT Arrow left | ||||
|      * KEY_RIGHT Arrow right | ||||
|      * KEY_A1 Upper left of keypad | ||||
|      * KEY_A3 Upper right of keypad | ||||
|      * KEY_B2 Center of keypad | ||||
|      * KEY_C1 Lower left of keypad | ||||
|      * KEY_C3 Lower right of keypad | ||||
|      * | ||||
|      * KEY_ENTER | ||||
|      * KEY_BACKSPACE | ||||
|      */ | ||||
|     int key; | ||||
|     int alt_key; | ||||
|     enum event_type type; | ||||
|     int mouse_x; | ||||
|     int mouse_y; | ||||
|     int mouse_left; | ||||
|     int mouse_right; | ||||
|     int mouse_middle; | ||||
|     long int time_ms; | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * Sets cell to a state. | ||||
|  * @param event  | ||||
|  * @param x coordinate of cell | ||||
|  * @param y coordinate of cell | ||||
|  * @param new state of the cell | ||||
|  */ | ||||
| void set_cell(int character,int x,int y); | ||||
| 
 | ||||
| /**
 | ||||
|  * COLOR_BLACK   0 | ||||
|  * COLOR_RED     1 | ||||
|  * COLOR_GREEN   2 | ||||
|  * COLOR_YELLOW  3 | ||||
|  * COLOR_BLUE    4 | ||||
|  * COLOR_MAGENTA 5 | ||||
|  * COLOR_CYAN    6 | ||||
|  * COLOR_WHITE   7 | ||||
|  */ | ||||
| 
 | ||||
| #define COLOR_COUNT 8 | ||||
| 
 | ||||
| void set_color_cell(int character,int x,int y,short front_color,short back_color); | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|  * | ||||
|  * @param event | ||||
|  * @param number of commandline arguments | ||||
|  * @param init_world | ||||
|  * @param destroy_world | ||||
|  * | ||||
|  * void init_world(struct event* w); | ||||
|  * Initializes user state. | ||||
|  * Free user state. | ||||
|  * @param event | ||||
|  */ | ||||
| 
 | ||||
| int start_world(void* (*init_game)(),int (*world_event)(struct event* event,void* game),void (*destroy_game)(void* game)); | ||||
| 
 | ||||
| void game_speed(int value); | ||||
| 
 | ||||
| void set_message(const char* message,int x,int y); | ||||
| void clear_screen(); | ||||
| 
 | ||||
| #endif | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user