[Prev] [Home] [Next]
2002/05
19日
本日は前回のMplayの終了条件の見直しを行う予定だったが、更に突っ込んで以下の2点も対応した。
1.Mplayのデザイン部とロジック部の分離の準備
2.取得キーの判定方法変更。(1に伴う変更)
まずはplay.cから。
ロジック部については要検討だが、ロジック部の呼び出しを明確にするためにMplay()を各メソッドに分割する。
もちろんMplay()のループ終了条件も変更。
キーの判定については、入力を受け持つinput.cに、各キーコードの判定メソッド(PIisKeyUp()等の関数)を追加する事とし、それを呼び出す事で対応。
これによりinput.hのincludeは不要となった。
---ソース1−1(旧menu.c)
/*******************************
SOKOBAN for DOS
menu.c
Build:0004/20020504
Berse
(c) ThinkingRabbit
*******************************/
/*-------------- 20020504-Berse */
#include"input.h"
/*-------------- 20020504-Berse */
int Mplay()
{
char x,y,bx,by,item,ynow,key;
int i;
DOmenu();
x=40;y=11;
item=8;
ynow=0;bx=x;by=y+1;
DOputmenucursor(x,y,bx,by);
key=KEY_NO;
while((key==KEY_A)||(key==KEY_B)){
key = Igetkey();
if((key==KEY_U)&&(ynow>0)){
by=y;y--;
DOputmenucursor(x,y,bx,by);
}
if((key==KEY_D)&&(ynow<(item-1))){
by=y;y++;
DOputmenucursor(x,y,bx,by);
}
}
DOmenuhide(item);
if(key==KEY_A) return(ynow+1);
if(key==KEY_B) return(0);
}
---ソース1−2(新menu.c)
/*******************************
SOKOBAN for DOS
menu.c
Build:0005/20020519
Berse
(c) ThinkingRabbit
*******************************/
/*-------------- 20020513-Berse */
char x,y,bx,by,item,ynow,key;
/*-------------- 20020513-Berse */
void DMready()
{
x=40;y=11;
item=8;
DOmenu();
ynow=0;bx=x;by=y+1;
DOputmenucursor(x,y,bx,by);
}
/*-------------- 20020513-Berse */
void DMup()
{
if(ynow > 0){
by=y;y--;ynow--;
DOputmenucursor(x,y,bx,by);
}
}
/*-------------- 20020513-Berse */
void DMdown()
{
if(ynow<(item-1)){
by=y;y++;ynow++;
DOputmenucursor(x,y,bx,by);
}
}
/*-------------- 20020513-Berse */
int DMgetSelectNo()
{
return(ynow+1);
}
/*-------------- 20020513-Berse */
void DMfinish()
{
DOmenuhide(item);
}
/*-------------- 20020519-Berse */
int Mplay()
{
FMready();
for(;;){
key = Igetkey();
if(PIisKeyA(key)){ DMfinish();
return(DMgetSelectMenu());
}
if(PIisKeyB(key)){ DMfinish();
return(0);
}
if(PIisKeyUp(key)) DMup();
if(PIisKeyDown(key)) DMdown();
}
}
---
続いてinput.cにキーコード判定用メソッドの追加を行う。
ファイル名はpinput.cに変更予定だが、まだ行わない。
---ソース2(input.c)
/*******************************
SOKOBAN for DOS
pinput.c[PI]
Build:0003/20020513
Berse
(c) ThinkingRabbit
*******************************/
/*-------------- 20020510-Berse */
#include"env.h"
#define KEY_NO 0
#define KEY_U 1
#define KEY_R 2
#define KEY_D 3
#define KEY_L 4
#define KEY_A 5
#define KEY_B 6
/*-------------- 20020513-Berse */
int PIisKeyNo(key)
int key;
{
return( (key == KEY_NO)? 1 /*True*/ : 0 /* False */)
}
/*-------------- 20020513-Berse */
int PIisKeyUp(key)
int key;
{
return( (key == KEY_U)? 1 /*True*/ : 0 /* False */)
}
/*-------------- 20020513-Berse */
int PIisKeyRight(key)
int key;
{
return( (key == KEY_R)? 1 /*True*/ : 0 /* False */)
}
/*-------------- 20020513-Berse */
int PIisKeyDown(key)
int key;
{
return( (key == KEY_D)? 1 /*True*/ : 0 /* False */)
}
/*-------------- 20020513-Berse */
int PIisKeyLeft(key)
int key;
{
return( (key == KEY_L)? 1 /*True*/ : 0 /* False */)
}
/*-------------- 20020513-Berse */
int PIisKeyA(key)
int key;
{
return( (key == KEY_A)? 1 /*True*/ : 0 /* False */)
}
/*-------------- 20020513-Berse */
int PIisKeyB(key)
int key;
{
return( (key == KEY_B)? 1 /*True*/ : 0 /* False */)
}
/*-------------- 20020510-Berse */
int Igetkey()
{
char key;
key = ECgetkey();
switch(key){
case EI_KEY_SPACE: return(KEY_A);
case EI_KEY_ESCAPE: return(KEY_B);
case EI_KEY_UP: return(KEY_U);
case EI_KEY_RIGHT: return(KEY_R);
case EI_KEY_LEFT: return(KEY_L);
case EI_KEY_DOWN: return(KEY_D);
default: return(KEY_NO);
}
}
---
続いてenv.cのキー取得関数名をECgetKey()に変更。
こちらもファイル名の変更はまだ行わない。
---ソース3(env.c)
/*******************************
SOKOBAN for DOS
Ecommon.c[EC]
Build:0004/20020510
Berse
(C)Thinking Rabbit
*******************************/
/*-------------- 20020510-Berse */
#include
#include"env.h"
#define VIDEOBIOS 0x10
#define KEYBIOS 0x16
#define GETKEY 0x10
#define X_0 (-2)
#define Y_0 (-2)
union REGS ireg,oreg;
/*-------------- 20020510-Berse */
int ECgetkey()
{
unsigned char pri,sec;
do{
ireg.h.ah=GETKEY;
int86(KEYBIOS,&ireg,&oreg);
pri = oreg.h.al;
sec = oreg.h.ah;
}while((pri==0)&&(sec==0x03)); /* no key */
if((pri==0x00)||(pri==0xE0)||(pri==0xF0)){
switch(sec){
case 0x48: return(EI_KEY_UP);
case 0x50: return(EI_KEY_DOWN);
case 0x4B: return(EI_KEY_LEFT);
case 0x4D: return(EI_KEY_RIGHT);
default: return(EI_KEY_NO);
}
}else if(pri==0x1b){
return(EI_KEY_ESCAPE); /*escape*/
}else if((pri==0x20)&&(sec==0x39)){
return(EI_KEY_SPACE); /*space*/
}else{
return(EI_KEY_NO);
}
}
DOlocate(c,r)
int r,c;
{
ireg.h.ah=0x02;
ireg.h.bh=0x00;
ireg.h.dh=r+Y_0;
ireg.h.dl=c+X_0;
int86(VIDEOBIOS,&ireg,&oreg);
}
---
DOlocate()という関数名はまずいな。後で変える事としよう。
最後にsokoban.cのbuildを変更。
---ソース4(fsokoban.c)(一部)
/*-------------- 20020519-Berse */
FSinit()
{
_VERSION = "0.2";
BUILD = 19;
Lsetlevelset();
FTinit();
}
さて、それでは本日のコンパイル!
input.cのキーコード判定関数のreturn文に、全てセミコロン忘れてる。
[Prev] [Home] [Next]