0

Ncurses ライブラリを使用して C++ で Pacman を作成しています。私のコードでパックマンを動かすことはできますが、異なる方向に切り替えるには多くの時間がかかります。たとえば、パックマンが左に移動しているときに右矢印キーを押すと、右に移動するまでに時間がかかります。

 if (ch==KEY_LEFT)
 {
    int b,row,column;
    getyx(stdscr,row,column);
    for (b=column;b>=0;b-=1)    //loop to move the pacman left until it hits the wall
    {

     mvprintw(row,b,">");  //print the ">" symbol
     refresh();
     waitf(0.2);
     attron(COLOR_PAIR(1));      //this pauses the game for 1 second
     mvprintw(row,b,">");
     attroff(COLOR_PAIR(1));
     refresh();
     waitf(0.2);
     mvprintw(row,(b),"O");  //showing the open mouth of pacman
     refresh();
     waitf(0.2);
     attron(COLOR_PAIR(1));a
     mvprintw(row,(b),"O");

      attroff(COLOR_PAIR(1));

      int h=0;
      h=getch();

      if (h!=KEY_LEFT)
      {
          break;
      }
  }
}
 right=getch();
 loop for right in an if condition
 up=getch();
 loop for up in an if condition
 down=getch();
 loop for moving down in an if condition 

右、上、下についても同じことをしました。また、getch() の値を格納するために、すべての if ステートメントの前に新しい変数を導入しました。

4

2 に答える 2

1

おそらく、waitf(0.2) がプログラムをさらにキーを読み取る前に待機させているのでしょうか? 入力がある場合は、待機を中断することを検討するかもしれません...代わりに時限選択を使用できます。

于 2012-09-24T15:12:17.773 に答える
0

キーボードルーチンにすべてを入れないでください。それはすべてを遅くします。

if (ch==KEY_LEFT) go_left=trueキー処理ルーチンの外の関数ですべてのことを行ってみてください 。

が押されるまでgo_left==true残り、次に.truech==KEY_RIGHTgo_left=false

サンプル ゲーム構造:

#include <stdio.h>
#include <conio.h>
#include <iostream> 

//#include "gamestuff.h"

using namespace std;


#define KB_ESCAPE 27
#define KB_UP 72
#define KB_DOWN 80
#define KB_LEFT 75
#define KB_RIGHT 77
#define KB_F8 66


int keypress=0;
bool go_left=false;
bool go_right=false;
bool go_up=false;
bool go_down=false;

void game_menu();
void keyboard_stuff();
void graphics_stuff();
void game_loop();


int main()
{
 game_menu();
 game_loop();

 return 0;
}

void game_menu()
{
    cout<<"Pacman Game  \n";
    cout<<"  \n";
    cout<<"[1] Resume Game  \n";
    cout<<"[2] Save Game  \n";
    cout<<"[Esc] Exit Game  \n";
    cout<<"  \n";
}


void keyboard_stuff()
{
    if (kbhit())
      {
            keypress = getch();
            //cout<<"KB_code = "<<KB_code<<"\n";

            switch (keypress)
            {

                case KB_ESCAPE:



                break;

                case KB_LEFT:
                           //go_left
                    go_left=true;
                    go_right=false;

                break;

                case KB_RIGHT:
                           //go_right   
                    go_left=false;
                    go_right= true ;

                break;

                case KB_UP:
                           //go_up  
                    go_up=true;
                    go_down=false;

                break;

                case KB_DOWN:
                           //go_down  
                    go_up=false;
                    go_down=true;

                break;

            }        

      }
}

void graphics_stuff()
{

    //put all graphics and draw stuff here

    if(go_left)
    {
        //Update  direction etc


    }

    if(go_right)
    {
        //Update   direction etc


    }

    if(go_up)
    {
        //Update   direction etc


    }

    if(go_down)
    {
        //Update   direction etc


    }

    //draw pacman stuff right here after the above

}

void game_loop()
{

   while(keypress!=KB_ESCAPE)
   {

     keyboard_stuff();
     graphics_stuff();

   }

}
于 2012-09-24T15:49:15.903 に答える