Консольная игрушка на Си/С++

Как сделать так, чтобы наш снаряд двигался не зависимо от нашего спрайта? Если вы скопируете код, то увидите, что наш снаряд -> двигается на позицию вперед только после ввода символа в 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())
    {
        // Что-то там...
    }
}
→ Ссылка