11k影院高嫁肉柳_ -|五角大楼├罗定房价
淘宝减肥药排行榜十强
只推淘宝安全有效的减肥药

当前位置:11k影院高嫁肉柳 > 减肥产品

11k影院高嫁肉柳

时间:2020-07-14 19:07  编辑:上思考驾照

11k影院高嫁肉柳

毕业设计

题目基于Android策略型游戏开发毕业设计系别计算机科学与工程系

专业计算机科学与技术

年级级

层次

学号

姓名

指导老师

2012年4月15日

教务处

毕业设计书原创性声明

本人郑重声明:所呈交的论文设计书是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以注明引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。本人完全意识到本声明的法律后果由本人承担。

毕业设计作者签名

2012年 4月 20 日

毕业设计书版权使用授权书

本毕业设计书作者完全了解学校有关保障、使用毕业设计书的规定,同意学校保留并向有关学位论文管理部门或机构送交设计书的复印件和电子版,允许论文被查阅和借阅。本人授权省级优秀学士学位设计书评选机构将本设计书全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。

本设计书属于:

保密□,在年解密后适用本授权书。

不保密□。

(请在以上相应的方框内打“√”)

作者签名(手写)年月日

指导教师签名(手写)年月日

目录Abstract: (5)

摘要: (1)

1.前言 (1)

1.1 手机游戏的现状 (2)

1.1.1 手机系统 (2)

1.1.2 手机游戏的种类 (3)

1.1.3 android手机的特性 (3)

1.2 对研究课题的启发 (4)

2. 需求分析与系统设计结构 (4)

2.1 Android架构 (4)

2.2 系统设计 (6)

2.2.1 功能模块划分 (6)

2.2.2 运行环境 (7)

2.2.3 控制引擎 (8)

2.3 游戏研究思路 (10)

2.4 游戏所涉及的各个类 (11)

2.4.1 前台表示模块的类结构 (11)

2.4.2 游戏实体模块的类结构 (12)

2.4.3 数据存取模块的类结构 (12)

2.4.4 游戏工具模块的类结构 (13)

3.游戏实现 (13)

3.1 游戏开始菜单页面设计 (13)

3.2 游戏主界面设计 (14)

3.3 数据存取模块的开发 (20)

3.4 英雄角色模块的开发 (23)

3.5 管理面板模块的开发 (26)

4.结束语 (29)

参考文献: (29)

致谢 (30)

Develop The Simulation Game of

Android 2.1

By

Liu Muxi

April, 2012

Abstract:With the rapid development of SciTech and culture in nowadays, people raise their requirements for video games. From the earliest ‘Snake’ and ‘Tetris’ to network games, the charm of video games swept over the world. Moreover, the emerging smart phone has offer a platform for the rapid growth of video games. These terminals provide better environment for developing mobile casual games and applications, especially iPhone and Android.

This article will research and develop a strategy game Dynasties in Flame, which is based on the Android system provided by Google. Adopting game design, map design, the development of Said layer interface module, data access Module and Map in case of an entity module, this game is a combination of great entertainment interface and logical content.

Firstly this article introduces the strategy game’s related basic theory, operation platform and implementation technique. Secondly, it mainly researches the technical feature of Case of an entity module and data access method, which brings higher efficiency on mass data integration and data assessment. Thirdly, it researches graphic component and audio component in order to enhance the visual and audio effects of the game. Lastly, it carries a performance test of different modules.

Keyword:Android; Simulation Game; Smartphone; Data access

Android2.1策略型游戏开发

刘沐曦

摘要:在科技文化高速发展的今天,人们对电子游戏娱乐的需求也日益高涨。从最初的运行于掌上游戏机的“贪吃蛇”和“俄罗斯方块”到如今风靡全世界的网游无不体现了游戏的魅力。而随着智能手机终端的涌现,更是为电子游戏提供了高速发展的平台。特别是iPhone智能手机和Android智能手机的面世,为掌上休闲游戏与应用提供了更完善的的开发环境。

本文基于Google公司为广大智能手机开发者提供的Android系统环境,研究并开发了一款名为“烽火三国”的策略型游戏。该游戏主要是综合使用游戏的策划,地图设计,表示层界面模块的开发,数据存取模块的开发,地图中可遇实体模块的开发,并将它们整合开发出一个具有良好娱乐界面和思维性的策略型游戏。

首先,论文介绍了实现策略游戏的相关理论基础、运行平台和实现技术;其次,论文重点研究了可遇实体模块的技术特点及游戏数据的存取,让本游戏的大量数据更易整合,提高数据的存取效率;再次,为了让游戏具有较强的视觉和听觉冲击,本论文研究并融入了图形图像组件和音效组件;最后,论文对游戏的各个模块进行了功能和性能测试。

关键词:android;策略游戏;智能手机;数据存取

1.前言

随着人们生活水平的提高,以及商品的多样化更新的加快,人们对游戏娱乐已经成为了生活中不可或缺的一部分。与此同时,人们的生活节奏也随着加快,这就直接影响了人们是否只能在电脑上玩游戏。再加上经济全球化和智能手机的普及,人们逐渐认识到手机游戏的方便,因而手机游戏成为了人们娱乐的另一种娱乐方式[1]。手机游戏带使人们在随时随地都能享受到它带来的乐趣,成为人们跨地域娱乐的重要渠道,因而逐渐的改变人们娱乐模式和消费观念,让手机游戏成为了当今的时尚[2]。

电脑游戏从八九十年代开始便在大家的记忆里扎根,二十年过去了,说起“贪吃蛇”和“超级玛丽”依然在脑海里根深蒂固。近来二十年,随着计算机硬件的性能不断的提升以及软件开发者的努力,游戏作品在创意和视听效觉都有飞跃的发展。目前电脑游戏行业非常繁荣,竞争激烈。随着智能手机的普及,越来越多的游戏开发人员逐渐把目光转移向这个新兴行业。

