嵌入式游戏源码-基于嵌入式系统的游戏程序设计

0 前言

近年来,随着估算技术和通信技术的快速发展,特别是互联网的快速普及和3C(计算机、通信、消费电子)融合的加速,小型化、专业化已成为发展新趋势,嵌入式产品已成为信息产业的主流。 嵌入式系统被定义为以应用为中心、基于计算机的系统,具有可定制的软件和硬件,以满足应用系统对功能、可靠性、成本、体积和功耗的严格要求。

嵌入式系统是面向用户、面向产品、面向应用的。 但它广泛应用于制造业、过程控制、通信、仪器、仪表等领域,如果消费类产品脱离应用而独立发展,就会失去市场。 嵌入式处理器在帧率、体积、成本、可靠性、速度、处理能力、电磁兼容性等方面受到应用需求的阻碍,这也是各半导体厂商竞争的热点。

嵌入式处理器的应用软件是实现嵌入式系统功能的关键。 软件需要固化存储,软件代码需要高质量、高可靠性。

1 开发平台

完整的嵌入式系统结构如图1所示。设计中使用的硬件平台是基于Intel Xscale框架的PXA255开发板。 CPU运行频率为400 MHz,FLASH为Intel Strata FLASH,容量为32 MB,SDRM容量为64 MB,USBSlave支持USB1.1,LCD支持640×480帧率。

从图1可以看出,一个完整的嵌入式系统不仅包括硬件平台,还包括运行在硬件平台上的操作系统和基于操作系统的应用软件,而嵌入式Linux只是众多嵌入式操作系统中的一种。 一。

自20世纪80年代末以来,一些嵌入式操作系统相继出现,如大家所熟知的Vxwork、pSOS、Neculeus、QNX、ECOS、LYNX、Palm OS和Windows CE,这些专用操作系统都是商业产品,其昂贵的价格让很多拥有高端产品的小公司望而却步; 而且源代码的封闭性也极大限制了开发者的积极性。 另外,结合国外的实际情况,当前国家对独立操作系统的大力支持也为开源Linux的推广提供了广阔的发展前景。 此外,对于底层应用开发人员来说,嵌入式系统需要的是高度简洁、界面友好、质量可靠、应用广泛、开发容易、多任务、低成本的操作系统。 基于上述情况,采用嵌入式Linux操作系统作为软件开发平台。

2 交叉编译工具链

在嵌入式系统软件的开发过程中,交叉编译工具链是极其重要的环节。 设计和制作一个好的交叉编译工具链是软件开发顺利实现的重要保证。

2.1 ARM-Linux gcc交叉工具链

设计中使用的Linux操作系统是经过修改和修剪的ARM-Linux; 使用的开发工具是gcc,一种非图形开发工具。 gcc交叉编译工具通常需要自己制作,制作方法也比较简单,这里就不详细介绍了。 主要使用以下软件包来制作比较完整的ARM-Linux gcc交叉工具链:

