My FAQ,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Visual C++ > 图形图像与多媒体
WINCE下小游戏习作(Q11战斗机)
作者:未知 时间:2005-07-20 14:15 出处:VC知识库 责编:MyFAQ
              摘要:WINCE下小游戏习作(Q11战斗机)

WINCE下小游戏习作(Q11战斗机)


作者: oshj


下载源代码

  首先感谢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
3、BOSS的子弹加载和绘制
由于要根据游戏难度来动态决定BOSS使用多少子弹,所以采用了动态数组
POINT * m_pFoeBossBalPos;	//BOSS子弹位置
int	  * m_iFoeBossBalWay;	//BOSS子弹方向
int	  * m_iFoeBossBalSpeed;	//BOSS子弹速度

m_pFoeBossBalPos = new POINT[m_iBossTotalBalNum];
m_iFoeBossBalWay = new int[m_iBossTotalBalNum];
m_iFoeBossBalSpeed = new int[m_iBossTotalBalNum];    
其他可以参照代码的注释。

 重要说明:
  1. 没有用内存泄漏工具检测过,不知道有没有内存泄漏,哪位可以帮忙检测一下。
  2. 未完成部分:游戏的BOSS部分(BOSS贴图、BOSS子弹、BOSS爆炸效果)。 游戏难度控制,目前比较幼稚
  3. 未解决的BUG: CE下需要按退出菜单退出,点窗口的关闭按钮进程仍然存在。
 PDA编程调试和发行环境:
  关于PDA编程涉及的知识和工具,在Readme文件中有部分描述,可以查看目录下的Readme文件了解详细情况。这里仅仅列出部分:
WINCE环境:
  1. 有关WINCE的初步知识,涉及的东西比较多,这里不再提供,英文不好的朋友请访问: http://www.ai361.com/WINCE/index.asp; 或者 http://www.vchelp.net/cndevforum/subject_list.asp?forum_id=33&order=view_num 论坛;
  2. 涉及的工具以及下载地址:

    Evc3.0/evb3.0

    Wince3.0中文模拟文件

    //以下两个暂时用不上

    Evc4.0

    SmartPhone Sdk
   另外还有一个就是Microsoft ActiveSync,与PDA设备连接的时候需要用到,下载的地方就比较多了,我硬盘里比较乱,只看到文件,一时还找不到下载地址了,很抱歉,需要你自己花点时间去找了 。 // 具体使用请见相关网文和帮助文件。

WINCE下调试步骤:
  1. 确认安装了Wince3.0中文模拟文件,并确认模拟器中显示的是中文;
  2. 启动Q11Evc.vcw或Q11Evc.vcp工程,确认工程的模式是:
    Pocket PC2002 / Win32(WCE x86) Debug / Pocket PC 2002 Emulation
    Project Settings->Debug->Download directory是:\Windows\"开始"菜单 //注意这个双引号是中文模式的
  3. 启动Tools->Remote File Viewer,
    选择连接Pocket PC2002 Emulation设备,
    之后展开Windows\"开始"菜单\ ,
    File->New Folder建立一个新目录,
    名称为:Q11;然后File->Export File
    将代码下的Q11图片和声音文件导入到模拟器的刚才新建的Q11路径下(有点痛苦,只能一个一个文件的导哦)
  4. 顺利的话,F5之后你就能看到模拟器里的游戏效果了:-)
WINCE下发行步骤:
   与调试模式差不多,只是Active Configuration有点不同:
Pocket PC2002 / Win32(WCE ARM) Release / Pocket PC 2002 (Default Device)

这里仅提供支持ARM CPU类型的工程样板(因为这种CPU比较多吧),你可以自行添加支持其他类型的CPU的Debug和Release。

程序在PC和PDA下均测试通过:
PC: Win2000 Pro + VC6 + SP3
PDA: 华硕 A620 Pocket PC 2002 + EVC3.0

   很抱歉由于本人现在仅属于编程爱好者一族,没有太多时间和精力关注于细节性的技术问题,如果读者有什么问题,请在VCKBASE论坛提出,自有大侠帮忙解决,不要另行Email给我,如果由此给您带来不便,请多多体谅为谢!
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 myfaq.com.cn All rights reserved. www.myfaq.com.cn 版权所有