目前手机游戏应用开发方面以Android SDK、J2ME MIDP、Objective C为主流开发环境。Android SDK为开发者提供大量全面的API,包括SQLite数据库操作的API, 2D图形渲染的SurfaceView,3D图形图像框架OPENGL ES。论文在研究了Android SQLite、图形图像处理、AppWidget框架、多点触控接口、多线程等游戏相关技术的基础上融合中国古代三国历史文化实现的一款策略型游戏。

1.1 手机游戏的现状

无论是出于效仿,还是迫于竞争,多数的游戏运营商也加入了手机游戏的行列,使手机游戏极具竞争性。这样导致了个游戏研发商为了赢得最终的消费者,对手机游戏的优缺都进行了大优化。

1.1.1 手机系统

现在主流的智能手机操作系统主要有Google的Android系统,苹果公司的iOS系统以及微软的Windows Mobile系列。

Android系统是Google推出的基于Linux平台的开源手机操作系统,它采用软件叠层的架构,由三层组成。底层只提供基本功能,在Linux内核工作,由C 语言开发;中间层是由C++开发的Library和Virtual Machine;上层是由java 开发的各种应用软件,本次的设计Android游戏便是在上层开发的[3]。

iOS系统是苹果公司开发iPhone所用的操作系统,它是以Darwin为基础,主要用于苹果公司的平板产品。iOS的系统架构为四层组成,分别是核心服务处、核心操作系统层、可轻触层、媒体层。Windows Mobile 系列操作系统是从微软计算机的Windows操作系统演化而来的。

Windows Mobile系统是微软从windows操作系统演化而来的。使用Windows mobile系统的智能手机大多采用英特尔嵌入式处理器,主频比较高,再加上内存、储存卡容量也比采用其他操作系统的智能手机高出很多,所以性能比强劲,

速度比较快。

1.1.2 手机游戏的种类

手机游戏的种类基本和电脑游戏一样,目前在手机上开发出的较为成功的游戏主要有FTG格斗游戏、PUZ益智类游戏、RPG角色扮演游戏、SLG策略型游戏五类。其中格斗游戏诞生于街机,曾经风靡一时的“街头霸王”就是典型的代表。FTG系统的核心是对战斗部分进行碰撞检测计算。益智游戏需要玩家以自己的智慧对游戏的规则进行思考、判断从而通关以获得成就感[4]。PUZ系统对玩家要求不高,是手机游戏中受众面最广的游戏,代表作品是“推箱子”。角色扮演游戏是最能与用户共鸣的游戏,开启了一扇通往虚拟现实的大门,让玩家融入到游戏的世界里,沉浸在成长中,“仙剑奇侠传”是其经典例子。RPG游戏的核心是代表玩家角色成长的升级系统,一个个故事情节贯穿游戏,牵动着玩家的情感。策略型游戏没有固定的玩法,玩家根据自己的喜好排兵布阵,与敌方展开战斗。SLG游戏的核心是游戏的不定性,完全由玩家主观意识控制,其代表作是“三国志”。

手机游戏研发的重点是游戏的情节和UI。视觉是人的第一感知,UI的好坏直接影响人们对于游戏的第一印象,所以一个好的UI是非常重要的。游戏的情节是一个游戏可玩性的重点,是否有内涵、有深度,有未知的东西可玩,有否求追,还是无尽的刷刷刷,关系到一个游戏的寿命。韩国游戏就因为不重视情节,没有什么深度,所以被戏称为泡菜游戏。游戏的操纵方面也有革命性发展,从最初按键操纵到后来的屏幕多点触控再发展到现在的重力感应操纵。

随着手机游戏的高速发展,Google公司也越来越重视游戏的开发。在推出的Android2.3版本时增强了对游戏开发支持力度,同时提升了多媒体影音和通信功能。增加了新的垃圾回收和优化处理事件,以提高对游戏的支持能力。原生代码可直接存取输入和感应器事件、EGL/OpenGL ES、OpenSL ES、新的管理窗口和生命周期的框架。同时还强化了SQLite数据库管理功能,更加方便游戏数据的存取[5]。

1.1.3 android手机的特性

Android系统是一个处处体现与手机相关特性,应用于智能手机之上的操作系统。Android SDK2.2只要的特性有:

可重用和可替换组件的程序应用框架

针对移动设备优化过的dalvik虚拟机

继承了基于开源webkit引擎的网页浏览器

经过优化的自定义2D图形库和基于opensl ES 1.0库可选硬件加速

SQLite结构化的数据存储数据库

支持常规的音频视频多媒体格式

蓝牙、GPRS-EDGE、3G和wifi无线网络

相机、GPS全球定位、导航和感应加速器

丰富的开发环境包含设备模拟器、工具、调试器、内存和性能分析工具以及Eclipse继承开发环境插件

1.2 对研究课题的启发

论文研究了Andriod SDK开发环境以及该环境下的appwidget框架、SQLite 数据库、surfaceview 2D图形渲染技术等手机游戏开发相关技术。在本游戏软件中,首先运用android内嵌的SQLite数据库实现游戏数据的存取,为游戏的各个功能模块提供数据源。本论文重点研究了两种游戏数据的存取方式,第一种方式是android内置的sqlite数据库,用于存取大容量的永久性游戏数据,提供给游戏一个安全稳定的数据源;第二种方式是share preferences,是一个轻量级的数据存储,用于暂存游戏的中间数据。二者构成游戏的数据核心。其次通过appwidget框架的broadcast和service机制,将游戏界面映射至手机桌面,使用户更直接的体验游戏的精彩。

2. 需求分析与系统设计结构

