-- 作者:卷积内核
-- 发布时间:2/6/2006 5:02:00 PM
--
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; file://除错程序 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++; } } file://除错写盘程序 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、最后一条,写不下去了,就不要写了,游戏开发是一个漫长的过程,没有一天能写成的游戏,至少我没见过,写得太累了,就玩去吧,千万不要把自己的热情消耗没了,那样的话,再简单的游戏也写不出来。
|