首先感谢VCKBASE无偿提供的交流环境和众多XDJM们提供的无私的帮助,我在此收益颇丰。最近因为工作上一个PDA嵌入式的项目,恶补了一些这方面的知识,回头感觉走了不少弯路,所以写了这个小游戏,拿出来共享,希望当成一个PDA游戏编写的入门教程,能给后来者一些帮助,水平有限,请勿见笑。
涉及的代码是针对WINCE3.0(PPC2002)平台,同时兼顾了WIN32平台;旨在讨论编写同时适应2种平台的通用代码,采用的是最原始的BitBlt贴图和离屏方式,贴图效果比较粗糙。对声音的处理也比较幼稚,希望不会误导初学者。游戏算法和图片部分参考了王正盛的A10攻击机和Kylinx的kplan代码,在此对两位作者公布源代码的无私行为表示感谢!
程序要点:
1、PC和WINCE编译环境的区分,采用#if_WIN32_WCE#else#endif宏,类似StdAfx.h
//WINCE环境#if_WIN32_WCE#defineWIN32_LEAN_AND_MEAN//Excluderarely-usedstufffromWindowsheaders#include<aygshell.h>#include<sipapi.h>#defineScreenW240//游戏窗口宽度#defineScreenH320//游戏窗口高度#else//PC环境,只在WIN2000Pro/VC6下测试过#include<stdio.h>#include<mmsystem.h>#pragmacomment(lib,"winmm.lib")#defineTCHARchar#definewcslenstrlen#definewcscmpstrcmp#definewcscpystrcpy#definewcscatstrcat#definewcsncpystrncpy#defineswprintfsprintf#defineSHLoadDIBitmap(szBmpName)(HBITMAP)LoadImage(GetModuleHandle(NULL),szBmpName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);#defineScreenW450//游戏窗口宽度#defineScreenH550//游戏窗口高度#endif关于这个,相信大家都知道,只是提一下,不详细介绍了
2、游戏设置部分
这部分的实现比较幼稚,EDIT获得焦点后,在相应的hDC区域画出PressAnyKey的提示信息,然后无限等待消息(键盘按下),不知道有没有更好的办法?详情请见“设置窗口回调函数”代码段:
if(HIWORD(wParam)==EN_SETFOCUS){GetCursorPos(&p);ScreenToClient(hWndSet,&p);GetClientRect(hWndSet,&rcDlg);rc.left=p.x;rc.right=rc.left+80;if(rc.right>rcDlg.right){rc.right=rcDlg.right;rc.left=rc.right-80;}rc.top=p.y;rc.bottom=rc.top+20;hDC=GetDC(hWndSet);SetBkMode(hDC,TRANSPARENT);SetTextColor(hDC,RGB(255,0,0));DrawText(hDC,TEXT("按任意键"),-1,&rc,DT_LEFT);do{//等待键盘按下消息MSGmsg;GetMessage(&msg,NULL,0,0);if(msg.message==WM_KEYDOWN){if((vKey=LOWORD(msg.wParam))!=-1)bPress=TRUE;}}while(bPress==FALSE);swprintf(str,TEXT("%d"),vKey);//只检测这些特殊键值,其他特殊的几乎不用if(0==wcscmp(str,TEXT("16")))wcscpy(str,TEXT("SHIFT"));elseif(0==wcscmp(str,TEXT("17")))wcscpy(str,TEXT("CONTROL"));elseif(0==wcscmp(str,TEXT("32")))wcscpy(str,TEXT("SPACE"));elseif(0==wcscmp(str,TEXT("37")))wcscpy(str,TEXT("LEFT"));elseif(0==wcscmp(str,TEXT("38")))wcscpy(str,TEXT("UP"));elseif(0==wcscmp(str,TEXT("39")))wcscpy(str,TEXT("RTGHT"));elseif(0==wcscmp(str,TEXT("40")))wcscpy(str,TEXT("DOWN"));elseswprintf(str,TEXT("%c"),vKey);SetWindowText(::GetFocus(),str);//SendMessage(hWndSet,WM_NEXTDLGCTL,0,0);InvalidateRect(hWndSet,&rc,TRUE);DeleteDC(hDC);}//endif(HIWORD(wParam)==EN_SETFOCUS)here3、BOSS的子弹加载和绘制