这里要讲的是android的架构,系统的需求分析与系统设计结构,分析本游戏的可运行性以及详细的介绍了烽火三国系统的结构。

2.1 Android架构

Android平台大致可以划分成三个大层次,包括一个操作系统,中间件和应用程序,android是一组面向移动设备的软件包。

图2.1为android系统软件层架构图,android系统软件层由上往下分成应

用程序(applications )、应用框架(application frameworks )、库函数(libraries )、运行时库(android runtime )、操作系统(linux kernel ):

应用Applications

通讯录

拨号软件

浏览器

播放器

其他应用

应用框架 Application Frameworks

活动管理器

窗口管理器

资源管理器

通告管理器

内容提供器

位置管理器传感器管理器

界面系统

XMPP 服务

其他相关服务与管理

库Libraries

界面理器流媒体处理框架

SQLlite

OpenGL/ES

SGL

WebKit SSL 其他库

Android 运行时

Dalvik 虚拟机

核心库

Linux Kernel (Linux 内核)

硬件驱动

电源管理

内核

图2.1 android 软件层架构图

1.应用程序

Android 将同一系列核心应用程序包一起发布,基本上都是通过JAVA 语言开发的能够独立完成特别功能的应用程序。该应用程序包包括SMS 短消息程序,日历,电子地图,浏览器,联系人等基本的应用程序。

应用程序的框架组件主要包括9种: UI 组件,如按钮、文本框、标签、列表等,如果想方便高效的创建友好的用户交互界面就必须要灵活的运用这些组件; Content Providers 内容提供者,可以简单的理解成为应用程序提供的一种服务,让服务与应用程序之间能够实现数据的共享与相互访问; Resource Manager 资源管理,android 中大量的资源很多例如颜色、字体、图片、UI 组件的Id 、用户界面(Layout xml )等等都被称之为资源,这些丰富的资源,都需要通过Resource Manager 来统一进行管理; Notification Manager 消息通知

管理,它可以在不影响用户使用设备喝正常操作的时候在系统的状态栏上自动的提供消息提示,让用户可以及时的看到; Activity Manager活动管理,它管理着所有应用程序的生命周期,并且控制着应用程序的导航,充当一个控制器的角色。每个Activity相当于Windows应用中的一个窗口。通常的应用一般都是通过多个Activity交互的构成; Window Manager窗口管理,所有启动的窗口都被其管理; Location Manager地理位置管理是Google为开发者提供的独具特色的功能,用其管理地图相关的服务; Telephoney Manager电话管理,为应用程序提供与电话相关的诸如来电监听之功能; Package Manager包管理,实现软件包的安装并管理安装在系统之内的所有应用程序。

2.应用框架

开发人员也可以在自己开发的项目中直接访问应用程序所使用的API框架。该应用程序的架构设计简化了组件的重用;在遵循框架安全性限制的原则下,任何一个应用程序都可以发布它的功能块给任何其它的应用程序使用。同样,该应用程序重用机制也使用户可以重构来突破原先组件的功能限制。

3.库函数/运行时库

该层内容大部分已经涉及到底层,普通的应用不需直接对此层进行操作。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。Dalvik VM是android平台下的一个虚拟机。Dalvik虚拟机执行(.dex)的Dalvik可执行文件,该格式文件针对小内存使用做了优化。同时虚拟机是基于寄存器的,所有的类都经由JAVA编译器编译,然后通过SDK中的“dx”工具转化成“.dex”格式由虚拟机执行[6]。

4.Linux 内核

Android 的核心系统服务是在Linux 2.6 内核的基础上开发出来的,包括安全性,内存管理,进程管理,网络协议栈和驱动模型[7]。驱动程序模型包含触摸屏驱动、摄像头驱动、WiFi驱动、闪存驱动、音频驱动、按键驱动、电源管理驱动、IPC驱动共八个重要驱动。

2.2 系统设计

2.2.1 功能模块划分

该策略型游戏应该具备有视图面板、管理面板、游戏提示、可遇实体、英雄角色、地图加载、存档与读档、公式计算、常量管理等功能。根据游戏系统功能

的需求分析,可以将系统的功能划分为4个模块。

◆ 前台表示模块

该模块用于游戏的画面渲染,包括视图界面、管理面板、游戏提示,面向所有的玩家,是玩家直接操作的页面。

◆ 游戏实体模块

该模块是游戏主要用于后台游戏逻辑,包括可遇实体模块、英雄角色模块,可遇实体模块是地图上那些可以被英雄遇到并假发一系列动作的实体,由于每个玩家的玩法不同导致成长不同,所获取的页面也会不同。

◆ 数据存取模块

该模块用于获取源文件信息和玩家游戏数据,包括地图加载模块和游戏的存档与读档模块。地图加载主要是将从地图设计器中所获取的地图信息文件加载到游戏中生成地图矩阵的过程。存档与读档用于玩家对游戏的连续性。

◆ 工具类模块

该模块将自身的静态类提供给游戏中的其他类使用。本游戏中的工具类包括对常量进行统一管理的constantUtil 和用于存储公式的gameformula 类,游戏的公式主要是对战斗的结果、英雄体力增减等计算。

根据本系统的功能模块介绍,本游戏的系统功能模块图如图2.2所示。

图2.2 烽火三国系统功能模块图

2.2.2 运行环境

烽火

三国

前台表示模块 数据存取模块 工具类模块

视图界面

游戏实体模块 游戏提示

管理面板

可遇实体模块

英雄角色模块

地图加载

存档与读取

公式计算模块

常量管理模块

操作系统:Android2.1

要求手机有足够大容量的内存。

2.2.3 控制引擎

