135 lines
2.7 KiB
C
135 lines
2.7 KiB
C
#include <stdlib.h>
|
|
#include <ncurses.h>
|
|
#include <unistd.h>
|
|
|
|
void quit();
|
|
void draw_borders(WINDOW *screen);
|
|
int move_player(int keypress, int* player_y, int* player_x);
|
|
|
|
void refresh_window(WINDOW *screen);
|
|
|
|
|
|
int main(int argc, char *argv[]){
|
|
int max_y, max_x, new_y, new_x, field_max_x, field_max_y, player_x, player_y;
|
|
int next_x = 0;
|
|
int keypress;
|
|
int control_size = 5;
|
|
|
|
initscr(); // Initialize window
|
|
noecho(); // Don't echo keypresses
|
|
curs_set(FALSE); // No cursor
|
|
nodelay(stdscr,1); // Stop getch from waiting.
|
|
|
|
getmaxyx(stdscr, max_y, max_x); //Get the max x/y of the screen
|
|
|
|
|
|
WINDOW *field = newwin(max_y - control_size, max_x, 0, 0);
|
|
WINDOW *controls = newwin(control_size, max_x, max_y - control_size, 0);
|
|
|
|
draw_borders(field);
|
|
draw_borders(controls);
|
|
|
|
|
|
//center player on field
|
|
getmaxyx(field, field_max_y, field_max_x);
|
|
|
|
player_x = field_max_x/2;
|
|
player_y = field_max_y/2;
|
|
|
|
while(1){
|
|
getmaxyx(stdscr, new_y, new_x);
|
|
|
|
keypress = getch(); // Listen for commands; must be before window refresh
|
|
|
|
|
|
if (new_y != max_y || new_x != max_x) {
|
|
max_x = new_x;
|
|
max_y = new_y;
|
|
|
|
wresize(field, new_y - control_size, new_x);
|
|
wresize(controls, control_size, new_x);
|
|
mvwin(controls, new_y - control_size, 0);
|
|
wclear(stdscr);
|
|
wclear(field);
|
|
wclear(controls);
|
|
|
|
draw_borders(field);
|
|
draw_borders(controls);
|
|
wrefresh(stdscr);
|
|
}
|
|
|
|
mvwprintw(field, 1, 1, "Field");
|
|
mvwprintw(field, player_y, player_x, "o");
|
|
|
|
mvwprintw(controls, 1, 1, "Commands");
|
|
mvwprintw(controls, 3, 1, "^Q to quit");
|
|
|
|
wrefresh(field);
|
|
wrefresh(controls);
|
|
|
|
if (keypress != -1) {
|
|
move_player(keypress, &player_y, &player_x);
|
|
refresh_window(field);
|
|
}
|
|
}
|
|
endwin();
|
|
|
|
return 0;
|
|
}
|
|
|
|
int move_player(int keypress, int* player_y, int* player_x){
|
|
if (keypress == 'w'){
|
|
*player_y = *player_y - 1;
|
|
}
|
|
|
|
else if (keypress == 'a'){
|
|
*player_x = *player_x - 1;
|
|
}
|
|
else if (keypress == 's'){
|
|
*player_y = *player_y + 1;
|
|
}
|
|
else if (keypress == 'd'){
|
|
*player_x = *player_x + 1;
|
|
}
|
|
|
|
else if (keypress == 17) {
|
|
quit();
|
|
}
|
|
|
|
}
|
|
|
|
void refresh_window(WINDOW *screen) {
|
|
wclear(screen);
|
|
draw_borders(screen);
|
|
wrefresh(screen);
|
|
}
|
|
|
|
void draw_borders(WINDOW *screen) {
|
|
int x, y, i;
|
|
|
|
getmaxyx(screen, y, x);
|
|
|
|
// 4 corners
|
|
mvwprintw(screen, 0, 0, "+");
|
|
mvwprintw(screen, y - 1, 0, "+");
|
|
mvwprintw(screen, 0, x - 1, "+");
|
|
mvwprintw(screen, y - 1, x - 1, "+");
|
|
|
|
// sides
|
|
for (i = 1; i < (y - 1); i++) {
|
|
mvwprintw(screen, i, 0, "|");
|
|
mvwprintw(screen, i, x - 1, "|");
|
|
}
|
|
|
|
// top and bottom
|
|
for (i = 1; i < (x - 1); i++) {
|
|
mvwprintw(screen, 0, i, "-");
|
|
mvwprintw(screen, y - 1, i, "-");
|
|
}
|
|
}
|
|
|
|
void quit(){
|
|
endwin();
|
|
exit(0);
|
|
}
|