binutils 工具包 (ftp://ftp.gnu.org/gnu/binutils);

gcc 编译器(ftp://ftp.gnu.org/gnu/gcc);

glibc函数库(ftp://ftp.gnu.org/gnu/glibc);

glibc-linuxthreads 包(ftp://ftp.gnu.org/gnu/glibe);

Linux 内核 (ftp://ftp.kernle.org/pub/linux/kernel)。

如果Linux内核版本高于2.6嵌入式游戏源码,还应该下载相应的内核补丁。 (ftp://ftp.arm.linux.org.uk/pub/linux/arm/kernel/v2.4/)

2.2 SDL图形库

为了使程序的界面更加友好、美观,设计时应使用图形函数套接字,即在后期工具链(使用gcc工具链版本3.3.2)中添加第三方图形函数库。 设计中使用的SDL(Simple DirectMedia Layer)图形库是一个免费的跨平台多媒体应用编程接口,函数库丰富,方便开发者使用。

2.2.1 SDL常用的开发套件

(1)SDL_Image:提供图像显示接口,用于显示多种格式,支持bmp、png、jpeg、gif、tiff等;

(2)SDL_Draw:提供绘制虚线、圆等几何图形的socket(SDL_gfx也有丰富的此类功能http://www.ferzkopp.net/joomla/content/view/19/14/);

(3) SDL_ttf:提供用于显示TTF文本的套接字;

(4) SDL_mixer:提供播放各种声音文件的套接字。

将SDL编译到工具链的并不是PC本身自带的gcc编译器,而是2.1节中已经准备好的交叉编译工具链。 其中使用的pkg-Config工具版本必须为0.15.0或以上版本。

SDL 和与 SDL 安装相关或依赖的软件有:alsa-lib-1.0.15、audiofile-0.2.6、esound-0.2.38、freetype-2.1.9、jpegsrc。 v6b、libid3tag-0.15.1b、libmad-0.15.1b、libpng-1.2.22、madplay-0.15.2b、SDL-1.2.12、SDL_draw-1.2.11、SDL_gfx-2.0.15、SDL_image-1.2.6、 sdl_mad-0.1、SDL_mixer-1.2.8、SDL_ttf-2.0.9、tiff-3.8.2、tslib-1。 3、zlib-1.2.3。

2.2.2 交叉编译的主要步骤

主要步骤是:

(1)设置环境变量:PREFIX为安装目录; CROSS是ARM-Linux-; PKG_CONFIG_PATH是pkgcon-fig的路径; 这里ARCH设置为ARM; HOST应该是ARM-Linux而不是i386-linux(这个和ARM-Linux-gcc上面不一样); BUILD 设置为 i386-linux。 编译时必须指定CC、NM、AR等变量,并将其与交叉编译器相应的工具关联起来。 否则会使用PC Linux的gcc编译器进行编译,无法达到交叉编译的目的。

(2) 依次编译以下软件:

zlib编译命令行:

. /configure-shared-prefix=$PREFIX; 制作; 进行安装。

freetype编译命令行:

. /configure --host=$(HOST) --build=$(BUILD) --prefix=$PREFIX; 制作; 进行安装。

libpng 编译命令行:

. /configure --host=$(HOST) --build=$(BUILD) --prefix=$PREFIX; 制作; 进行安装。

li^iff 编译命令行:

. /configure --host=$(HOST) --build=$(BUILD) --prefix=$(PREFIX)/usr --without-x --enable-zlib --with-zlib-include-dir=$( PREFIX) /include --with-zlib-lib-dir=$(PREFIX)/lib--with-jpeg-include-dir=$(PREFIX)/include --with-jpeg-lib-dir=$(PREFIX) /lib; 制作;制作安装。

tslib编译命令行:

. /configure-host=$(HOST)-build=$(BUILD)--prefix=$(PREFIX)--cache-file=$(ARCH)-linux. 缓存 --sysconfdir=$(PREFIX}/etc --enable-static &&; make; make install.

Libmad编译命令行:

. /configure --host=$(HOST) --build=$(BUILD) --prefix=$(PREFIX); 制作; 进行安装

libid3tag编译命令行:

. /配置 --host=$(HOST) --build=$(BUILD) --prefix=$(PREFIX); 进行安装

madplay编译命令行:

. / 配置 --host=$(HOST) --build $(BUILD) --prefix=$(PREFIX); 制作; 进行安装

alsa编译命令行:

. / 配置 --host=$(HOST) --build=$(BUILD) --prefix=$(PREFIX) --disable-esd --disable-video-di-rectfb; 制作; 进行安装。

音频文件编译命令行:

. / 配置 --host=$(HOST) --build=$(BUILD) --prefix=$(PREFIX) --disable-esd --disable-video-di-rectfb; 制作; 进行安装。

esound编译命令行:

嵌入式游戏源码-基于嵌入式系统的游戏程序设计

. /configure --host=$(HOST)--build=$(BUILD)-prefix=$(PREFIX)--disable-esd--disable-video-di-rectfb; 制作; 进行安装。

SDL编译命令行:

. /configure--host=$(HOST)--build=$(BUILD)--prefix=$(PREFIX)--with-esd-exec-prefix=$(PREFIX)--disable-video-directfb; 制作; 进行安装。

sdl_image编译命令行:

. / 配置 --host=$(HOST) --build=$(BUILD) --prefix=$(PREFIX) --with-sdl-exec-prefix=$(PREFIX) --enable-sdhest; 制作; 进行安装。

sdl_tff编译命令行:

. / 配置 --host=$(HOST) --build=$(BUILD) --prefix=$(PREFIX) --with-freetype-exec-prefix=$(PREFIX); 制作; 进行安装。

sdl_draw编译命令行:

. /configure-host=$(HOST)--build=$(BUILD)prefix=$(PREFIX)--with-sdl-exec-prefix=$(PREFIX); 制作; make installsdl_mixer 编译命令行:

. / 配置 --host=$(HOST) --build=$(BUIUD) --prefix=$(PREFIX) --with-sdl-exec-prefix=$(PRE

使固定); 制作; 进行安装

sdl_mad编译命令行:

. / 配置 --host=$(HOST) --build $(BUILD) --prefix=$(PREFIX) --with-sdl-exec-prefix=$(PREFIX); 制作; 进行安装

至此,整个工具链已经制作、打包、备份。 该工具链不仅限于用于制作该工具的Linux操作系统,还可以在其他Linux环境中使用。

3 开发环境设置

嵌入式系统一般是资源受限的系统,直接在嵌入式系统的硬件平台上编译软件是很困难甚至不可能的。 一般的嵌入式软件开发方法是首先在通用计算机上编译程序,然后通过交叉编译生成可以在目标平台上运行的二进制代码格式,最后下载到目标上的特定位置平台来运行。

仅安装了Linux系统和开发工具,设计所需的开发环境尚未完成。 SDL只是一个图形函数库,向下提供图形函数套接字,调用系统图形引擎来绘制图形。 它支持许多图形引擎。 这里使用的是Linux内核自带的FrameBuffer,代码简单,非常适合嵌入式软件开发。

嵌入式游戏源码-基于嵌入式系统的游戏程序设计

如果在开发板上的Linux /dev/目录及其子目录下没有找到fb0或fb1或其他类似名称的设备,则很可能所使用的内核没有FrameBuffer驱动程序。 这时我们只能重新对内核进行排序,选择FrameBuffer支持和相关驱动,然后编译内核。

4 主要问题解决

对于嵌入式人机游戏来说,五子棋游戏需要解决三个问题:图形显示、人工智能算法、键盘风暴处理。

4.1 图形显示

图形显示问题包括如何设计友好的人机交互界面; 如何将光标棋子显示在正确的位置; 光标连接棋盘时如何去除光标在旧位置上的痕迹; 光标与棋子叠加时如何清除光标的痕迹; 下棋后如何处理图像; 如何从圆形图片中取出方形棋子; 如何显示汉字等

由于本开发板采用的LCD尺寸为640×480像素,所以所使用的背景图片、黑棋子、白棋子、光标都是按照这个尺寸设计的。 为了使界面更加友好嵌入式游戏源码,使用图像字体代替SDL_ttf中的字体。

棋盘和棋子采用3D效果。 黑白棋子和光标的图片大小相同,均为25×25像素,背景色的浊度空间为RGB(255,0,255),即粉色。 通过调用SDL函数库中的SDL_SetColorKey函数使用粉色作为滤镜颜色。 因此,当这种图片显示时,看不到粉红色的背景,看起来就像图片被剪切了一样。

将光标重写到新位置后,即使使用SDL_UpdateRect函数刷新整个屏幕,光标图像仍然存在于原始位置,直到程序退出。 解决这个问题的方法是,当要在某个位置显示光标时,先记录该位置与光标图片大小相同的区域,然后再显示光标。 连接光标后,将录制的画面拉回原来的位置,然后在绘制光标之前记录新的目标区域,如此重复。

用之前的方法解决光标重写还存在一些问题,即在游戏过程中光标离开这个位置时,用游戏之前录制的画面来重写这个位置。 结果,当光标离开时,这个位置的棋子突然消失了。 一个简单实用的方法是在选择棋局时在棋盘上画出棋子以及之前记录的区域的图片。 即使棋盘上的棋子这样被擦除,也可以从记录区域的图片中重新绘制出来。

4.2 博弈算法

对于一款国际象棋游戏来说,算法的智能性非常重要,但是高度智能的算法往往意味着消耗更多的CPU资源和更多的显存资源,而这两项对于嵌入式系统来说非常重要。 往往特别缺乏。

由于嵌入式硬件资源的限制,采用了更简单的算法。 用一个15×15的二维全局链表来记录比赛的情况,1表示人类下的一颗棋子; 2表示机器下的棋子,0表示空的棋子。 机器下棋时,使用linex、liney、line45、linel35 4个函数从水平、垂直、45°角、135°角4个方向搜索,遇到对方棋子时得分加10。 记录各个方向可下棋位置的得分,选择得分最高的位置下棋。

4.3 关键风暴处理

键盘风暴响应问题包括如何及时响应鼠标点击、如何获取通配符以及如何做出正确响应。 考虑到软件的可移植性,没有直接使用Linux系统的风暴处理函数来处理按键风暴,而是使用了SDL本身的按键响应风暴函数,代码简单明了。

5 双陆棋游戏设计与实现

main函数主要调用初始化函数InitGraph()和控制函数GameControl(),这两个函数都是全局函数,返回类型为void。 InitGraph()主要进行程序初始化和图像加载; GameControl() 是主要的游戏控制函数。

5.1 InitGraph()函数

InitGraph() 首先调用 SDL_Init(SDL_INIT_AUDI-O∣SDI_INIT_VIDEO) 初始化终端屏幕,然后使用 SDL_SetVideoMode(640, 480, 16, SDL_SWSUR-FACE) 将其设置为适当的模式。 其中“640,480”表示这是一块640×480像素的屏幕; 16代表颜色深度。

SDL使用SDI_Surface结构体来记录屏幕区域或图片,过程中使用的所有图片都使用这个结构体来访问。

SDL_CreateRGBSurface函数用于创建SDL_Surface实例,IMG_Load函数可以将图片加载到SDI_Surface中,然后使用SDL_SetColor-Key函数设置透明颜色,这里RGB(255,0,255)设置为透明色。 因此,显示画面中颜色为RGB(255,0,255)的区域变得透明。

SDL_BlitSurface函数用于将一个SDL_Surface的部分或全部绘制到另一个SDL_Surface上。 如果目标SDL_Surface是一个屏幕,则需要在屏幕上显示这个SDL_Surface。 当然,使用SDL_UpdateRect刷新这个区域就可以看到结果了。 因为经常需要显示和擦除图片,这样也比较麻烦。 另外,连接光标后,除了绘制光标外,还需要在绘制之前保存该区域的图片。 所以将SDL_BlitSurface包装成一个可以保存区域图片的绘图函数——ShowPicture。

5.2 GameControl()函数

GameControl()是程序的主控制模块。 SDL_Event是一个用于记录事件的数据结构,鼠标和键盘事件可以通过SDL_PollEvent(&event)获取。 确定事件结构体就可以得到想要的键盘值和键盘动作。

电脑游戏的位置主要是通过调用ComputerThink函数来获取的。 CornputerThink函数采用4.2节的下棋算法,调用linex、liney、Iine45、line135,从水平、垂直、45°、135°四个方向扫描5个棋子的范围。 例如扫描横线时,先从该点向左扫描,遇到对方下的棋子时得分加10; 当遇到自己下的棋子时,停止向这个方向扫描,然后向相反的方向扫描。 如果这条线上有空位可以下棋,记下它的横坐标x,纵坐标y和它的分数。 扫描完水平、垂直、45°、135°四线后,通过比较这些可以玩的点的分数,选择分数较高的点进行游戏。

5.3 ShowPicture()函数

ShowPicture函数主要用于显示图片。 该功能不仅可以实现将图片绘制到屏幕上的指定位置,还可以手动备份目标区域并更新屏幕。

5.4 运行结果

设置主机ARM-Linux-gcc的路径为/usr/local/arm/3.3.2/bin; sdl-config 的路径为 /usr/local/arm/3.3.2/ARM-Linux/bin。 交叉编译前,设置交叉编译工具的路径并进行交叉编译。

#PATH=/usr/local/arm/3.3.2/bin:/usr/local/arm/ARM-Linux/bin:$PATH

ARM-Linux-gccsdl-config--libs--cflags-ISDL_image Fivechess。 c-0 五象棋

下载到开发板的运行截图如图2所示。

6 尾声

嵌入式软件的开发有基本固定的流程,需要软硬件平台的配合。 设计过程中出现的问题可能是由于硬件设置不合理,或者软件代码设计不合理造成的。

在嵌入式软件开发过程中,工具链的制作起着非常重要的作用。 一个好的开发工具可以促进软件开发的速度,提高软件的质量。 相反,不仅可能会延长整个产品的开发时间,降低产品的质量,严重的话还会导致整个项目的失败。

基于嵌入式系统的五子棋程序采用标准C语言编译,其中使用的SDL图形库也是跨平台的图形库,因此整个程序的可移植性比较高。 游戏已经开发完毕,运行比较流畅,具有一定的实用价值。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 游戏源码 嵌入式游戏源码-基于嵌入式系统的游戏程序设计 https://www.wkzy.net/game/151996.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务