Activit是Android构造块中最基本的也是必须的一种,所有程序的流程都必须运行于Activity中。在游戏程序中,各个Activity是层级的关系,一个Activity通常就是一个单独的屏幕。每一个Activity都被实现为一个独立的类,并且继承于Activity这个基类。这个Activity类将会显示由几个Views 组件组成的用户接口,并对事件做出响应。Activity是Android用户唯一可以看见的东西,几乎所有的Activity都与用户进行交互,它最主要的作用是创建显示窗口,在程序中可以通过setContentView(View)来显示在Res/Layout中自定义的UI界面,并可提取UI元素进行操作[8]。

一个游戏由若干屏幕页面组成,所以便有多个Activity。Activity之间的可以相互切换,并通过Intent来实现通信。Android系统是通过Activity栈来管理Activity的,在游戏的运行过程不同的Activity会经历不同的生命周期。Activity的生命周期中本质上分为四种状态即:

(1)activity在屏幕的前景中则处于activity栈的顶端,它是active或者running状态。

(2)activity失去了焦点但是仍然可见,如这个activity顶上遮挡了一个透明的或者非全屏的activity,它的状态则是paused。一个paused状态的activity完全是alive的。它维护自己所有的状态和成员信息,而且仍然在window manager的管理中,但当系统内存极度贫乏时也会将其killed[9]。

(3)activity由于其他的activity而完全变暗,它就进入了stopped状态。它仍然保持着所有的状态和成员的信息,可是,他对于用户来说不可见,当别的地方需要内存的时候它经常会被killed。

(4)activity是paused或者stopped,系统需要将其清理出内存的时可以命令其finish或者简单kill其进程。当它重新在用户面前显示的时候,它必须完全重新启动并且将其关闭之前的状态全部恢复回来。

游戏在操作过程中可能会发生界面切换,遇到接电话、收发短信甚至电量不足关机等偶发情况都会影响Activity的状态。Android系统对资源控制较严,在状态的转换时可能对资源回收,为了保证程序的正确性,必须在onPause()里写上持久层操作的代码,将游戏产生的数据都保存到存数据库中。游戏运行中生

命周期的变化而带来的其他问题也很多,例如游戏创建的线程在运行中被中断了,则可以暂停、杀掉或数据回滚来维护此线程。因为Activity可能被杀掉,所以线程中使用的变量和一些界面元素就需要采用Android的消息机制Handler 或Message来处理多线程和界面交互的问题。

Intent是Android系统中用于通信和交互的一种机制,不但可以实现不同应用间的通信与交互还可以在应用程序内部的不同Activity以及Service间实现交互。在通信过程Intent起了一个媒介的作用,提供组件互相调用的相关信息,为调用者与被调用者解耦。在不同应用程序交互时,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent 的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。在本宠物游戏中不同Activity就是通过Intent来交换数据的[10]。

游戏中Activity的相互调用的动作需要在AndroidManiFest.xml的Intent Filter中进行描述,当发生调用关系时,Android会解析对应的Intent来决定如何来调用Activity,需要解析Intent属性包括以下六类:

(1)Action,指定要执行的动作。可以是自己定义的动作也可以是系统预定义的动作。宠物游戏中指定的通常是自定义的动作以完成特定功能,如掉调用输入屏幕为游戏提供用户数据。系统预定义的动作通常是与手机使用紧密相关的动作,例如发送短信的动作ACTION_CALL。

(2)Data,指定动作要操作的数据,通常用URI来表示,例如联系人的URI 为content://contacts/1。

(3)type,显式指定Intent的数据类型。

(4)category,动作的类别,例如LAUNCHER_CATEGORY 表示此动作为顶级应用,在应用软件启动后便执行,相当于MAIN函数。

(5)component,指定Intent的的目标组件的类名称。

(6)extras,指定动作的附加信息集合。需要传递的数据都可以保存到extras中来实现数据通信。

相应动作在Intent Filter中配置好后就可以在Activity中实例化,如果需要传递参数则需要绑定Bundle来附加需要传递的数据,最后使用startActivity(myIntent)来启动动作。

Service是一种没有用户界面的后台程序,通常为前台Activity服务。它在Activity中由Content.startService()启动,也可以使用

Content.bindService连接到另一个Service,之后可以通过Service提供的接口进行通信。当一个Service启动之后其他组件可以绑定到此Service,并通过远程调用来调用它定义的方法。在宠物游戏中定义了一个为AppWidget服务的Service和一个实现游戏版本升级的Service。由于Service运行于主进程中的,为减少对主线程或UI操作的阻塞,通常在Service中另启动一个新线程来完成特定操作。Service的生命周期不一定与前台Activity同步,可以使用stopService()方法来结束Service从而回收线程占用的资源

在策略游戏中要实现角色动画以及游戏声效,必须要采用多线程技术来与游戏同步,另外为AppWidget提供动画的Service也需要后台线程来支持。在Android虚拟机中每个线程的资源都有一定的限制,游戏在渲染角色动画时会消耗大量的系统资源,有时会出现内存溢出的状况,为减少线程阻塞的情况发生可以采取多线程渲染的方式。

游戏在运行后会进入主屏幕的Activity,这时会启动一个主线程,这个线程主要负责与UI相关的工作,通常又称为UI线程。之后主线程根据需要实例化渲染线程、声效线程以及其他服务线程并用Run()方法启动。当这些线程需要与其他线程或主线程通信同步时可以通过Android提供的Handle和Looper来进行数据以及参数传递。

