📄 dos二十一.txt
字号:
{
int i,j,x,y;
long addr,addr1,page;
unsigned short temp;
unsigned char color;
unsigned int b[]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768};
unsigned char *video=(unsigned char *)0xA0000;
color=mouse.color;
y=mouse.y-1;
addr=count_offest(SCR_H,mouse.x,mouse.y);
mouse_page=addr>>16;
set_page(mouse_page);
for(i=0;i<16;i++)
{
x=mouse.x-1;
temp=cursor[i];
addr=count_offest(SCR_H,x,y);
for(j=16;j>=0;j--)
{
if((b[j]&temp)&&(x>0)&&(x<SCR_H)&&(y>0)&&(y<SCR_V))
{
page=addr>>16;
addr1=addr-(page<<16);
if (mouse_page!=page)
{
mouse_page=page;
set_page(mouse_page);
}
*(video+addr1)=color;
*(buffer+addr)=color;
}
x++;
addr++;
}
y++;
}
}
/*-------------------------------------------------------------------------------*/
void read_mouse(void)
{
REGS in,out;
mouse.color=255;
in.w.ax=0x03;
int386(0x33,&in,&out);
mouse.left=(out.w.bx&0x01);
mouse.right=(out.w.bx&0x02);
mouse.middle=(out.w.bx&0x04);
mouse.x=out.w.cx;
if (0>mouse.x) mouse.x=0;
if (SCR_H<mouse.x) mouse.x=SCR_H;
mouse.y=out.w.dx;
if (0>mouse.y) mouse.y=0;
if (SCR_V<mouse.y) mouse.y=SCR_V;
if (mouse.show) hard_disp_mouse();
}
/*-------------------------------------------------------------------------------*/
19、键盘操作要拦截键盘中断,可不能用系统给的函数,游戏程序员戒条:凡是系统给的,必然是不合用的。下面是例子。使用时,在你的循环中直接监测key_ascii就行了。
/*-------------------------------------------------------------------------------*/
#define SCAN_ALT 56
#define SCAN_CTRL 29
#define SCAN_caps 58
#define SCAN_LEFTSHIFT 42
#define SCAN_RIGHTSHIFT 54
#define SCAN_SHIFT (keyflag[SCAN_RIGHTSHIFT]||keyflag[SCAN_LEFTSHIFT])
#define KEY_END 255
#define KEY_LEFT 254
#define KEY_RIGHT 253
#define KEY_PAGEUP 252
#define KEY_UP 251
#define KEY_DOWN 250
#define KEY_HOME 249
#define KEY_CTRLBREAK 248
#define KEY_F1 247
#define KEY_F2 246
#define KEY_F3 245
#define KEY_F4 244
#define KEY_F5 243
#define KEY_F6 242
#define KEY_F7 241
#define KEY_F8 240
#define KEY_F9 239
#define KEY_F10 238
#define KEY_PAGEDOWN 237
#define KEY_INSERT 236
#define KEY_DELETE 235
#define KEY_LEFTALT 234
#define KEY_RIGHTALT 233
#define KEY_RIGHTCTRL 232
#define KEY_LEFTCTRL 231
#define KEY_caps 230
#define KEY_F11 229
#define KEY_F12 228
#define KEY_PRINTSCREEN 228
#define KEY_NUMLOCK 227
#define KEY_SCROLLLOCK 226
#define KEY_LEFTSHIFT 225
#define KEY_RIGHTSHIFT 224
#define KEY_WINDOWS 223
/*-------------------------------------------------------------------------------*/
static unsigned char asciinames[]={
0,27,'1','2','3','4','5','6','7','8','9','0','-','=',8,9,
'q','w','e','r','t','y','u','i','o','p','[',']',13,KEY_LEFTCTRL,'a','s',
'd','f','g','h','j','k','l',';',39,'`',0,92,'z','x','c','v',
'b','n','m',',','.','/',0,'*',KEY_LEFTALT,' ',KEY_caps,KEY_F1,KEY_F2,KEY_F3,KEY_F4,KEY_F5,
KEY_F6,KEY_F7,KEY_F8,KEY_F9,KEY_F10,KEY_NUMLOCK,KEY_SCROLLLOCK,'7','8','9','-','4','5','6','+','1',
'2','3','0',127,0,0,'\\',KEY_F11,KEY_F12,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
/*-------------------------------------------------------------------------------*/
static unsigned char shiftnames[]={
0,27,'!','@','#','$','%','^','&','*','(',')','_','+',8,9,
'Q','W','E','R','T','Y','U','I','O','P','{','}',13,1,'A','S',
'D','F','G','H','J','K','L',':',34,'~',KEY_LEFTSHIFT,'|','Z','X','C','V',
'B','N','M','<','>','?',KEY_RIGHTSHIFT,'*',1,' ',0,0,0,0,0,0,
0,0,0,0,0,0,0,'7','8','9','-','4','5','6','+','1',
'2','3','0',127,0,0,'|',0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0
};
/*-------------------------------------------------------------------------------*/
static char specialnames[]={
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,13,KEY_RIGHTCTRL,0,0,
0,0,0,0,0,0,0,0,0,0,KEY_WINDOWS,0,0,0,0,0,
0,0,0,0,0,'/',0,KEY_PRINTSCREEN,KEY_RIGHTALT,0,0,0,0,0,0,0,
0,0,0,0,0,0,KEY_CTRLBREAK,KEY_HOME,KEY_UP,KEY_PAGEUP,0,KEY_LEFT,0,KEY_RIGHT,0,KEY_END,
KEY_DOWN,KEY_PAGEDOWN,KEY_INSERT,KEY_DELETE,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
/*-------------------------------------------------------------------------------*/
unsigned char pause_key;
unsigned char key_ascii;
unsigned char key_scan;
unsigned char keyflag[128];
static unsigned char caps;
static unsigned char cur_code,key_code;
static void (_interrupt far *_old_key_interrupt)(void);
/*-------------------------------------------------------------------------------*/
void setkeyspeed()
{
REGS regs;
regs.w.bx=0x0;
regs.w.ax=0x0A05;
int386 (0x16,®s,®s);
}
/*-------------------------------------------------------------------------------*/
void clearkey()
{
int i;
key_scan=0;
key_ascii=0;
memset(keyflag,0,sizeof(keyflag));
}
/*-------------------------------------------------------------------------------*/
static void interrupt key_interrupt(void)
{
static unsigned char specialflag;
unsigned char k,c,temp;
int i;
k=inp(0x60);
outp(0x61,(temp=inp(0x61))|0x80);
outp(0x61,temp);
if(k==0xe0)specialflag=1;
else if(k==0xe1)pause_key=1;
else
{
if(k&0x80)
{
k&=0x7f;
keyflag[k]=0;
}
else
{
key_code=cur_code;
cur_code=key_scan=k;
keyflag[k]=1;
if(specialflag)c=specialnames[k];
else
{
if(k==SCAN_caps)
{
caps=(~caps)&1;
}
if(SCAN_SHIFT)
{
c=shiftnames[k];
if((c>='A')&&(c<='Z')&&caps)
c+='a'-'A';
}
else
{
c=asciinames[k];
if((c>='a')&&(c<='z')&&caps)
c-='a'-'A';
}
}
if(c)key_ascii=c;
}
specialflag=0;
}
outp(0x20,0x20);
}
/*-------------------------------------------------------------------------------*/
static void initkey(void)
{
clearkey();
setkeyspeed();
_old_key_interrupt=_dos_getvect(9);
_dos_setvect(9,key_interrupt);
}
/*-------------------------------------------------------------------------------*/
static void closekey(void)
{
_dos_setvect(9,_old_key_interrupt);
}
/*-------------------------------------------------------------------------------*/
unsigned char getscan(void)
{
unsigned char result;
while((result=key_scan)!=0);
key_scan=0;
return(result);
}
/*-------------------------------------------------------------------------------*/
unsigned char getkey(void)
{
unsigned char result;
while((result=key_ascii)==0);
key_ascii=0;
return(result);
}
/*-------------------------------------------------------------------------------*/
20、任何情况下要注意调试,WATCOM C/C++程序员可以用以下几条函数调试:
调用:
debug("test.dbg","i=%d\n",i);
debug_print();
int debug_count=0;
struct debug_type
{
char *fname[255];
char *fcoment[255];
int value[255];
}debug_i;
//除错程序
void debug(char *file_name,char *coment,int debug_v)
{
if (debug_count<255)
{
debug_i.fname[debug_count]=file_name;
debug_i.fcoment[debug_count]=coment;
debug_i.value[debug_count]=debug_v;
debug_count++;
}
}
//除错写盘程序
void debug_print(void)
{
FILE *debug_file;
int i;
if (debug_count!=0)
{
for (i=0;i<=debug_count;i++)
{
debug_file=fopen(debug_i.fname[i],"a");
fprintf(debug_file,"debug[%3d] ",i);
fprintf(debug_file,debug_i.fcoment[i],debug_i.value[i]);
fclose(debug_file);
}
}
init_debug();
}
21、最后一条,写不下去了,就不要写了,游戏开发是一个漫长的过程,没有一天能写成的游戏,至少我没见过,写得太累了,就玩去吧,千万不要把自己的热情消耗没了,那样的话,再简单的游戏也写不出来。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -