矢印キーを入力文字とするには?

[戻る]
むら 2000/11/03(金) 00:24:04
VC++というよりC言語自体の質問になってしますのですが、
現在DOSアプリケーションで簡単なゲームを作っています。
そのゲームの中で自キャラ(といっても●ですが、、、)を
十字キーで上下左右に動くようにしたいのですが、どうすれば
よいのでしょうか?
ちなみに現在はテンキーの2468を十字キー代わりに使っています。

masa [E-Mail] 2000/11/04(土) 09:37:33
以下のような関数は作成してますか
参考文献としては
 OADGテクニカルレファレンス PCオープンアーキテクチャー推進協議会
 お近くのIBMに問い合わせれば入手可能かとおもわれます

/* **************************************************** */
/* ***     画面制御キー定義                         *** */
/* **************************************************** */
/*                                                      */
// 文字入力用
#define  UP_C          0x48    /* ↑ */
#define  DOWN_C        0x50    /* ↓ */
#define  LEFT_C        0x4D    /* → */
#define  RIGHT_C       0x4B    /* ← */
#define  SPACE_C       0x20
#define  ENTER_C       0x0d
#define  ESC_C         0x1b
// ESC_C と組み合わせて下記のキーは使用される
#define  INST_C        0x52    /* INSERT KEY */
#define  DELT_C        0x53    /* DELETE KEY */
// 数字入力用
#define  XFER         0xA700    /* 変換       */
#define  RUP         0x49E0       /* ROLL UP    */
#define  RDW         0x51E0       /* ROLL DOWN  */
#define  INST         0x52E0       /* INSERT KEY */
#define  DELT         0x53E0    /* DELETE KEY */
#define  UP          0x48E0    /* ↑         */
#define  DOWN        0x50E0    /* ↓         */
#define  LEFT        0x4DE0    /* →         */
#define  RIGHT       0x4BE0    /* ←         */
#define  HELP        0x4fE0       /* END        */
#define  BS          0x0e08       /* BACK SPACE */
#define  SPACE       0x3920
#define  ENTER       0x1c0d
#define  ESC         0x001b
#define  PF01        0x3B00
#define  PF02        0x3C00
#define  PF03        0x3D00
#define  PF04        0x3E00
#define  PF05        0x3F00
#define  PF06        0x4000
#define  PF07        0x4100
#define  PF08        0x4200
#define  PF09        0x4300
#define  PF10        0x4400
#define  PF11        0x8500
#define  PF12        0x8600
/*  #define  PF13        0x5400     DOS/V は無し
    #define  PF14        0x5500
    #define  PF15        0x5600
*/

// ****************************************************
// **   グローバル変数                       **      
// ****************************************************

int        cs;     
int        keyfnc;
union    REGS    regs,inregs,outregs;
struct    SREGS    segregs;
/* **********************************************************************************
   **                      データ 入力系  関数                                  **
   ********************************************************************************** */
// *********************************
// **  キーボード入出力速度設定   **
// *********************************
void         initkey(void) 
{
    inregs.h.ah=3;
    inregs.h.al=5;
    inregs.h.bh=0x01;                // 00:250 01:500 02:750 03:1000まで //
    inregs.h.bl=0x10;                // 設定表を参照                     //
    int86(0x16,&inregs,&outregs);
}
// *********************************
// **  キーボートスキャン         **
// *********************************
unsigned     keyscan (void)    
{
    inregs.h.ah=0x10;
    int86(0x16,&inregs,&outregs);
    cs=outregs.h.al;
    return (outregs.x.ax);
}

masa 2000/11/04(土) 10:18:15
追伸
 NECの PC9821と
 DOS/V(NX)とはキーボードのスキャンコードが違いますので注意してください
 ソフトバンクの「C言語の応用50例」が一番参考になるのではないでしょうか
 WinアプリでなくDOS事務系の応用であればいつでもメールください

むら 2000/11/05(日) 16:20:47
[[解決]]
masaさんご返答ありがとうございました。
まだ勉強不足のためすべてを理解することはできませんでしたが、
矢印キーは結構特殊なんですね。
なにやら二種類の文字列が入力されることがわかりましたので、
自分なりに解釈し、組んでみました。

while(1)
{
 printf("\033[%d;%dH●",y,x);

 muki[0]=getch();
 muki[1]=getch();

 if(muki[0]==0xe0 && muki[1]==0x48)
  y=y-1
 else if(muki[0]==0xe0 && muki[1]==0x50)
  y=y+1;
 else if(muki[0]==0xe0 && muki[1]==0x4b)
  x=x-1;
 else if(muki[0]==0xe0 && muki[1]==0x4d)
  x=x+1;
}

としたところ思う通りの結果を生むことができました。
本当にありがとうございました。

古いスレッドには追加発言できません。