Android的线程分为有消息循环的线程和没有消息循环的线程。有消息循环的线程一般都会有一个Looper,主线程就是一个消息循环的线程。针对这种消息循环的机制引入了一个新的机制Handler。如果有消息循环,就要往消息循环里面发送相应的消息,自定义消息一般都会有自己对应的处理,消息的发送和清除,把这些都封装在Handler里面。Handler只是针对那些有Looper的线程,不管是UI线程还是子线程,只要有Looper,就可以往消息队列里面添加东西,并做相应的处理。但是关于UI相关的东西,就不能放在子线程中,因为子线程是不能操作UI的,只能进行数据、系统等其他非UI的操作。一个Handler的创建它就会被绑定到这个线程的消息队列中,如果是在主线程创建的,那就不需要写代码来创建消息队列了,默认的消息队列会在主线程被创建。但是如果是在子线程的话,就必须在创建Handler之前先初始化线程的消息队列。

2.3 游戏研究思路

本游戏的故事背景定在三国时期,游戏中的人名、城池名、对话等都根据三国时期的历史背景来确定。玩家的目标是控制英雄在三国乱世中并起中通过不断

扩张自己的势力最终统一汉室。

本游戏的地图界面采用图元技术,由于本游戏中的地图元素不仅仅只有通过与否那么简单,因此开发该游戏时必须使用地图设计器,否则在设计地图及地图元素时很难进行。

本游戏采用的游戏时间为正90°2.5D俯视视角。同时由于地图的尺寸超过了手机屏幕的尺寸,还需要在游戏中实现滚屏功能。

2.4 游戏所涉及的各个类

游戏中各个类的应用的好坏将直接影响到游戏的可玩性和实现的效果。本节将对实现了游戏各个功能模块的具体类进行简单的说明。

2.4.1 前台表示模块的类结构

图2.3 前台表示模块的类结构

✧AboutView、MenuView和GameView等一系列继承自SurfaceView的视图是组

成游戏视图界面的主要部分

✧GameAlert是继承自Object的自定义类,其子类组成了游戏提示模块

2.4.2游戏实体模块的类结构

图2.4 游戏实体模块的类结构

✧MyDrawable对象是绘制地图的图元,其抽象类MyMeetableDrawable类

实现对象在与英雄相遇,在相遇之后可以触发特定的操作。

✧Hero对象是游戏中另一个重要的实体对象,其封装了英雄的属性

2.4.3 数据存取模块的类结构

图2.5 游戏存取模块的类结构

✧GameData负责加载并生成下层平铺层的地图。

✧GameData2负责加载并生成上层平铺层的地图,地图中的可遇实体对象

位于上层平铺层。

✧SerializableGame实现存储游戏状态和加载已存储的游戏。

2.4.4 游戏工具模块的类结构

图2.6 游戏工具模块的类结构

工具类模块比较简单,主要是对游戏中用到的常量进行统一管理。

3.游戏实现

从游戏功能模块可以知道,本游戏的模块可以分为一下几个部分。

数据存取模块

英雄角色模块

表示层界面模块

管理面板模块

地图中可遇实体模块

英雄技能模块

游戏提示模块

下面对烽火三国的一些关键部分的模块给予介绍。

3.1 游戏开始菜单页面设计

菜单页面是玩家打开游戏后所见到的第一个页面,其中提供了初入江湖、风云再起、音效设置、江湖指引、群英荟萃、封剑归隐等选项。设计的页面如图3.1所示。

图3.1 烽火三国开始菜单页面

3.2 游戏主界面设计

当玩家开始游戏后,进入游戏的主界面。玩家可以通过自己的玩法来扩张自己的领地,招募更多的武将。主UI的设计如图3.2所示。

图3.2 烽火三国主UI

主UI各个功能代码实现如程序清单。

ackage wyf.ytl;

import android.app.Activity;

import android.os.Bundle;

import android.os.Handler;

import android.os.Looper;

import android.os.Message;

import android.view.KeyEvent;

import android.view.View;

import android.view.Window;

import android.view.WindowManager;

