首先感谢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
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#include <aygshell.h>
#include <sipapi.h>
#define ScreenW 240 //游戏窗口宽度
#define ScreenH 320 //游戏窗口高度
#else //PC环境,只在WIN2000 Pro/VC6下测试过
#include <stdio.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
#define TCHAR char
#define wcslen strlen
#define wcscmp strcmp
#define wcscpy strcpy
#define wcscat strcat
#define wcsncpy strncpy
#define swprintf sprintf
#define SHLoadDIBitmap(szBmpName) (HBITMAP)LoadImage(GetModuleHandle(NULL),\
szBmpName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
#define ScreenW 450 //游戏窗口宽度
#define ScreenH 550 //游戏窗口高度
#endif
关于这个,相信大家都知道,只是提一下,不详细介绍了
2、游戏设置部分
这部分的实现比较幼稚,EDIT获得焦点后,在相应的hDC区域画出Press Any Key的提示信息,然后无限等待消息(键盘按下),不知道有没有更好的办法?详情请见“设置窗口回调函数”代码段:
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
{
//等待键盘按下消息
MSG msg;
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"));
else if( 0 == wcscmp(str,TEXT("17")) )
wcscpy(str,TEXT("CONTROL"));
else if( 0 == wcscmp(str,TEXT("32")) )
wcscpy(str,TEXT("SPACE"));
else if( 0 == wcscmp(str,TEXT("37")) )
wcscpy(str,TEXT("LEFT"));
else if( 0 == wcscmp(str,TEXT("38")) )
wcscpy(str,TEXT("UP"));
else if( 0 == wcscmp(str,TEXT("39")) )
wcscpy(str,TEXT("RTGHT"));
else if( 0 == wcscmp(str,TEXT("40")) )
wcscpy(str,TEXT("DOWN"));
else
swprintf(str,TEXT("%c"),vKey);
SetWindowText(::GetFocus(),str);
//SendMessage(hWndSet,WM_NEXTDLGCTL,0,0);
InvalidateRect(hWndSet,&rc,TRUE);
DeleteDC(hDC);
} //end if(HIWORD(wParam) == EN_SETFOCUS) here