Консольная игрушка на Си/С++
Как сделать так, чтобы наш снаряд двигался не зависимо от нашего спрайта?
Если вы скопируете код, то увидите, что наш снаряд -> двигается на позицию вперед только после ввода символа в getch() для спрайта. Как реализовать независимое движение снаряда от getch()? При этом снаряд должен спавниться на месте нашего спрайта.
Game:
#include<iostream>
#include"Cross.c"
#define height_sprait 3
#define width_sprait 35
#define height_map 10
#define width_map 300
// 4 - # 5 - - 6 - \033[1;32mo\033[1;37m 7 -\033[1;34m@\033[1;37m
char sprait[height_sprait][width_sprait] {
"#-\033[1;32mo\033[1;37m\n"
"#\033[1;34m@\033[1;37m",
"#-\033[1;32mo\033[1;37m"
};
char* bullet = "\033[1;32m->\033[1;37m";
int main() {
char map[height_map][width_map];
static int x = 0, y = 1, coins = 0, bullet_x, bullet_y = y;
while(1) {
clean_up;
printf("Score: $\033[1;32m%d\033[1;37m", coins);
SetCursorPos(bullet_x, bullet_y); //Спавн снаряда
printf("%s", bullet);
++bullet_x;
SetCursorPos(x, y); //Спавн спрайта
for(int y = 0; y < height_sprait; ++y) {
for(int x = 0; x < width_sprait; ++x) {
printf("%c", sprait[y][x]);
}
printf("\n");
}
switch(getch()) { //Ввод
case 'w':
case 'W':
if(y == 1) break;
--y; break;
case 's':
case 'S':
++y; break;
default: break;
}
}
}
Cross.c:
#define PLATFORM_WINDOWS 1
#define PLATFORM_MAC 2
#define PLATFORM_UNIX 3
#if defined(_WIN32)
#define PLATFORM PLATFORM_WINDOWS
#elif defined(__APPLE__)
#define PLATFORM PLATFORM_MAC
#else
#define PLATFORM PLATFORM_UNIX
#endif
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include <math.h>
#if PLATFORM == PLATFORM_WINDOWS
#include <conio.h>
#include <windows.h>
#define getch() _getch()
#define clean_up system("cls");
#define sleep Sleep
#elif PLATFORM == PLATFORM_MAC || PLATFORM == PLATFORM_UNIX
#include <unistd.h>
#include <stdio.h>
#include <termios.h>
int getch() {
int ch;
struct termios oldt, newt;
tcgetattr( STDIN_FILENO, &oldt );
newt = oldt;
newt.c_lflag &= ~( ICANON | ECHO );
tcsetattr( STDIN_FILENO, TCSANOW, &newt );
ch = getchar();
tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
return ch;
}
#define clean_up system("clear");
void SetCursorPos(int XPos, int YPos) {
printf("\033[%d;%dH", YPos+1, XPos+1);
}
#define SetCursorPosition SetCursorPos
#define sleep(a) usleep(a*1000)
#endif
Ответы (1 шт):
Автор решения: EOF
→ Ссылка
Используйте функцию kbhit из conio.h. Она возвращает ненулевое значение, если была нажата какая-то клавиша, и 0 в противном случае. Код должен выглядеть примерно так:
if (kbhit())
{
switch(getch())
{
// Что-то там...
}
}