public class HDZGActivity extends Activity {

LoadingView loadingView;//进度条界面的引用

MenuView menuView;//开始游戏的主菜单界面

GameView gameView;//游戏主界面

HelpView helpView;//帮助界面

SoundView soundView;//刚开始时选择是否开启声音的界面

SoundManageView soundManageView;//声音设置界面

ScreenRollView screenRoll;//竹简滚屏界面

AboutView aboutView;//关于界面

boolean isBackSound = true;//是否有背景声音

boolean isStartSound = true;//开场声音

boolean isBattleSound = true;//战斗声音

boolean isEnvironmentSound = true;//环境音

View currentView = null;//当前的View

Handler myHandler = new Handler(){//用来更新UI线程中的控件

public void handleMessage(Message msg) {

switch(msg.what){

case 1://收到LoadingView的消息,切到MenuView

if(loadingView != null){

loadingView = null;//释放LoadingView

}

toMenuView();//切换到开始游戏时的主菜单

break;

case 2://收到MenuView的消息,切换到ScreenRoll竹简滚屏

if(loadingView != null){

loadingView = null;

}

if(menuView != null){//释放

menuView = null;

}

screenRoll = new ScreenRollView(HDZGActivity.this);

setContentView(screenRoll);

break;

case 3://收到LoadingView的消息,切到GameView

if(loadingView != null){

loadingView = null;//释放LoadingView

}

toGameView();//切换到游戏的主界面

break;

case 4://收到MenuView界面的消息,切换到HelpView

helpView = new HelpView(HDZGActivity.this,5);

HDZGActivity.this.currentView = helpView;//设置当前的View为HelpView

HDZGActivity.this.setContentView(helpView);

break;

case 5:

menuView = new MenuView(HDZGActivity.this);

toMenuView();

break;

case 6:

toGameView();//切换到游戏的主界面

break;

case 7://开始时的声音选择界面传来的消息

toLoadingView(1);

new Thread(){//后台启动加载需要加载的View

public void run(){

Looper.prepare();

menuView = new MenuView(HDZGActivity.this);//初始化MenuView

}

}.start();

break;

case 8:

helpView = new HelpView(HDZGActivity.this,6);

HDZGActivity.this.currentView = helpView;//设置当前的View为HelpView

HDZGActivity.this.setContentView(helpView);

break;

case 9:

soundManageView = new SoundManageView(HDZGActivity.this,5);

HDZGActivity.this.currentView = soundManageView;

HDZGActivity.this.setContentView(soundManageView);

break;

case 10:

soundManageView = new SoundManageView(HDZGActivity.this,6);

HDZGActivity.this.currentView = soundManageView;

HDZGActivity.this.setContentView(soundManageView);

break;

case 11:

if(loadingView != null){

loadingView = null;

}

if(screenRoll != null){//释放

screenRoll = null;

}

toLoadingView(3);

new Thread(){

public void run(){

Looper.prepare();

gameView = new GameView(HDZGActivity.this);//初始化GameView

}

}.start();

break;

case 12://从AboutView传来的消息,需要到MenuView

menuView = new MenuView(HDZGActivity.this);

HDZGActivity.this.setContentView(menuView);

HDZGActivity.this.currentView = menuView;

break;

case 13://从MenuView传来的消息,要到AboutView

if(aboutView == null){

aboutView = new AboutView(HDZGActivity.this);

}

HDZGActivity.this.setContentView(aboutView);

HDZGActivity.this.currentView = aboutView;

break;

case 14://从GameView传来的消息,要到MenuView

menuView = new MenuView(HDZGActivity.this);

HDZGActivity.this.setContentView(menuView);

HDZGActivity.this.currentView = menuView;

break;

case 99:

if(loadingView != null){

loadingView = null;

}

currentView = null;

if(SerializableGame.check(HDZGActivity.this)){

toLoadingView(101);

new Thread(){

public void run(){

try{

Thread.sleep(2000);

}

catch(Exception e){

e.printStackTrace();

}

Looper.prepare();

if(gameView==null)

{

gameView = new GameView(HDZGActivity.this);

}

SerializableGame.loadingGameStatus(gameView);

}

}.start();

}

break;

case 100:

if(gameView != null){

HDZGActivity.this.setContentView(gameView);

}

break;

}

}

};

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

//全屏

requestWindowFeature(Window.FEATURE_NO_TITLE);

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN ,

WindowManager.LayoutParams.FLAG_FULLSCREEN);

soundView = new SoundView(this);

this.setContentView(soundView);//先切到简单的声音开关界面

GameData.resources=this.getResources();

GameData.initMapImage();

GameData.initMapData();

GameData2.resources=this.getResources();

GameData2.initBitmap();

GameData2.initMapData();

GameView.initBitmap(this.getResources());

BattleField.initBitmap(this.getResources());

ManPanelView.initBitmap(this.getResources());

WuJiangView.initBitmap(this.getResources());

UseSkillView.initBitmap(this.getResources());

CityManageView.initBitmap(this.getResources());

SelectGeneral.initBitmap(this.getResources());

TianXiaView.initBitmap(this.getResources());

}

public void toLoadingView(int toViewID){

loadingView = new LoadingView(this,toViewID);//初始化进度条

this.currentView = loadingView;

this.setContentView(loadingView);//切换到进度条View }

//切换到开始游戏的主菜单

public void toMenuView(){

if(this.menuView != null){//当menuView不为空时切屏

this.currentView = menuView;

this.setContentView(menuView);

}

else{//当为空时打印并退出

System.exit(0);

}

}

//切换到游戏主界面

public void toGameView(){

if(this.gameView != null){//当gameView不为空时

this.currentView = gameView;

this.setContentView(gameView);

}

else{//当为空时打印并退出

System.exit(0);

}

}

public boolean onKeyDown(int keyCode, KeyEvent event) {

if(currentView != null){

currentView.onKeyDown(keyCode, event);

}

return super.onKeyDown(keyCode, event);

}

}

3.3 数据存取模块的开发

该模块主要负责对游戏数据的存储和读取,包括依稀存档的恢复和地图文件

的加载。

CityInfo类封装了城池的静态信息,包括了城池名称、所属势力、兵力、粮草、武将列表等,其代码如下

图3.3 城池属性图

package wyf.ytl;

import java.util.ArrayList;

import static wyf.ytl.ConstantUtil.*;

public class CityInfo {

String cityName;//城池名称

int country;//所属势力

int army;//兵力

int food;//粮草

int level;//等级

int baseAttack = 20;//每个士兵的基础攻击力

int baseDefend = 15;//每个士兵的基础防御力

int citizen;//居民

int warTank = 0;//战车的个数,用于增加攻城力

int warTower = 0;//箭垛的个数用于增加防御力

final int info;

ArrayList<General> guardGeneral = new ArrayList<General>();//武将列表

public CityInfo(String cityName, int country, int army, int food,

int level, int baseAttack, int baseDefend, int citizen,

int warTank, int warTower, General guardGeneral,int info) {//构造器

this.cityName = cityName;

this.country = country;

this.army = army;

this.food = food;

this.level = level;

this.baseAttack = baseAttack;

this.baseDefend = baseDefend;

this.citizen = citizen;

this.warTank = warTank;

this.warTower = warTower;

this.guardGeneral.add(guardGeneral);

this.info = info;

}

public void setBackToInit(){//恢复到默认

for(int i=0; i<CITY_INFO.size(); i++){

CityInfo ci = CITY_INFO.get(i);

if(ci.info == this.info){

this.cityName = ci.cityName;

this.country = ci.country;

this.army = ci.army;

this.food = ci.food;

this.level = ci.level;

this.baseAttack = ci.baseAttack;

this.baseDefend = ci.baseDefend;

this.citizen = ci.citizen;

this.warTank = ci.warTank;

this.warTower = ci.warTower;

this.guardGeneral = ci.guardGeneral;

break;

}

}

}

}

3.4 英雄角色模块的开发

Hero类是游戏实体部分的主要类。首先对Hero类成员变量作出声明,成员变量主要用于记录游戏的状态,比如当前金钱、兵力等。

HeroGoTherad为Hero的附属线程,主要包括英雄的移动和检测可遇实体的碰撞。

图3.4 武将属性图

initHeroSkills();

}

private static final long serialVersionUID = -5433306195939766058L;

GameView father;//Activity引用

private String name = "吕小布";

int strength = 100;//英雄体力,

int maxStrength = 100;//体力上限,会随着等级增加

int level = 1;//英雄等级

int direction = -1;//英雄的移动方向,4:下,5:左,6:右,7:上。同时也代表当前英雄的动画段号,从零开始

int currentFrame = 0;//当前英雄的动画段的当前动画帧,从零开始

int food = 10000;//随身携带的粮草,不包括每个城池中的粮食

int totalMoney=6000;//总金钱

int armyWithMe = 6000;//跟随自己的军队

int totalArmy;//总军队,包括跟随自己的和守城在家的

int col;//英雄的定位点在大地图中的列,定位点为下面的格子的中心

int row;//英雄的定位点在大地图中的行,定位点为下面的格子的中心

int x;//英雄『中心点』的x坐标,用于绘制

int y;//英雄『中心点』的y坐标,用于绘制

int width;//英雄的宽度=======在initAnimationSegment方法中初始化

int height;//英雄的高度=======在initAnimationSegment方法中初始化

int title = 0;//官衔

int warTank = 0;//随身携带的战车

int warTower = 0;//随身携带的箭垛

int strengthGrowSpan = 1;

int basicAttack = 18;//基础攻击力

int basicDefend = 18;//基础防御力

计算英雄移动的位置代码

int moves = TILE_SIZE/HERO_MOVING_SPAN;//求出这个格子需要几个小步来完成

int hCol = hero.col;//英雄当前在大地图中的列

int hRow = hero.row;//英雄当前在大地图中的行

int destCol=hCol;//目标格子列数

int destRow=hRow;//目标格子行数

//先求出目的点的格子行和列,之所以模4是因为动态向上和静止朝上正好差4

switch(hero.direction%4){

case 0://向下

destRow = hRow+1;

hero.setAnimationDirection(DOWN);//将英雄的方向和动画段设置为动态向下

break;

case 1://向左

destCol = hCol-1;

hero.setAnimationDirection(LEFT);//将英雄的方向和动画

段设置为动态向左

break;

case 2://向右

destCol = hCol+1;

hero.setAnimationDirection(RIGHT);//将英雄的方向和动画段设置为动态向右

break;

case 3://向上

destRow = hRow-1;

hero.setAnimationDirection(UP);//将英雄的方向和动画段设置为动态向上

break;

}

int destX=destCol*TILE_SIZE+TILE_SIZE/2+1;//目的点x坐标,已经转换成中心的了

int destY=destRow*TILE_SIZE+TILE_SIZE/2+1;//目的点y坐标,已经转换成中心点的了

int hx = hero.x;

int hy = hero.y;

//从下面开始无级从一个格子走到另一个格子

for(int j=0;j<moves;j++){

try{//先睡一下

Thread.sleep(HERO_MOVING_SLEEP_SPAN);

}

catch(Exception e){

e.printStackTrace();

}

//计算英雄的x位移

if(hx<destX){

hero.x = hx+j*HERO_MOVING_SPAN;

hero.col = hero.x/TILE_SIZE;//及时更新英雄的行列值

checkIfRollScreen(hero.direction);

}

else if(hx>destX){

hero.x = hx-j*HERO_MOVING_SPAN;

hero.col = hero.x/TILE_SIZE;//及时更新英雄的行列值

checkIfRollScreen(hero.direction);

}

//计算英雄的y位移

if(hy<destY){

hero.y = hy+j*HERO_MOVING_SPAN;

hero.row = hero.y/TILE_SIZE;//及时更新英雄的行列值

checkIfRollScreen(hero.direction);

}

else if(hy>destY){

hero.y = hy-j*HERO_MOVING_SPAN;

hero.row = hero.y/TILE_SIZE;//及时更新英雄的行列值

checkIfRollScreen(hero.direction);

}

}

//修正x和y坐标,修改英雄的占位格子

hero.x = destX;

hero.y = destY;

3.5 管理面板模块的开发

管理面板模块主要负责查询游戏的相关信息,包括城池、粮草、武将信息。

点击主UI的人可查看人物属性面板

图3.5 人物属性图

package wyf.ytl;

import java.util.HashMap;

import java.util.Set;

import android.content.res.Resources;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.Paint;

import android.view.MotionEvent;

public class ManPanelView{

GameView gameView;

int yeSpan = 11;//每页显示的个数

int yeSpan2 = 10;//每页显示的个数

int currentI = 0;//当前绘制的屏幕最上边的元素下标

int selectI = 0;

int startY = 120;

int startX = 25;

int status = 0;//显示的标记位,0-属性列表 1-技能列表

String[][] items1;//需要列出的属性

String[][] items2;//需要列出的技能

static Bitmap threeBitmap;//右上角的三个按钮

static Bitmap panel_back;//背景图

static Bitmap selectBackground;//选中后的背景

static Bitmap buttonBackGround;//按钮背景

static Bitmap upBitmap;//向上的小箭头

static Bitmap downBitmap;//向下的小箭头

static Bitmap menuTitle;//表格的标题背景

static Bitmap logo;

Paint paint;

public ManPanelView(GameView gameView) {

this.gameView = gameView;

paint = new Paint();

paint.setARGB(255, 42, 48, 103);//设置字体颜色

paint.setAntiAlias(true);//抗锯齿

initData();//初始化数据

}

public static void initBitmap(Resources r){//初始化图片资源

Bitmap menu_item = BitmapFactory.decodeResource(r, R.drawable.buttons);

threeBitmap = Bitmap.createBitmap(menu_item, 60, 0, 90, 30);

buttonBackGround = Bitmap.createBitmap(menu_item, 0, 0, 60, 30);

upBitmap = Bitmap.createBitmap(menu_item, 210, 15, 15, 15);

downBitmap = Bitmap.createBitmap(menu_item, 210, 0, 15, 15);

menu_item = null;//释放掉大图

panel_back = BitmapFactory.decodeResource(r, R.drawable.panel_back);

logo = BitmapFactory.decodeResource(r, R.drawable.logo);

selectBackground = BitmapFactory.decodeResource(r,

R.drawable.select_back);

menuTitle = BitmapFactory.decodeResource(r, R.drawable.menu_title);//标题背景

}

public void initData(){//初始化数据

//初始化人物属性

this.items1 = new String[][]

{

{"名称:", gameView.hero.getName()},

{"等级:", gameView.hero.getLevel()+" 级"},

{"官衔:", gameView.hero.getTitle()},

{"将军:", gameView.hero.getGeneralNumber()+" 个"},

{"城池:", gameView.hero.getCityList().size()+" 个"},

{"黄金:", gameView.hero.getTotalMoney()+" 金"},

{"粮草:", gameView.hero.getTotalFood()+" 石"},

{"兵力:", gameView.hero.getTotalArmy()+""},

{"总人口:", gameView.hero.getTotalCitizen()+" 人"},

{"投石车:", gameView.hero.getTotalWarTank()+" 个"},

{"箭垛:", gameView.hero.getTotalWarTower()+" 个"},

};

//初始化技能

HashMap<Integer,Skill> heroSkill = gameView.hero.getHeroSkill();//得到英雄的所有技能

items2 = new String[heroSkill.size()][3];

Set<Integer> s = heroSkill.keySet();

int k = 0;

for(Integer i : s){

Skill skill = heroSkill.get(i);

items2[k][0] = skill.getName();

items2[k][1] = skill.getProficiencyLevel()+"";

items2[k][2] = skill.getStrengthCost()+"";

k++;

}

}

4.结束语

经过了几个月对游戏的分析、设计与编写代码,我认为该android策略型游戏“烽火三国”的大部分模块和功能已经可以简单实现了。但是,一个完整的游戏并不仅仅靠这几个月的分析、设计可以实现的,它需要更加多的时间来完善。因此,本游戏仍然存在着一些需要改进和不足的问题。比如游戏界面的美化,游戏的适应性,还有游戏内容的丰富和多样化。随着研究的进行,也许还会出现其他的问题,我会继续努力逐步改善和完善本游戏。

参考文献:

[1]GONG Lei,ZHOU Cong.Development and Research of Mobile Termination Application Based on Android[J]. Computer And Modernization. 2008-08

[2]Shane Conder.Android Wireless Application Development[M]. Addison-Wesley.2010

[3]Enck,W., Ongtang,M.,McDaniel,P. Understanding Android Security[J]. Security & Privacy, IEEE.2009-07(1),P50-57

[4]Sandeep Kumar. Location Based Services using Android[C]. Internet Multimedia Services Architecture and Applications (IMSAA), 2009 IEEE International Conference. P1-5

[5] 王向辉. Android 应用程序开发[M].清华大学出版社,2010-03

[6] 李维勇.Android任务驱动式教程[M] .北京航空航天大学出版社2011-09

[7] 吴亚锋,Android 2.0游戏开发实战宝典[M].人民邮电出版社,2010 -07.

[8] 杨丰盛.Android应用开发揭秘作者[M], 机械工业出版社. 2011-05

[9] 张运芳.Android 创赢路线与产品开发实战[M]. 北京:电子工业出版社, 2010

[10]刘昌平,范明钰. Android手机的轻量级访问控制[J].计算机应用研究,2010-07

致谢

本学位论文是在老师的热诚关心和悉心指导下完成的,梁老师从我的研究方向、论文题目的确定、游戏软件的实现及软件的完善过程中都给予了我细致全面的指导,对论文结构及内容都提出了很多宝贵的建议,并和我作了无数次的讨论让我受益良多。梁老师对学术研究的严谨态度,对学生的关怀备至,以及渊博的知识水平,使我受益良多,为此我对梁老师的教导表示由衷的感谢。

在论文完成之际,大学的生活也将结束,我要感谢在大学期间的所有老师,在老师的悉心教导之下,我受益匪浅。为此也向他们致以最崇高的敬意和最真诚的感谢。

。

猜你喜欢

最安全有效的减肥药

最安全有效的减肥药

编辑:小徐

现在的减肥药真的是真假难分,在选择减肥药的同时也应该更加小心,减肥药多种多样,那么如何才能选择最安全有效的减肥药,也成了很多小仙女的内心疑问,下面就跟着11k影院高嫁肉柳小编一起看一下,如何选择最安全有效的减肥药。 最安全有效的减肥药选购方法 1、首先需要观察产品的外包装,在包装中可以看到其配方是不是含有激素,含有激素的减肥药对身体的内..

吃减肥药失眠

吃减肥药失眠

编辑:小徐

随着现在流行以瘦为美,很多人会不顾身体的健康选择减肥药,达到快速减肥瘦身的效果,但是很多减肥药都是有副作用的,副作用比较轻的就是失眠现象,那么吃减肥药出现失眠是怎么回事儿?如果出现失眠后,我们应该怎样缓解? 吃减肥药失眠是怎么回事 减肥药中富含安非他命,所以减肥药服用了太多会有失眠现象,服用减肥药期间,身体会逐渐出现抗药性,身..

最新文章