当前位置:文档之家› J2ME游戏程序开发实例详解

J2ME游戏程序开发实例详解

J2ME游戏程序开发实例详解
J2ME游戏程序开发实例详解

J2ME游戏程序开发实例详解

一、序言

这里我们先定义项目组的人员体制(其实只有我一个人):技术调研、需求分析、概要设计、详细设计、编码、测试均有笔者一人担任;美工这里我找了个捷径,盗用网上现成的图片,然后用ACDSee把它由BMP转换成PNG格式(我出于讲座的目的,未做商业应用,应该不算侵权吧);至于发布工作,由于缺少 OTA服务器,此项工作不做(但是我会介绍这步如何做)。

接下来,我们规划一下项目实现的时间表,以我个人经验,设想如下:技术调研用2天(这部分解决项目的可行性和重大技术问题,时间会长一些),需求分析用半天(毕竟有现成的东东可以参照,只要理清思路就行了,况且还有很多以前用过的设计模式和写好的代码),概要设计再用半天(有了需求,概要只不够是照方抓药),详细设计要用2天(这一步要把所有的问题想清楚,还要尽可能的准确描述出来),编码用2天(其实1天就够了,技术已经不是问题,多计划出一天来应付突发事件),测试用2天(测试应该至少占全部项目的四分之一,不过这个项目只是一个Demo,也太简单了),发布也要用上半天(尽管我们不去实际发布它,但是还要花点时间搞清楚应该如何做),最后就是项目总结和开庆功会(时间待定)。

二、利其器

“公欲善其事,必先利其器”,做项目之前第一步是前期调研.我们要做的华容道这个东东随处可见,我们要调研的是两个方面:

1. 游戏的内容:游戏本身很简单,就是有几个格子,曹操占据其中一个较大的格子,然后被几个格子包围,这些格子形状不一定相同,但是挡住了曹操移动的方向.游戏者需要挪动这些格子最终把曹操移动到一个指定的位置才算是过关.更具体的分析我们放在后面需求分析和概要设计中讨论。

2. 技术储备:谈到技术,这里简单介绍一下J2ME.Java有三个版本,分别是J2ME (微型版).J2SE(标准版).J2EE(企业版).J2ME是一个标准,采用3层结构设计.最低层是配置层(Configuration)也就是设备层,其上是简表层(Profile),再上是应用层(Application).MIDP就是移动信息设备简表,目前主流手机支持MIDP1.0,最新的是MIDP2.0,它比前一个版本增加了对游戏的支持,在javax.microedition.lcdui.game包中提供了一些类来处理游戏中的技术,比如我们后面会用到的Sprite类,它是用来翻转图片的.权衡再三,笔者决定使用MIDP2.0来做开发.首先需要安装一个J2ME的模拟器,我们就用Sun 公司的WTK2.0,我觉得Sun的东西最权威.当然你也可以使用Nokia.Siemens 或是Motolora等其他模拟器,但是他们的JDK不尽相同,写出来的程序移植是比较麻烦的.

Sun公司的WTK2.0可以到搜索引擎寻找下载,当然要想成功下载的前提是你要先注册成为Sun的会员(其实这样对你是有好处的).当下来之后就是按照提

示一步一步的安装.安装好了之后,我们用一个"Hello World"程序开始你的J2ME 之旅.我们启动WTK2.0工具集中的KToolBar,然后点击New Project按钮,在弹出的输入框中输入Project Name为HelloWorld,MIDlet Class Name为Hello,然后点击Create Project,开始生成项目,工具会弹出MIDP配置简表,这里接受生成的默认值(以后还可以修改)点击OK,工具提示我们把写好的Java源程序放到 [WTK_HOME]\apps\HelloWorld\src目录之下.我们编辑如下代码,并保存在上述目录之下,文件名为Hello.java。

import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

public class Hello extends MIDlet

{

private Display display;

public Hello(){

display =Display.getDisplay(this);

}

public void startApp(){

TextBox t = new TextBox("Hello","Hello",256,0);

display.setCurrent(t);

}

public void pauseApp(){

}

public void destroyApp(boolean unconditional){

}

}

保存好了之后,点击Build按钮,工具会为你编译程序,如无意外再点击Run 按钮,会弹出一个手机界面,剩下的就不用我教了吧(用鼠标对手机按键一顿狂点)。呵呵,你的第一个J2ME程序已经OK了.什么?你还一点都没懂呢(真是厉害,不懂都能写出J2ME程序来,果然是高手).我这里主要是介绍 WTK2.0工具的使用,程序并不是目的,不懂的话后面还会有详细的解说,这里只是带你上路.什么?你不懂Java!那也没有关系,后面我再讲得细一点。

跳过J2ME,我们先来讲点游戏的理论.具体到华容道这个游戏,主要有三个方面,贴图.游戏操作.逻辑判断.这里讲讲贴图,其他两方面放在概要设计和详细设计里讲.所谓的贴图,其实就是画图,就是在要显示图形的位置上输出一副图片,(要是牵扯到动画就要麻烦一些,可以使用 TimerTask.Thread或Rannable之类的技术),这副图片可以是事先准备好的也可以是临时处理的.在J2ME中有一个Image类,专门用于管理图片,它有createImage()方法,可以直接读取图片文件(J2ME只支持PNG格式的图片),也可以截取已有的图片的一部分(这样我们可以把很多图片放在一起,然后一张一张的截下来,好处是节省存储空间和文件读取时间,对于手机这两者都是性能的瓶颈).

J2ME还有一个Graphics类,专门用于绘图,它有drawImage()方法,可以把一副图片在指定的位置上显示出来,它还有 drawRect()方法和setColor()方法,

这两个方法在后面我们进行游戏操作时就会用到,这里先交代一下.有了图片和绘图的方法,还需要知道把图画到谁身上,J2ME提供了一个Canvas类,字面意思就是画布,它有一个paint()方法用于刷新页面,还有一个repaint()方法用于调用paint()方法.听着有些糊涂是吧,不要紧,我来结合具体程序讲解一下.为了今后编程的方便,我们创建两个类Images和Draw,Images 用于保存一些常量值和图片,Draw主要是用于画图,这两个类的源代码如下。

Images类的源代码如下:

package huarongroad;

import javax.microedition.lcdui.*;

import javax.microedition.lcdui.game.*;

public class Images {//保存常量

//绘图位置常量

public static final int UNIT = 32;//方块的单位长度

public static final int LEFT = 10;//画图的左边界顶点

public static final int TOP = 9;//画图的上边界顶点

//地图位置常量

public static final int WIDTH = 4;//地图的宽度

public static final int HEIGHT = 5;//地图的高度

//地图标记常量

public static final byte CAOCAO = (byte) ′a′; <A href="file://曹">file://曹</A>操的地图标记

public static final byte MACHAO = (byte) ′b′;//马超的地图标记

public static final byte HUANGZHONG = (byte) ′c′;//黄忠的地图标记public static final byte GUANYU = (byte) ′d′;//关羽的地图标记

public static final byte ZHANGFEI = (byte) ′e′;//张飞的地图标记public static final byte ZHAOYUN = (byte) ′f′;//赵云的地图标记public static final byte ZU = (byte) ′g′;//卒的地图标记

public static final byte BLANK = (byte) ′h′;//空白的地图标记

public static final byte CURSOR = (byte) ′i′;//光标的地图标记

//地图组合标记常量

public static final byte DLEFT = (byte) ′1′; <A href="file://组">file://组</A>合图形左边标记

public static final byte DUP = (byte) ′2′; <A href="file://组">file://组</A>合图形上边标记

public static final byte DLEFTUP = (byte) ′3′; <A href="file://组">file://组</A>合图形左上标记

//图片常量

public static Image image_base;//基本图片

public static Image image_Zhaoyun;//赵云的图片

public static Image image_Caocao;//曹操的图片

public static Image image_Huangzhong;//黄忠的图片

public static Image image_Machao;//马超的图片

public static Image image_Guanyu;//关羽的图片

public static Image image_Zhangfei;//张飞的图片

public static Image image_Zu;//卒的图片

public static Image image_Blank;//空白的图片

public static Image image_Frame;//游戏框架的图片

public Images() {//构造函数

}

public static boolean init() {//初始化游戏中用到的图片

try {

image_base = Image.createImage("/huarongroad/BITBACK.png");

image_Frame = Image.createImage(image_base, 126, 0, 145, 177, Sprite.TRANS_NONE);

//Sprite类是用来翻转图片的,是MIDP2.0新新增加的支持游戏的特性

image_Zhaoyun = Image.createImage(image_base, 0, 0, UNIT, 2 * UNIT, Sprite.TRANS_NONE);

image_Caocao = Image.createImage(image_base, UNIT, 0, 2 * UNIT,

2 * UNIT, Sprite.TRANS_NONE);

image_Huangzhong = Image.createImage(image_base, 3 * UNIT, 0, UNIT, 2 * UNIT,

Sprite.TRANS_NONE);

image_Machao = Image.createImage(image_base, 0, 2 * UNIT, UNIT,

2 * UNIT,

Sprite.TRANS_NONE);

image_Guanyu = Image.createImage(image_base, UNIT, 2 * UNIT,

2 * UNIT, UNIT,

Sprite.TRANS_NONE);

image_Zhangfei = Image.createImage(image_base, 3 * UNIT, 2 * UNIT, UNIT, 2 * UNIT,

Sprite.TRANS_NONE);

image_Zu = Image.createImage(image_base, 0, 4 * UNIT, UNIT, UNIT, Sprite.TRANS_NONE);

image_Blank = Image.createImage(image_base, 1 * UNIT, 4 * UNIT,UNIT, UNIT,

Sprite.TRANS_NONE);

return true;

}catch (Exception ex) {

return false;

}

}

}

Draw类的源代码如下:

package huarongroad;

import javax.microedition.lcdui.*;

public class Draw {

//绘制游戏中的图片

public Draw(Canvas canvas) {//构造函数

}

public static boolean paint(Graphics g, byte img, int x, int y) {

//在地图的x,y点绘制img指定的图片

try {

paint(g, img, x, y, Images.UNIT);//把地图x,y点转化成画布的绝对坐标,绘图

return true;

}

catch (Exception ex) {

return false;

}

}

public static boolean paint(Graphics g, byte img, int x, int y, int unit) {

try {

switch (img) {

case Images.CAOCAO://画曹操

//变成绝对坐标,并做调整

g.drawImage(Images.image_Caocao, Images.LEFT + x * unit,

Images.TOP + y * unit,

Graphics.TOP | Graphics.LEFT);

break;

case Images.GUANYU://画关羽

g.drawImage(Images.image_Guanyu, Images.LEFT + x * unit,

Images.TOP + y * unit,

Graphics.TOP | Graphics.LEFT);

break;

case Images.HUANGZHONG://画黄忠

g.drawImage(Images.image_Huangzhong, Images.LEFT + x * unit, Images.TOP + y * unit,

Graphics.TOP | Graphics.LEFT);

break;

case Images.MACHAO://画马超

g.drawImage(Images.image_Machao, Images.LEFT + x * unit,

Images.TOP + y * unit,

Graphics.TOP | Graphics.LEFT);

break;

case Images.ZHANGFEI://画张飞

g.drawImage(Images.image_Zhangfei, Images.LEFT + x * unit, Images.TOP + y * unit,

Graphics.TOP | Graphics.LEFT);

break;

case Images.ZHAOYUN://画赵云

g.drawImage(Images.image_Zhaoyun, Images.LEFT + x * unit,

Images.TOP + y * unit,

Graphics.TOP | Graphics.LEFT);

break;

case Images.ZU://画卒

g.drawImage(Images.image_Zu, Images.LEFT + x * unit,

Images.TOP + y * unit,

Graphics.TOP | Graphics.LEFT);

break;

case Images.BLANK://画空白

g.drawImage(Images.image_Blank, Images.LEFT + x * unit,

Images.TOP + y * unit,

Graphics.TOP | Graphics.LEFT);

break;

case Images.CURSOR://画光标

g.drawRect(Images.LEFT + x * unit,

Images.TOP + y * unit,Images.UNIT,Images.UNIT);

break;

}

return true;

}catch (Exception ex) {

return false;

}

}

}

其中Images类存的是绘图位置常量(也就是在画图时每个格子的长度和相对坐标原点位置要进行的调整)、地图位置常量(地图的长、宽),地图标记常量(人物对应的记号),地图组合标记常量(后面会细说),图片常量(存放人物的图片);Draw类主要负责在制定的位置画出人物图片。下面我来说说 Images 类中的地图标记常量和地图组合标记常量。为了能够灵活的安排各个关面的布局,我们决定把游戏布局的信息存储在外部文件中,然后程序启动后把它读进来。

这样我们制定了一套存储图片的代码,这就是地图标记常量,如上面Images类中定义的Caocao(曹操)用a字符来表示,当程序读到a字符时就能将它转化成曹操对应的图片,并在读到a字符的位置上进行显示。但是从实际观察中我们发现所有的图片并不是统一大小的,有的占4个格子,有的占2个格子,还有的占1个格子,而且即便同是占两个格子的图片还有横、竖之分。有鉴于此,我们

引入了地图组合标记常量,就是说在遇到占有多个格子的时候,值1(也就是Images.LEFT)表示它的左边是一个真正的地图标记,值2(也就是Images.UP)表示它的上边是一个真正的地图标记,值1(也就是 Images.LEFTUP)表示它的左上边是一个真正的地图标记。地图组合标记常量其实就是用来占位置的,与实际显示无关,当后面我们将到移动时还会再来分析组合标记的使用。

Draw类主要是用来在画布上画出图形,它有两个paint方法,这是很常见的函数重载。但是程序中实际上只用到了4个参数的paint方法,它直接获得要画图片的相对坐标位置信息,然后调用5个参数的paint方法。5个参数的paint 方法将相对坐标位置信息转换成绝对位置,并实际调用 Graphics.drawImage()方法,将Images中的图片画了出来。这种实现方法的好处是灵活和便于扩展,但你需要画图的位置并不能够对应到格子中的相对坐标位置时,你就可以直接调用5个参数的paint方法,而不必再去修改这各类;但你添加新的图片时,只要在Images中增加对应的常量,然后向Draw中5个参数的paint方法添加一条处理就可以了。写到这里,两天的时间刚好用完。

三、需求分析

这部分叫做需求分析,听起来挺吓人的,其实就是搞清楚我们要做什么,做成什么样,那些不做。下面我引领着大家共同来完成这一步骤。首先,我们要做一个华容道的游戏,华容道的故事这里不再赘述了,但其中的人物在这里限定一下,如上面Images类里的定义,我们这个版本只提供曹操(Caocao)、关羽(Guanyu)、张飞(Zhangfei)、赵云(Zhaoyun)、黄忠(Huangzhong)、马超(Machao)和卒(Zu)。我们这里也限定一下游戏的操作方法:首先要通过方向键选择一个要移动的区域(就是一张图片),被选择的区域用黑色方框框住;选好后按Fire键(就是确定键)将这块区域选中,被选中的区域用绿色方框框住;然后选择要移动到的区域,此时用红色方框框住被选择的区域;选好要移动到的区域之后按Fire键将要移动的区域 (图片)移到要移动到的区域,并去掉绿色和红色的方框。这里需要强调的概念有选择的区域、选中的区域、要移动的区域和要移动到的区域,这四个概念请读者注意区分,当然也应当把这一部分记入数据字典之中。

为了使文章的重点突出(介绍如何制作一个J2ME的收集游戏),我们这里限定一些与本主题无关的内容暂不去实现:过关之后的动画(实现时要用到 TimerTask 或Thread类,后续的系列文章中我会详细介绍动画方面的知识)、关面之间的切换(其实很简单,当完成任务之后重新再做一边)、暂停和保存等操作(这部分的内容介绍的资料很多,我也写不出什么新的东东来,难免抄袭,故此免掉)。

需求分析基本完成,离下午还有一段时间,马上动手用ACDSee把从网上找来的BMP文件,调整其大小为271*177(我的这个图片是两个部分合在一起,所以比手机实际屏幕大了),另存为PNG格式。半天时间刚刚好,不但搞清楚了要做的东东,还把要用的图片准备好了。

四、概要设计

概要设计是从需求分析过渡到详细设计的桥梁和纽带,这一部分中我们确定项目的实现方法和模块的划分。我们决定将整个项目分成五个部分,分别是前面介绍的Images、Draw,还有Map和Displayable1和MIDlet1。Images和Draw类功能简单、结构固定,因此很多项目我们都使用这两各类,这里直接拿来改改就能用了,前面已经介绍过这里不再赘述。Map类是用来从外部文件读入地图,然后保存在一个数组之中,这部分的内容是我们在本阶段讨论的重点。Displayable1是一个继承了Canvas类的画布,它用来处理程序的主要控制逻辑和一部分控制逻辑所需的辅助函数,主要函数应该包括用来绘图的paint()函数、用来控制操作的keyPressed()函数、用来控制选择区域的setRange()函数、用来控制选择要移动到区域的setMoveRange()函数、用来移动选中区域的Move()函数和判断是否完成任务的win()函数,更具体的分析,我们放到详细设计中去细化。MIDlet1实际上就是一个控制整个J2ME应用的控制程序,其实也没有什么可特别的,它和我们前面介绍的"Hello World"程序大同小异,这里就不展开来说了,后面会贴出它的全部代码。

Map类主要应该有一个Grid[][]的二维数组,用来存放华容道的地图,还应该有一个read_map()函数用来从外部文件读取地图内容填充 Grid数据结构,再就是要有一个draw_map()函数用来把Grid数据结构中的地图内容转换成图片显示出来(当然要调用Draw类的paint方法)。说到读取外部文件,笔者知道有两种方法:一种是传统的定义一个InputStream对象,然后用

getClass().getResourceAsStream()方法取得输入流,然后再从输入流中取得外部文件的内容,例如

InputStream is = getClass().getResourceAsStream("/filename");

if (is != null) {

byte a = (byte) is.read();

}

这里请注意文件名中的根路径是相对于便以后的class文件放置的位置,而不是源文件(java)。第二种方法是使用 onnector.openInputStream方法,然后打开的协议是Resource,但是这种方法笔者反复尝试都没能调通,报告的错误是缺少 Resource协议,估计第二种方法用到J2ME的某些扩展类包,此处不再深究。由于以前已经做过一些类似华容道这样的地图,这里直接给出Map类的代码,后面就不再详细解释Map类了,以便于我们可以集中精力处理Displayable1中的逻辑。

Map类的代码如下:

package huarongroad;

import java.io.InputStream;

import javax.microedition.lcdui.*;

public class Map {

//处理游戏的地图,负责从外部文件加载地图数据,存放地图数据,并按照地图数据绘制地图

public byte Grid[][];//存放地图数据

public Map() {//构造函数,负责初始化地图数据的存储结构

this.Grid = new byte[Images.HEIGHT][Images.WIDTH];

//用二维数组存放地图数据,注意第一维是竖直坐标,第二维是水平坐标

}

public int[] read_map(int i) {

<A href="file://从">file://从</A>外部文件加载地图数据,并存放在存储结构中,返回值是光标点的位置

//参数是加载地图文件的等级

int[] a = new int[2];//光标点的位置,0是水平位置,1是竖直位置

try {

InputStream is = getClass().getResourceAsStream(

"/huarongroad/level".concat(String.valueOf(i)));

if (is != null) {

for (int k = 0; k < Images.HEIGHT; k++) {

for (int j = 0; j < Images.WIDTH; j++) {

this.Grid[k][j] = (byte) is.read();

if ( this.Grid[k][j] == Images.CURSOR ) {

//判断出光标所在位置

a[0] = j;//光标水平位置

a[1] = k;//光标竖直位置

this.Grid[k][j] = Images.BLANK;//将光标位置设成空白背景

}

}

is.read();//读取回车(13),忽略掉

is.read();//读取换行(10),忽略掉

}

is.close();

}else {

//读取文件失败

a[0] = -1;

a[1] = -1;

}

}catch (Exception ex) {

//打开文件失败

a[0] = -1;

a[1] = -1;

}

return a;

}

public boolean draw_map(Graphics g) {

//调用Draw类的静态方法,绘制地图

try {

for (int i = 0; i < Images.HEIGHT; i++) {

for (int j = 0; j < Images.WIDTH; j++) {

Draw.paint(g, this.Grid[i][j], j, i);//绘制地图

}

}

return true;

}catch (Exception ex) {

return false;

}

}

}

对于像华容道这样的小型地图可以直接用手工来绘制地图的内容,比如:

fa1c

2232

bd1e

2gg2

gihg

但是,如果遇到像坦克大战或超级玛莉那样的地图,就必须另外开发一个地图编辑器了(我会在后续的文章中介绍用vb来开发一个地图编辑器)。

五、详细设计

详细设计是程序开发过程中至关重要的一个环节,好在我们在前面的各个阶段中已经搭建好了项目所需的一些工具,现在这个阶段中我们只需集中精力设计好Displayable1中的逻辑。(两天的时间当然不只干这点活,还要把其他几个类的设计修改一下)

Displayable1这个类负责处理程序的控制逻辑。首先,它需要有表示当前关面的变量level、表示当前光标位置的变量loc、表示要移动区域的变量SelectArea、表示要移动到的区域的变量MoveArea、表示是否已有区域被选中而准备移动的变量Selected和Map类的实例 MyMap。然后,我们根据用户按不同的键来处理不同的消息,我们要实现keyPressed()函数,在函数中我们处理按键的上下左右和选中 (Fire),这里的处理需要我展开来讲一讲,后面我很快会把这一部分详细展开。

接下来,是实现paint()函数,我们打算在这一部分中反复的重画背景、地图和选择区域,这个函数必须处理好区域被选中之后的画笔颜色的切换,具体讲就是在没有选中任何区域时要用黑色画笔,当选重要移动的区域时使用绿色画笔,当选择要移动到的区域时改用红色画笔(当然附加一张流程图是必不可少的)。

再下面要实现的setRange()函数和setMoveRange()函数,这两个函数用来设置要移动的区域和要移动到的区域,我的思路就是利用前面在Images类中介绍过的地图组合标记常量,当移动到地图组合标记常量时,根据该点地图中的值做逆向变换找到相应的地图标记常量,然后设置相应的 loc、SelectArea和MoveArea,其中setMoveRange()函数还用到了一个辅助函数 isInRange(),isInRange()函数是用来判断给定的点是否在已选中的要移动的区域之内,如果isInRange()的返回值是假并且该点处的值不是空白就表明要移动到的区域侵犯了其他以被占用的区域。有了setRange()和setMoveRange()函数,Move()函数就水到渠成了,Move()函数将要移动的区域移动到要移动到的区域,在移动过程中分为三步进行:

第一.复制要移动的区域;

第二.将复制出的要移动区域复制到要移动到的区域(这两步分开进行的目的是防止在复制过程中覆盖掉要移动的区域);

第三.用isInRange2()判断给定的点是否在要移动到的区域内,将不在要移动到的区域内的点设置成空白。下面我们详细的分析一下keyPressed()函数的实现方法:首先,keyPressed()函数要处理按键的上下左右和选中(Fire),在处理时

需要用Canvas类的getGameAction函数来将按键的键值转换成游戏的方向,这样可以提高游戏的兼容性(因为不同的J2ME实现,其方向键的键值不一定是相同的)。

接下来,分别处理四个方向和选中.当按下向上时,先判断是否已经选定了要移动的区域(即this.selected是否为真),如果没有选中要移动区域则让光标向上移动一格,然后调用setRange()函数设置选择要移动的区域,再调用repaint()函数刷新屏幕,否则如果已经选中了要移动的区域,就让光标向上移动一格,然后调用setMoveRange()函数判断是否能够向上移动已选中的区域,如果能移动

就调用repaint()函数刷新屏幕,如果不能移动就让光标向下退回到原来的位置。

当按下向下时,先判断是否已经选定了要移动的区域,如果没有选中要移动的区域则判断当前所处的区域是否为两个格高,如果是两个格高则向下移动两格, 如果是一个格高则向下移动一格,接着再调用setRange()函数设置选择要移动的

区域,而后调用repaint()函数刷新屏幕,否则如果已经选中了要移动的区域,

就让光标向下移动一格,然后调用setMoveRange()函数判断是否能够向下移动

已选中的区域,如果能移动就调用repaint() 函数刷新屏幕,如果不能移动就让光标向上退回到原来的位置.按下向左时情况完全类似向上的情况,按下向右时情况完全类似向下的情况,因此这里不再赘述,详细情况请参见程序的源代码。

当按下选中键时,先判断是否已经选中了要移动的区域,如果已经选中了要移动的区域就调用Move()函数完成由要移动的区域到要移动到的区域的移动过程,接着调用repaint()函数刷新屏幕,然后将已选择标记置成false,继续调用win()函数判断是否完成了任务,否则如果还没有选定要移动的区域则再判断当前选中区域是否为空白,如果不是空白就将选中标记置成true,然后刷新屏幕.这里

介绍一个技巧,在开发程序遇到复杂的逻辑的时候,可以构造一格打印函数来将所关心的数据结构打印出来以利调试,这里我们就构造一个PrintGrid()函数,

这个函数纯粹是为了调试之用,效果这得不错.至此我们完成了编码前的全部工作。

package huarongroad;

import javax.microedition.lcdui.*;

public class Displayable1 extends Canvas implements CommandListener { private int[] loc = new int[2]; <A href="file://光">file://光</A>标的当前位置,0是水平位置,1是竖直位置

private int[] SelectArea = new int[4];//被选定的区域,即要移动的区域private int[] MoveArea = new int[4];//要移动到的区域

private Map MyMap = new Map();//地图类

private boolean selected;//是否已经选中要移动区域的标志

private int level;//但前的关面

public Displayable1() {//构造函数

try {

jbInit();//JBuilder定义的初始化函数

}catch (Exception e) {

e.printStackTrace();

}

}

private void Init_game(){

//初始化游戏,读取地图,设置选择区域,清空要移动到的区域

this.loc = MyMap.read_map(this.level);//读取地图文件,并返回光标的初始位置

//0为水平位置,1为竖直位置

this.SelectArea[0] = this.loc[0];//初始化选中的区域

this.SelectArea[1] = this.loc[1];

this.SelectArea[2] = 1;

this.SelectArea[3] = 1;

this.MoveArea[0] = -1;//初始化要移动到的区域

this.MoveArea[1] = -1;

this.MoveArea[2] = 0;

this.MoveArea[3] = 0;

}

private void jbInit() throws Exception {//JBuilder定义的初始化函数

<A href="file://初">file://初</A>始化实例变量

this.selected = false;//设置没有被选中的要移动区域

this.level = 1;

Images.init();//初始化图片常量

Init_game();//初始化游戏,读取地图,设置选择区域,清空要移动到的区域setCommandListener(this);//添加命令监听,这是Displayable的实例方法

addCommand(new Command("Exit", Command.EXIT, 1));//添加“退出”按钮

}

public void commandAction(Command command, Displayable displayable) { //命令处理函数

if (command.getCommandType() == Command.EXIT) {//处理“退出”

MIDlet1.quitApp();

}

}

protected void paint(Graphics g) {

//画图函数,用于绘制用户画面,即显示图片,勾画选中区域和要移动到的区域try {

g.drawImage(Images.image_Frame, 0, 0,

Graphics.TOP | Graphics.LEFT);//画背景

MyMap.draw_map(g);//按照地图内容画图

if ( this.selected )

g.setColor(0,255,0);//如果被选中,改用绿色画出被选中的区域

g.drawRect(this.SelectArea[0] * Images.UNIT + Images.LEFT,

this.SelectArea[1] * Images.UNIT + Images.TOP,

this.SelectArea[2] * Images.UNIT,

this.SelectArea[3] * Images.UNIT);//画出选择区域,

<A href="file://如">file://如</A>果被选中,就用绿色

<A href="file://否">file://否</A>则,使用黑色

g.setColor(255,255,255);//恢复画笔颜色

if (this.selected) {//已经选中了要移动的区域

g.setColor(255, 0, 255);//改用红色

g.drawRect(this.MoveArea[0] * Images.UNIT + Images.LEFT,

this.MoveArea[1] * Images.UNIT + Images.TOP,

this.MoveArea[2] * Images.UNIT,

this.MoveArea[3] * Images.UNIT);//画出要移动到的区域

g.setColor(255, 255, 255);//恢复画笔颜色

}

}catch (Exception ex) {

}

System.out.println(Runtime.getRuntime().freeMemory());

System.out.println(Runtime.getRuntime().totalMemory());

}

private void setRange() {

//设置移动后能够选中的区域

//调整当前光标位置到地图的主位置,即记录人物信息的位置

if (this.MyMap.Grid[this.loc[1]][this.loc[0]] == Images.DLEFT) { this.loc[0] -= 1;//向左调

}else if (this.MyMap.Grid[this.loc[1]][this.loc[0]] == Images.DUP) { this.loc[1] -= 1;//向上调

}else if (this.MyMap.Grid[this.loc[1]][this.loc[0]] == Images.DLEFTUP)

{

this.loc[0] -= 1;//向左调

this.loc[1] -= 1;//向上调

}

this.SelectArea[0] = this.loc[0];//设置光标的水平位置

this.SelectArea[1] = this.loc[1];//设置光标的竖直位置

//设置光标的宽度

if (this.loc[0] + 1 < Images.WIDTH) {

this.SelectArea[2] = this.MyMap.Grid[this.loc[1]][this.loc[0] + 1] != (byte) ′1′ ?

1 : 2;

}else {

this.SelectArea[2] = 1;

}

//设置光标的高度

if (this.loc[1] + 1 < Images.HEIGHT) {

this.SelectArea[3] = this.MyMap.Grid[this.loc[1] + 1][this.loc[0]] != (byte) ′2′ ?

1 : 2;

}else {

this.SelectArea[3] = 1;

}

}

private boolean setMoveRange() {

//设置要移动到的区域,能够移动返回true,否则返回false

for (int i = 0; i < this.SelectArea[2]; i++) {

for (int j = 0; j < this.SelectArea[3]; j++) {

if (this.loc[1] + j >= Images.HEIGHT ||

this.loc[0] + i >= Images.WIDTH ||

(!isInRange(this.loc[0] + i, this.loc[1] + j) &&

this.MyMap.Grid[this.loc[1] + j][this.loc[0] + i] !=

Images.BLANK)) {

return false;

}

}

}

this.MoveArea[0] = this.loc[0];

this.MoveArea[1] = this.loc[1];

this.MoveArea[2] = this.SelectArea[2];

this.MoveArea[3] = this.SelectArea[3];

return true;

}

private boolean isInRange(int x, int y) {

//判断给定的(x,y)点是否在选定区域之内,x是水平坐标,y是竖直坐标

if (x >= this.SelectArea[0] &&

x < this.SelectArea[0] + this.SelectArea[2] &&

y >= this.SelectArea[1] &&

y < this.SelectArea[1] + this.SelectArea[3]) {

return true;

}else {

return false;

}

}

private boolean isInRange2(int x, int y) {

//判断给定的(x,y)点是否在要移动到的区域之内,x是水平坐标,y是竖直坐标

if (x >= this.MoveArea[0] &&

x < this.MoveArea[0] + this.MoveArea[2] &&

y >= this.MoveArea[1] &&

y < this.MoveArea[1] + this.MoveArea[3]) {

return true;

}else {

return false;

}

}

protected void keyPressed(int keyCode) {

//处理按下键盘的事件,这是Canvas的实例方法

switch (getGameAction(keyCode)) {//将按键的值转化成方向常量

case Canvas.UP://向上

if (!this.selected) {//还没有选定要移动的区域

if (this.loc[1] - 1 >= 0) {//向上还有移动空间

this.loc[1]--;//向上移动一下

setRange();//设置光标移动的区域,该函数能将光标移动到地图主位置repaint();//重新绘图

}

}else {//已经选定了要移动的区域

if (this.loc[1] - 1 >= 0) {//向上还有移动空间

this.loc[1]--;//向上移动一下

if (setMoveRange()) {//能够移动,该函数能够设置要移动到的区域

repaint();//重新绘图

}else {//不能移动

this.loc[1]++;//退回来

}

}

}

break;

case Canvas.DOWN://向下

if (!this.selected) {//还没有选定要移动的区域

if (this.loc[1] + 1 < Images.HEIGHT) {//向下还有移动空间

if (this.MyMap.Grid[this.loc[1] + 1][this.loc[0]] ==

Images.DUP){//该图片有两个格高

this.loc[1]++;//向下移动一下

if (this.loc[1] + 1 < Images.HEIGHT) {//向下还有

<A href="file://移">file://移</A>动空间

this.loc[1]++;//向下移动一下

setRange();//设置光标移动的区域,

<A href="file://该">file://该</A>函数能将光标移动到地图主位置repaint();//重新绘图

}else {//向下没有移动空间

this.loc[1]--;//退回来

}

}else {//该图片只有一个格高

this.loc[1]++;//向下移动一下

setRange();//设置光标移动的区域,

<A href="file://该">file://该</A>函数能将光标移动到地图主位置repaint();//重新绘图

}

}else {

}

}else {//已经选定了要移动的区域

if (this.loc[1] + 1 < Images.HEIGHT) {//向下还有移动空间

this.loc[1]++;//向下移动一下

if (setMoveRange()) {//能够移动,该函数能够设置要移动到的区域repaint();//重新绘图

}else {//不能移动

this.loc[1]--;//退回来

}

}

}

break;

case Canvas.LEFT://向左

if (!this.selected) {//还没有选定要移动的区域

if (this.loc[0] - 1 >= 0) {//向左还有移动空间

this.loc[0]--;//向左移动一下

setRange();//设置光标移动的区域,该函数能将光标移动到地图主位置repaint();//重新绘图

}

}else {//已经选定了要移动的区域

if (this.loc[0] - 1 >= 0) {//向左还有移动空间

this.loc[0]--;//向左移动一下

if (setMoveRange()) {//能够移动,该函数能够设置要移动到的区域repaint();//重新绘图

}else {//不能移动

this.loc[0]++;//退回来

}

}

}

break;

case Canvas.RIGHT://向右

if (!this.selected) {//还没有选定要移动的区域

if (this.loc[0] + 1 < Images.WIDTH) {//向右还有移动空间

if (this.MyMap.Grid[this.loc[1]][this.loc[0] + 1] ==

Images.DLEFT) {//该图片有两个格宽

this.loc[0]++;//向右移动一下

if (this.loc[0] + 1 < Images.WIDTH) {//向右还有

<A href="file://移">file://移</A>动空间

this.loc[0]++;//向右移动一下

setRange();//设置光标移动的区域,

<A href="file://该">file://该</A>函数能将光标移动到地图主位置repaint();//重新绘图

}else {//向右没有移动空间

this.loc[0]--;//退回来

}

}else {//该图片只有一个格宽

this.loc[0]++;//向右移动一下

setRange();//设置光标移动的区域,

<A href="file://该">file://该</A>函数能将光标移动到地图主位置repaint();//重新绘图

}

}else {

}

}else {//已经选定了要移动的区域

if (this.loc[0] + 1 < Images.WIDTH) {//向右还有移动空间

this.loc[0]++;//向右移动一下

if (setMoveRange()) {//能够移动,该函数能够设置要移动到的区域repaint();//重新绘图

}else {//不能移动

this.loc[0]--;//退回来

}

}

}

break;

case Canvas.FIRE:

if (this.selected) {//已经选定了要移动的区域

Move();//将要移动的区域移动到刚选中的区域

repaint();//重新绘图

this.selected = false;//清除已选定要移动区域的标志

if ( win()) {

System.out.println("win");

}

}else {//还没有选定要移动的区域

if (this.MyMap.Grid[this.loc[1]][this.loc[0]] ==

Images.BLANK) {//要移到的位置是一个空白

}else {//要移到的位置不是空白

this.selected = true;//设置已选定要移动区域的标志

}

repaint();//重新绘图

}

break;

}

}

private boolean win(){

<A href="file://判">file://判</A>断是否已经救出了曹操

if ( this.MyMap.Grid[Images.HEIGHT - 2 ][Images.WIDTH - 3 ] == Images.CAOCAO )

return true;

else

return false;

}

private void PrintGrid(String a) {

<A href="file://打">file://打</A>印当前地图的内容,用于调试System.out.println(a);

for (int i = 0; i < Images.HEIGHT; i++) {

for (int j = 0; j < Images.WIDTH; j++) {

System.out.print( (char)this.MyMap.Grid[i][j]);

}

System.out.println("");

}

}

private void Move() {

<A href="file://将">file://将</A>要移动的区域移动到刚选中的区域

if (this.MoveArea[0] == -1 || this.MoveArea[1] == -1 ||

this.SelectArea[0] == -1 || this.SelectArea[1] == -1) {//没有选中区域}else {//已经选中了要移动的区域和要移动到的区域

byte[][] temp = new byte[this.SelectArea[3]][this.SelectArea[2]]; <A href="file://复">file://复</A>制要移动的区域,因为这块区域可能会被覆盖掉

for (int i = 0; i < this.SelectArea[2]; i++) {

for (int j = 0; j < this.SelectArea[3]; j++) {

temp[j][i] =

this.MyMap.Grid[this.SelectArea[1] +j]

[this.SelectArea[0] + i];

}

}

<A href="file://PrintGrid">file://PrintGrid</A>("1"); // 调试信息<A href="file://将">file://将</A>要移动的区域移动到刚选中的区域(即要移动到的区域)

for (int i = 0; i < this.SelectArea[2]; i++) {

for (int j = 0; j < this.SelectArea[3]; j++) {

this.MyMap.Grid[this.MoveArea[1] + j]

[this.MoveArea[0] + i] = temp[j][i];

}

}

<A href="file://PrintGrid">file://PrintGrid</A>("2");// 调试信息<A href="file://将">file://将</A>要移动的区域中无用内容置成空白for (int i = 0; i < this.SelectArea[3]; i++) {

for (int j = 0; j < this.SelectArea[2]; j++) {

if (!isInRange2(this.SelectArea[0] + j,

this.SelectArea[1] + i)) {//该点是不在要移动到

<A href="file://的">file://的</A>区域之内,需置空

this.MyMap.Grid[this.SelectArea[1] + i]

[this.SelectArea[0] + j] = Images.BLANK;

}else {

}

}

}

<A href="file://PrintGrid">file://PrintGrid</A>("3");// 调试信息this.SelectArea[0] = this.MoveArea[0];//重置选中位置的水平坐标

this.SelectArea[1] = this.MoveArea[1];//重置选中位置的竖直坐标

this.MoveArea[0] = -1;//清空要移动到的位置

this.MoveArea[1] = -1;//清空要移动到的位置

this.MoveArea[2] = 0;//清空要移动到的位置

this.MoveArea[3] = 0;//清空要移动到的位置

}

}

}

代码的相关分析,在详细设计阶段已经讲过,代码中有比较相近的注释,请读者自行研读分析.将全部的代码写好,用wtk2.0自带的Ktoolbar 工具建立一个工程,接下来把去不源文件放到正确位置下,然后点击build,再点run,就完成了程序的编写.当然如果有错误还要修改和调试。

七、测试

作为一个真正的产品要经过单体测试、结合测试和系统测试。由于项目本身简单,而且大部分代码已经是相对成熟的,我们跳过单体测试;又由于笔者的实际环境所限,无法搞到Java手机,无法架设OTA服务器,因此我们也只能放弃系统测试。那么就让我们开始结合测试吧。测试之前要先出一个测试式样书,也就是测试的计划。我们将它简化一下,只测试如下几种情况:第一、对各种形状的区域的选择和移动;第二、临近边界区域的选择和移动;第三、同一区域的反复选择和反复移动;第四、非法选择和非法移动。有了测试的目标,接下来的工作就是用wtk2.0自带的Run MIDP Application工具进行测试。打开这个工具,加载huarongRoad 的jad文件,程序就会自动运行,选择launch上MIDlet1这个程序,华容道游戏就会跃然屏幕之上,接下来的工作就是左三点.右三点,拇指扭扭,来做测试。测试过程中发现任何的问题,立刻发一个bug票给自己,然后就又是痛苦的调试和修正bug,如此如此。

八、发布

谈到发布,其实是个关键,再好的产品不能很好的发布出去也只是个产品而已,变不成商品也就得不到回报.由于笔者的条件所限,这里只能是纸上谈兵,不过还是希望能够使读者对这一过程有所了解(网上的资料也很多)。

J2ME的程序发布一般都是通过OTA(Over The Air),你只需要一台有公网IP的主机和一个普通的web Server就可以了(尽管要求很低,但笔者还是没有),这里我们以apache为例介绍一下OTA服务的配置,首先是安装好了apache服务器,然后在conf目录下找到mime.types文件,在该文件中加入如下两行

application/java-archive jar

text/vnd.sun.j2me.app-descriptor jad

然后重起apache服务器就可以了。接下来的工作就是修改jad文件中

MIDlet-Jar-URL:后面的参数,将它改为URL的绝对路径,即<A

href="http://***/">http://***/</A>huarongroad.jar(其中***是你的域名或IP地址)。在下面就是用java手机下载jad文件,它会自动部署相应的jar 文件并加载它。剩下的工作就和在模拟器上操作是一样的了。

九、项目总结

至此,我们已经完成了一个J2ME游戏的全部开发过程,程序中涉及到了调研、分析、设计、编码、测试和发布等方面的问题,其实在实际的工作中还有很多更为具体的问题,毕竟技术只在软件开发过程中占据很有限的一部分,这里限于篇幅的限制无法一一具体展开。今后,笔者计划再写一篇使用J2ME开发手机屏保的文章,借此机会向读者展示J2ME动画技术;然后再写一篇J2ME网络应用的文章,做一个类似开心辞典那样的知识问答游戏,以便向读者展示J2ME的网络技术;待这两方面的技术交待清楚之后,我将引领读者制作一个稍大一些的游戏。

比较适合开发手机游戏的编程语言介绍

在手机游戏流行的当下,各类手游层出不穷,占据中国流量的半壁江山,各个游戏公司在手游方面的竞争也越发激烈,急缺游戏开发人员,对开发人员的需求也越来越高。如果你也想自己制作手游,做起游戏开发的工作,那么学习Java将会是你不二的选择! Java是目前中国手机软件开发行业的主流语言之一,也是学习的人数最多的,介于目前中国流行的基本都是android系统,所以手机游戏的开发也需要在android的平台下开发。你可以朝这方面学习,不论你是自学还是找培训班,学成后是有很大一片前景的。 学习手游制作的大致方向 Android学习方向的技能: 1、需要javaLogic 也就是java的基本逻辑,牢固的Java基础 2、扎实的Linux基础知识 3、数据库基础知识 4、网络协议

游戏方面: 1、精美的图片、华丽的效果自然离不开flash 图片处理之类的技术 2、搞懂游戏算法,比如你制作一款贪吃蛇的手游,要知道怎么让蛇前进,怎么才算吃了食物变大。 3、进修java与游戏设计,必要的话学点3D设计或美术设计。 设计模式: 1、在Android系统的框架层当中,使用了大量的设计模式,如果没有这个方面的知识,对于Android的理解就会大打折扣。设计模式种类之多,全部掌握是不 现实的,必须首先掌握面向对象的基础设计原则。

2、掌握面向对象的基础设计原则的书籍有: ①《Effective Java》 ②《敏捷软件开发:原则、模式与实践》 服务器端开发知识: 1、Java EE 2、PHP,这是另外一门语言,但在我们学习Java的同时学习,有点得不偿失,是否学习看你自己) 3、.NET与JavaEE差不多,只不过需要额外掌握C#,比较麻烦。 4、ruby on rails,简洁、优雅,几行代码就可实现复杂的功能,不过要有Ruby 语言知识基础。 这些都是Android应用程序需的服务器端支持,掌握这类只是还是有必要的,只不过关于服务器端技术的种类实在太多,这边就列出四个,不过既然你是学的Java,还是建议学习JavaEE的知识。

腾讯移动游戏用户研究大揭秘:研究思路、方法、案例及步骤

一、谁在左右移动游戏的体验与设计(WHO) 左右移动游戏的体验与设计,其实就是与产品相关的人。 有两个方面要看: 过程参与角色有那些? 他们的重要性和影响力? 除了产品本身的开发人员外,我们在做重度手游新手引导研究时,还有来自三方面的调研。 1、玩家访谈,玩家行为与需求的挖掘 招募不同类型的玩家进行实验室研究,收集玩家对现有的新手引导意见,并挖掘玩家对新手引导的需求; 2、竞品分析,设计案例分析 通过对竞品的深入体验。分析主流游戏新手期设计思路与细节设计手法; 3、专家评估、专家焦点小组输出可落地的设计建议 听取专家对案例、设计新手引导过程的思考点与经验总结,为归纳设计原则及评价方法提供专业意见。 二、如何做到接地气的游戏体验与设计(HOW) 设计与产品的问题在于缺少细节处的结合,过于高端。研究人员与实际研发人员常有分歧,虽然研究内容结果很好,但开发人员并不会采纳,这与是否“接地气”有直接关系。 首先必须有:观点与心态的调整 1.是否有价值(定位-有价值) 玩家是产品成功与否的最终评判和使用者;重要性,“接地气”和“高大上”的价值有差异; 2.为什么产品不接受(换位思考) 缺少游戏体验的专业认识;正常的个人偏好和经验主义;不接受,不理解,效果不够直观的原因;

3.最终利益(共同立场-在线和收入) 与产品统一目标;精品时代的超出预算;产品只有在玩家满意和喜欢的条件下才可能有好的在线和收入;游戏的KPI和用户的游戏目标是相辅且成冲突关系; 游戏体验与设计接地气“三对象” 理解对象:我们的目标是一致的 找到对象:策划、玩家 @代表/决策性 研究对象:产品、竞品 @经典/代表性 如何通过研究来完善游戏体验和设计 我们尝试了很多种研究,例如脑电、心理学等方面。但学术只能解决细节,通常在一个变量中解决,但在现实变量太多的情况就不行了。选择适合的方法就显的十分重要。 具体的研究方法?腾讯是怎么做的? 全生命周期的研究内容 1.游戏立项初: 美术风格研究; 市场环境和竞品研究; 概念测试; 2.游戏测试期: 用户流失研究; 宣传素材测试; 版本可用性测试; 版本核心玩法研究; 目标用户的初步验证; 3.游戏上线后研究: 付费研究; 知名度&美誉度研究; 重要版本研究; 广告创意敏捷测试;

游戏制作全流程

游戏制作全流程 简单地说,游戏制作就是从游戏创意到成为商业产品的全过程。除了前期的市场调研外,整个游戏制作流程大致分为策划,美术资源制作,程序开发,再到游戏测试,运营上市几大阶段。 一、游戏策划阶段: 游戏策划就像编剧和导演一样,要规定游戏的世界构成,规定种族、气候,安排什么地方需要出现怪兽让玩家觉得刺激好玩,需要设计各种各样的武器和装备吸引玩家等等。专业点讲就是要设计游戏的背景故事,世界观,大陆布局,规则玩法,剧情对白,游戏任务,各种数值等等。 游戏策划师是游戏的灵魂人物,是游戏行业中非常稀缺的人才,无论是薪资待遇还是职业发展前景十分看好。 二、美术资源制作阶段: 策划文档会分为技术设计文档、背景艺术文档和商业计划文档。背景艺术文档将指导下一阶段的美术资源制作,它包括:原画设定、模型贴图、角色动画、特效和音效制作等。 1、游戏原画设定: 游戏原画设定是一个承上启下的重要环节,也是最具创造力

的职位,游戏里各种天马行空般,非常具有想象力的人物、怪物形象,场景设计都是出自原画之手。 但原画要考虑到游戏文档里对游戏角色、场景的设定要求,也要确保三维美术设计师的三维具体制作顺利进行。 2、模型贴图制作: 针对各种原画设定的艺术风格和技术风格,运用3D制作技术具体建立游戏世界,包括角色、道具、场景等,包括模型制作、贴图制作两个流程。根据游戏类型不同网游、次世代等不同游戏类型,模型贴图的制作工艺要求和流程也不同。 3、游戏角色动画: 游戏中大都存在着种类繁多的人物、怪物和各种不可思议的动物、植物,以及水流、岩浆、沼泽等各种地形地貌,为了让这一切更加逼真和栩栩如生,游戏动画设计师通过三维绘图软件赋予他们逼真的动作,合理的让人物生活在游戏世界中。 4、游戏特效制作: 游戏角色在格斗,或者施放魔法、各种必杀技时,你都会看见非常绚丽的视觉效果,这种视觉效果就是游戏特效师的工作。游戏特效师从分镜设计、切片动画、特效贴图制作、粒子特效制作到后期合成,将自己的特效设计思想制作出特效。 三、程序开发阶段 在策划阶段后,产生技术设计文档,这一文档将运用于程序开发。程序开发包括:引擎编写,脚本编写和代码测试。

2015年校招腾讯游戏策划笔试题目

2015腾讯游戏策划笔试题目 一、基础知识选择题(单选) 1. 在“驯龙高手”系列电影中,男主角属于哪个种族?() A、日耳曼人 B、罗马人 C、维京人 D、斯巴达人 2. “雷神托尔”是哪个神话中的人物?() A、希腊神话 B、北欧神话 C、玛雅神话 D、罗马神话 3. 应对雾霾污染、改善空气质量的首要人物是控制() A、汽车尾气 B、工业生产排放的废气 C、PM2.5 D、建筑工地和道路交通产生的扬尘 4. 一下哪个产品不是出自腾讯?() A、微云 B、滴滴打车 C、财付通 D、微信 5. “中国国际数码互动娱乐展览会”的英文缩写是() A、TGS B、TGA C、E3 D、CJ 6. 有10颗糖,如果每天至少吃一颗(多不限),吃完为止,问有多少种不同的吃法?() A、144 B、217 C、512 D、640 7. 第一部编年体史书是() A、山海经 B、春秋 C、资治通鉴 D、史记 8. 《海贼王》主角路飞吃了哪种恶魔果实() A、烟雾果实 B、沿江果实 C、橡胶果实 D、黑暗果实 9. 《洛神赋》是谁的作品?() A、曹操 B、曹植 C、蒲松龄 D、李贺

10. 以下哪一场战役不是以少胜多的战役?() A、夷陵之战 B、巨鹿之战 C、淝水之战 D、官渡之战 11. 以下哪个角色不是出自《火影忍者》?() A、大蛇丸 B、旗木卡卡西 C、黑崎一护 D、李洛克 12. 以下哪部电影不是出自美国?() A、被解救的姜戈 B、逃离德黑兰 C、三傻大闹宝莱坞 D、少年派的奇幻漂流 13. 以下不属于“美国漫画英雄”系列的是() A、蝙蝠侠 B、超人 C、战神奎托斯 D、雷神索尔 14. 以下哪一个公司的主要业务与其他三个不同?() A、facebook B、亚马逊 C、阿里巴巴 D、eBay 15. 以下哪个体育项目起源于中国?() A、篮球 B、马术 C、乒乓球 D、围棋 二、专业知识选择题(单选) 16. 下面哪个网站是因为大型游戏《魔兽世界》而被人熟知的?() A、A9VG B、ACFAN C、COLG D、NGA 17. 以下哪款游戏与其他三款游戏的游戏类型不一样?() A、斗战神 B、逆战 C、使命传唤 D、穿越火线 18. 下面这些名词中,哪个是游戏里的冲锋枪?() A、SLSWG B、苏27 C、UMP45 D、T95 19. FIFAOnline 3的开发商是() A、腾讯 B、暴雪 C、索尼 D、美国艺电 20. 下面那款游戏不是腾讯的?()

Android游戏开发(快速入门必备)

Android游戏开发之旅一长按Button原理 今天Android123开始新的Android游戏开发之旅系列,主要从控制方法(按键、轨迹球、触屏、重力感应、摄像头、话筒气流、光线亮度)、图形View(高效绘图技术如双缓冲)、音效(游戏音乐)以及最后的OpenGL ES(Java层)和NDK的OpenGL和J2ME游戏移植到Android方法,当然还有一些游戏实现惯用方法,比如地图编辑器,在Android OpenGL如何使用MD2文件,个部分讲述下Android游戏开发的过程最终实现一个比较完整的游戏引擎。相信大家都清楚Android Market下载量比较好的都是游戏,未来手机网游的发展相信Android使用的Java在这方面有比iPhone有更低的入门门槛。 对于很多游戏使用屏幕控制一般需要考虑长按事件,比如在动作类的游戏中需要长按发射武器,结合Android Button模型,我们实现一个带图片的Button的长按,为了更清晰的显示原理,Android开发网这里使用ImageButton作为基类 public class RepeatingImageButton extends ImageButton { private long mStartTime; //记录长按开始 private int mRepeatCount; //重复次数计数 private RepeatListener mListener; private long mInterval = 500; //Timer触发间隔,即每0.5秒算一次按下 public RepeatingImageButton(Context context) { this(context, null); } public RepeatingImageButton(Context context, AttributeSet attrs) { this(context, attrs, android.R.attr.imageButtonStyle); } public RepeatingImageButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setFocusable(true); //允许获得焦点 setLongClickable(true); //启用长按事件 } public void setRepeatListener(RepeatListener l, long interval) { //实现重复按下事件listener mListener = l; mInterval = interval; } @Override public boolean performLongClick() { mStartTime = SystemClock.elapsedRealtime(); mRepeatCount = 0;

《腾讯游戏开发精粹》文字版 2019年9月1日

《腾讯游戏开发精粹》内容提要 《腾讯游戏开发精粹》是腾讯游戏研发团队的技术结晶,由10多名腾讯游戏资深技术专家撰写而成,整理了团队在自主游戏研发的道路上积累沉淀的技术方案,具有较强的通用性及时效性,内容涵盖游戏脚本系统及开发工具、数学和物理、计算机图形、人工智能与后台架构等。 目录 第一部分游戏数学 第1 章基于SDF的摇杆移动2 摘要2 1.1 引言3 1.2 有号距离场(SDF 3 1.3 利用栅格数据预计算SDF 4 1.4 SDF 的碰撞检测与碰撞响应5 1.5 避免往返8 1.6 利用多边形数据预计算SDF 9

1.7 其他需求10 1.7.1 如何将角色从障碍区域中移出10 1.7.2 角色不能越过障碍物的远距离移动11 1.8 动态障碍物12 1.9 AI寻路14 1.10 动态地图14 1.11 总结17 参考文献17 第2 章高性能的定点数实现方案18 摘要18 2.1 引言18 2.1.1 浮点数简介18 2.1.2 32 位浮点数(单精度)表示原理19 2.2 基于整数的二进制表示的定点数原理19 2.2.1 32 位定点数表示原理19 2.2.2 64 位定点数表示原理20 2.3 定点数的四则运算21 2.3.1 加法与减法22

2.3.2 乘法22 2.3.3 除法23 2.4 定点数开方与超越函数实现方法23 2.4.1 多项式拟合24 2.4.2 正弦/余弦函数25 2.4.3 指数函数26 2.4.4 对数函数27 2.4.5 开方运算27 2.4.6 开方求倒数28 2.4.7 为什么不用查表法30 2.5 定点数的误差对比与性能测试30 2.5.1 超越函数及开方的误差测试30 2.5.2 性能测试30 2.6 总结31 参考文献31 第二部分游戏物理 第3 章一种高效的弧长参数化路径系统34 摘要34

一款游戏制作的常见流程

一款游戏制作的常见流程 游戏制作的第一步:立项 游戏制作的开始,就和文档有着密不可分的关系。当一个想法在主策划或者老板的脑海中产生时,他需要把想法整理成文字备忘录一类的东西。当然,老板会用交谈的方式讲给主策划听,然后由主策划整理成文。这些文字将作为游戏的最初形态被保存下来,并在项目结尾时,和完成后的游戏进行比较,就可以看出制作过程中改动了多少。 接下来是主策划根据最初提案文档详细描述游戏的形态,包括游戏概述、游戏玩法、制作计划、市场定位,并初步确定游戏中一些明显的玩点和特征。这份文档将作为开发的凭据进行保存,是整个项目的根本所在。如果它能通过老板或投资方的认可,那么这个游戏就可以开始制作了。 游戏制作的第二步:启动阶段 这一阶段包含两个部分,一个是策划的启动,另一个是程序的启动。而且策划启动得要比程序早一些。 策划方面,需要开始详细整理游戏制作中的分项结构,并预先做游戏制作的控制,这时候需要启动一个策划主文档,这个文档会有比较完整的制作分类,那么以后其他制作人员写好的文档会被整合到这个文档中来,所有有关的内容都可以在这个文档中查到。这个主文档会放在开发组内的服务器上,每个人随时都可以去看。 在程序未进入之前,策划需要确定游戏所需要的程序引擎类别,当然,有时候一些游戏是根据现有程序引擎的特点再立项的。在确定程序引擎后,就需要挑选合适的主程序进入项目了,主程序一般是一些有开发经验的,且自己就有一套引擎的人,要知道,开发一套成熟的引擎是需要一定时间的,所以制作方要么使用主程序的引擎,要么就去外面买一套合适的引擎拿回来用,而程序员就需要花时间适应这套引擎,主程序就是向其他人解释这套东西的人。 启动阶段是策划脑子最忙的阶段,因为太多东西需要预先确定下来,并写成文档,主程序则需要根据策划的文档理解程序方面要实现一些什么样的功能。这期间会有大量的讨论。 游戏制作的第三步:正式制作前期 这一阶段里,一切步入正轨(如果顺利的话),策划开始制定游戏规则,并对游戏世界有一个描述,一些美术图片量也被确立下来。程序则开始在做适合这个游戏的低层搭建

经典游戏制作教程

经典游戏制作教程 peng 1.游戏制作的主要流程 ------------------------------------------------------------------------------- 电脑游戏开发小组中的任何一个人(这个角色通常有策划担任),只要有了一个新的想法或 念头,就孕育着一个新游戏的诞生。在这个创意被充分讨论之后,再加上对其操作过程的趣 味性及市场销售的可行性的预测等因素的准确判断,一个完整的策划方案才可能产生。在经 过充分的讨论后,策划人员必须将讨论的重点写成文字,也就是提出完整的策划方案,经决 策者同意认可后,才能进下一步的工作。这份策划方案就像一部电影的剧本,它必须完整地 涵盖整个游戏的故事、流程、内容、方式、游戏画面、角色造型、场景规划、人工智能、硬 件配备、市场评估等。对整个游戏过程的详细描述及实施规划都应记录在案。当进入创作 过程之后,策划还必须随时和美术设计师和程序设计员保持联系,以免游戏程序的编写失控。 策划应能对游戏设置的内容与精神了如指掌,与各个小组及时沟通,并且控制整个游戏制作 的进程。 2.游戏设计基本论 ------------------------------------------------------------------------------- 要设计一个游戏,首先你必须要确定几个重要方针,第一是你要设计的游戏是属於那一种 类型,第二是时代背景,第三是模式,第四是程式技术,第五是表现手法,第六是市场定位, 第七是研发时间,在掌握上述七个方针之後,你就可以再做详细的规划内容及调配资源,那 麽何谓是七项方针呢? 笔者以范例来说明之! 一、类型: 所谓的类型是指这个游戏所着眼的一个游戏方式,通过这个方式来使玩者达到娱乐的目的,这个游戏方式有专有名词来各别予以命名,兹如下述: (1) RGP角色扮演: 这个类型的游戏以通过故事剧情牵引来使玩家能溶入主角所存在的一个世界,这类型态的 游戏多半透过战斗升级系统及人物对话的方式来一步步完成设计者所布下的剧情路线,最具 代表的作品有日本史克威尔所设计的 "太空战士系列" 及国内大宇资讯所设计的"仙剑奇侠传",当然还有很多部作品例如"神奇传说"等也是此中的佼佼者。 在RGP的类型中,在近几年来又分支了几个类似的型态,例如说Blizzard的"暗黑破坏神"Dirblo"被定位为"动作RPG",因其动作成分相当高所至,而"神奇传说"、"超时空英雄传说"则被定位尽"战略RPG",只因战略成分比重较高所以又有别於传统RPG。 (2) SLG战略: 谈起战略游戏,大家最耳熟能详的应是日本光荣公司所出品的"三个系列",KOEI的三国 志风靡东亚,从一代进化到现阶段的六代皆为玩家们所津津乐道,而所谓的战略游戏则是透

手机游戏开发的5个阶段

目前,开发手机游戏的厂商如同雨后春笋般的冒了出来,有大有小,甚至几个朋友在一起就能攒出一个小公司,进行开发。每个公司,也都有“具备自己特色”的开发过程,好一些的,直接套用传统的软件工程的理论,差一些的,也只能闷头苦干了。我在这里想谈的是对于小团队开发游戏的一种高效的开发方法和阶段划分。 游戏开发的阶段划分,我认为可以划分为5个阶段,叙述如下: 第一阶段:提案 这一阶段要做的主要工作是明确要做什么样的游戏,游戏的名称是什么,采用何种表现方式(2D,2.5D,3D等),游戏的卖点(特色)何在,实现在什么样的平台上,人员如何搭配。 无论是公司还是小团队做游戏的最终目的都是为了盈利,所以做为游戏设计者就应该针对市场来设计游戏,而不能针对个人的喜好而设计游戏。能被大多数人接受的游戏才是一款好游戏,才能更好的盈利。所以在决定做什么游戏之前要先确定主要针对什么样的玩家来做这个游戏,是男孩还是女孩,是老少皆宜还是20多岁的年轻人,这个目标确立了之后才能更好的挖掘这类玩家的心理,使游戏的设计更充分的满足这类玩家心理和精神上的需求,这样游戏才能被更多的玩家接受,团队才能更好的盈利。 根据已选择针对的玩家群体,就该选择适合这个玩家群体的游戏题材,一个游戏题材的选取也非常重要,一个好的题材有助于设计者表现游戏的特色,使玩家很快的了解游戏背景,游戏能够很容易上手,更好的被玩家接受。有三大类游戏题材比较容易被玩家接受:1发布地区人人皆知的历史或宗教;2与常识相关的;3与某有名的故事或电影相关的。总之,在所选玩家群体大部分玩家都熟悉的题材上做游戏会更容易被玩加接受。 然后就是有关游戏概念的设计,需要确定的是游戏的类型(例如:RPG、策略、格斗等),游戏的表现方式(例如:2D、2.5D或3D),在什么平台上实现以及游戏的特色。这些问题都要根据团队的技术实力、市场需求的紧迫程度、开发成本等各方面因素来决定。在确定了游戏的类型、表现方式和实现平台之后,就要在这三个条件的限制之下尽可能的发挥策划的创造力,在游戏特色上尽可能的下功夫,并写出两份文档:一份游戏策划案的提纲和一份立项建议书。在策划案提纲中要让技术人员能够看明白游戏需要具有什么样的功能。在立项建议书中要写清游戏针对的人群,游戏类型,游戏表现方式,游戏实现平台,游戏卖点,实现所需的大致时间,以及人员安排。 完后,招集市场、技术、美工等人员进行集体评审,根据这份立项建议书,客观的评价技术实力,开发周期,市场效应等问题,最终决定是否要做这个游戏。 这个阶段的工作目标就是确定将要做的是一个能被市场广泛接受的游戏并确保游戏的可行性。一个不能被市场接受的游戏或者根本无法实现的游戏设计在这个阶段都会被否定,或做设计上的修改或放弃做这个游戏。尽可能的减少项目实施以后所要承担的风险。 第二阶段:设计 游戏的设计过程中需要策划、程序、美术、市场共同协作完成,一个游戏做得好坏,这个阶段起到了决定性作用,下面将对这四种职责的工作内容分别进

游戏开发制作流程

游戏开发制作流程 1、创意管理:第一步,是召开会议,在会议中最常见的方法就是采取“头脑风暴法”。每个人都必须拿出自己的建议和想法,之后大家一起进行讨论。另外在会 场内,会有专人进行会议记录。而在项目开发的前期则会有市场调查。 2、撰写草案:第二步,撰写策划草案,也叫意向书。撰写策划草案的目的在于,使得小组内每个成员对即将开发的项目有一个大体的认识,并且对目标进行明确。 3、市场分析:第三步,市场分析,决定了是否需要开发这个游戏。 1)、目标客户:最重要的一点是确定目标客户。即该游戏是面向核心玩家,还是普通的大众玩家。如果是面向核心玩家所开发的游戏,则需要游戏的难度更大一些;反之,如果是面向大众玩家开发的游戏,则需要游戏的难度简单一些。最好的方法是允许玩家自定义游戏的难度。 2)、成本估算:以网游为例,包括以下几个方面: 服务器:运行网络游戏所需花费的硬件方面的成本。成本中的大头,大约占到总成本的40%左右。 客服:属于人力成本的范畴。网络游戏不同于单机游戏的部分在于,其不同于单机游戏的“售后不理”的销售模式。用户在玩这个游戏之后,运营商需要不断的提供更新和各种在线服务。 社区关系专员:同上,属于人力成本的范畴。同其它方面的花销相比,这方面几乎可以忽略不计。 开发团队:人力成本,这方面花费的真正大头在核心成员和天才制作人的薪资上。 管理:管理方面花费的成本,这方面成本较少。 用户账号管理:发行成本的一部分,但也属于运营的范畴。至于成本几乎可以忽略不计。 办公室、电脑、家具:这方面是大头,不过这次花费之后,开发下部游戏时基本上花费就不需要或者很少花费了。 带宽:发行成本的一部分,但也属于运营的范畴。成本也是极高的,当然各地可能都不一样。

腾讯如何做游戏

腾讯如何做游戏 从2012年9月中旬开始,腾讯股价进入了新一轮上升,最高突破260港元,市值稳定在600亿美元以上。与之形成强烈对比的是全世界的焦点、著名社交网站Facebook,从千亿美元市值一路滑落,目前只有400亿美元多一点,大约是腾讯的2/3。 虽然一家公司未来的想象空间很重要,但赚不赚钱仍是硬指标,最好是二者兼具。对目前的腾讯而言,刚刚突破2亿用户、光鲜亮丽的微信无疑承担了在资本市场支撑“市梦率”的关键角色,可是真正扛起腾讯在世界舞台上快速崛起大旗的却是游戏。资料个人收集整理,勿做商业用途 2012年8月15日,腾讯公布了第二季度及2012上半年财报。Q2腾讯总收入约105亿元人民币,同比增长56.2%,而不出意外的是,单独披露的网络游戏收入达到了近56亿元,超过腾讯总收入的一半。资料个人收集整理,勿做商业用途 腾讯在游戏上仍然在不停发力。就在财报公布前不久,腾讯于7月与国际知名游戏厂商动视暴雪宣布战略合作,在中国发布《Call of Duty online》(国内玩家习惯称之为《使命召唤》系列);腾讯在第二季度还接连内测了两款耗时数年的游戏大作《御龙在天》与《NBA2K online》,到目前为止成绩骄人,其中“御龙”进入公测前同时在线就已经突破50万人,破百万应该毫无悬念;而6月份,腾讯还入股了游戏开发商Epic Games,后者以“虚幻引擎”和游戏《战争机器》系列在国际上名声赫赫。资料个人收集整理,勿做商业用途 可以想见,在未来相当长一段时间里,腾讯游戏还将充当整个腾讯集团“现金牛”的角色,起码就现在看来,其强劲势头未见衰减之势,反而越来越显得风生水起。资料个人收集整理,勿做商业用途 如果从中国网游行业的角度来看,这实在算是异数。整个网游市场在2008年达到顶峰,整个盘子约200亿元,可从2009年开始增长率大幅减缓,被业内称为“冬天来了”,至今未见起色。网络游戏仍然是一门赚钱的生意,可从2008年以后,相对之后火爆的电子商务和移动互联网市场,逐渐失去了想象空间。而腾讯游戏在这样的整体市场状况下,2007年初只有5%多一点的市场份额,在前5名之外,2008年就猛增到15%左右,直接进入三甲。2012年Q2,网游市场因为主流用户是学生群体,环比出现负增长,腾讯继续逆势增长,占到了整个市场超过35%的份额,其收入的净增量占到全行业的62%。资料个人收集整理,勿做商业用途将这一切简单归功于腾讯QQ海量用户的资源牵引未免过于牵强,因为腾讯早就想要染指游戏,在2004年曾经遭遇失败,蛰伏4年,直至2008年才崛起。那么是什么让今天的腾讯游戏如此赚钱?从腾讯互动娱乐部发展至腾讯互动娱乐事业群(以下简称“互娱”),这个低调的“部门”又从哪里汲取了更多成长动力?只有深入其中,方能探究答案。资料个人收集整理,勿做商业用途 实战创新与快响应 2003年,随着一款名为《凯旋》的网游公测,腾讯正式进入网游市场。一切的结合看起来都那么完美:韩国科学院顶级技术力量,次时代的全3D引擎,韩国、中国台湾市场前期的成功,中国网游市场日趋成熟,搭配腾讯的用户优势、运营能力、用户理解……可最终,这款当初腾讯抱有很大期望的游戏无疾而终。资料个人收集整理,勿做商业用途 “之后我们进行反思,当初选择游戏的时候,最重视游戏画面、体验,这是典型的产品型视角。” 腾讯互动娱乐事业群副总裁程武说,“可是游戏门槛比较高,难以上手,甚至在中国很多网吧电脑的显卡都不支持。做这款游戏并没有真正从中国本土的实际情况和用户需求出发。”资料个人收集整理,勿做商业用途 这个教训成为了腾讯之后做游戏最重要的几条准则之一。腾讯气质里让人保有敬意和惧意的“耐心”在其后几年在互娱的故事里被证明,《凯旋》的技术积累、创意积累和人的积累被保留了下来,而什么才是真正的用户需求,成为了之后持续思考的问题。资料个人收集整理,

游戏开发制作流程与分工详细介绍

一、项目计划阶段 1、创意管理:第一步,是召开会议,在会议中最常见的方法就是采取“头脑风暴法”。每个人都必须拿出自己的建议和想法,之后大家一起进行讨论。另外在会场内,会有专人进行会议记录。而在项目开发的前期则会有市场调查。 2、撰写草案:第二步,撰写策划草案,也叫意向书。撰写策划草案的目的在于,使得小组内每个成员对即将开发的项目有一个大体的认识,并且对目标进行明确。 3、市场分析:第三步,市场分析,决定了是否需要开发这个游戏。 1)、目标客户:最重要的一点是确定目标客户。即该游戏是面向核心玩家,还是普通的大众玩家。如果是面向核心玩家所开发的游戏,则需要游戏的难度更大一些;反之,如果是面向大众玩家开发的游戏,则需要游戏的难度简单一些。最好的方法是允许玩家自定义游戏的难度。 2)、成本估算:以网游为例,包括以下几个方面: 服务器:运行网络游戏所需花费的硬件方面的成本。成本中的大头,大约占到总成本的40%左右。 客服:属于人力成本的范畴。网络游戏不同于单机游戏的部分在于,其不同于单机游戏的“售后不理”的销售模式。用户在玩这个游戏之后,运营商需要不断的提供更新和各种在线服务。 社区关系专员:同上,属于人力成本的范畴。同其它方面的花销相比,这方面几乎可以忽略不计。 开发团队:人力成本,这方面花费的真正大头在核心成员和天才制作人的薪资上。 管理:管理方面花费的成本,这方面成本较少。 用户帐号管理:发行成本的一部分,但也属于运营的范畴。至于成本几乎可以忽略不计。

办公室、电脑、家具:这方面是大头,不过这次花费之后,开发下部游戏时基本上花费就不需要或者很少花费了。 带宽:发行成本的一部分,但也属于运营的范畴。成本也是极高的,当然各地可能都不一样。 网管:发行成本的一部分,同样属于运营成本的范畴。 其它杂费:杂七杂八的一些费用,包括水电费、燃气费、可能还会包括买咖啡和茶叶的钱。 宣传、广告和推广的费用:属于运营成本。应该说最好的宣传方法就是广告,但各种广告在花费上都不尽相同,这个就不细说了。 客户端:制作游戏客户端、点卡、充值卡、印制游戏说明书、游戏包装、游戏赠品一类的成本。 4、需求分析 第四步,撰写需求分析书。这包括以下三个方面: 1)、美工需求:撰写美工需求分析书,内容包括需求图、工作量等。其中工作量需要以天来计。内容具体如下: 场景:包括游戏地图、小场景等方面。 人物:包括玩家角色、重要NPC(玩家队友、提供任务的NPC、主线剧情NPC等)、次要NPC(路人、村民等)、怪物、BOSS等。 动画:动画方面估计每个公司的需求都不尽相同。如果公司能力有限,动画的制作可以考虑外包的方式。 道具:主要需要考虑是否采取纸娃娃系统。 全身像:人物的全身像方面。

手机游戏作品开发- 课程教学大纲

《手机游戏作品开发》课程教学大纲 一、课程基本信息 课程名称:手机游戏作品开发 课程编码: 课程性质:职业岗位限选 总学时:24+12 总学分:2 考核方式:考查 开课学期:7 适用专业:数字媒体技术专业 先修课程:计算机应用基础,Java 教研室: 执笔人: 审核人: 编写(修订)日期: 二、教学目标 本课程以案例教学为主线,循序渐进地介绍Android游戏开发的基本知识与技巧。 通过本课程的学习,熟悉Android的操作环境,掌握Android项目结构、项目结构、资源管理、生命周期、布局与基础组件、事件处理、多线程与消息处理、游戏视图、图形特效、游戏动画等基本知识,并能运用所学知识及所掌握技能实现简单游戏的构建及发布,为培养游戏制作专业人才打下坚实的基础。 三、教学内容及要求 第1部分 Andorid基础知识(理论2学时) 主要内容及要求: 了解Android的体系结构、特性及版本,掌握Android开发环境搭建,掌握Android的生命周期,掌握Android应用的国际化方法,了解Android的计量单位,学会Android项目的运行和调试,掌握Android项目资源的创建与使用,掌握消息提示以对话框的使用。 重点、难点: Android project项目结构,Android资源使用,消息提示以对话框 其它教学环节: 1.下载JDK,Eclipse,SDK,ADT,安装并配置Android开发环境 第2部分 Android游戏开发之视图界面(理论12学时) 主要内容及要求:

掌握5种布局管理器的使用,掌握游戏开发的常用组件,熟悉使用xml和Java代码混合控制ui界面,掌握Android的生命周期,掌握activity页面切换及传递数据的方法,掌握Android的事件处理机制 重点、难点: 基本程序单元――活动,Android事件处理 其它教学环节: 实验视图界面程序设计 1、实验类型:基础性、验证性 2、实验学时分配:6学时 3、每组人数:1 4、实验内容及要求:认真完成相关实验,掌握视图界面相关知识与技巧 第3部分 Android游戏开发之图形界面(理论10学时) 主要内容及要求: 掌握消息类Message的应用,掌握消息处理类Handler的应用,掌握子线程中更新ui 的方法,掌握View和SurfaceView视图框架,掌握Canvas画布和paint画笔的应用,掌握位图操作方法,掌握图像特效设置,掌握动画 重点、难点: 线程与消息处理,Android二维游戏开发视图 其它教学环节: 实验二维图形界面程序设计 1、实验类型:基础性、验证性 2、实验学时分配:6学时 3、每组人数:1 4、实验内容及要求:认真完成相关实验,掌握图形界面相关知识与技巧 四、教学策略与方法 教学策略:拟采用案例驱动策略组织教学活动 教学方法:拟采用教授法、演示法、训练和实践法等教学方法实施教学活动 五、教材与学习资料 教材:Android游戏开发案例教程,张辉主编,清华大学出版社,2015.6。 六、实施本教学大纲应注意的问题 该课程是一门实践性很强的应用学科,为达到教学目标,建议 1.授课地点为多媒体实验室,采用多媒体广播教学,理论联系实际,充分运用案例驱动教学,让学生有边看边学边实践的机会。 2.在教学时根据课程特点、学生情况、专业特点,实践课与教学进度同步进行。

XX年腾讯游戏策划岗位笔试题目

XX年腾讯游戏策划岗位笔试题目 时间:XX-9-27 地点:深圳 一、基础只是选择题 1. 在“驯龙高手”系列电影中,男主角属于哪个种族? A、日耳曼人 B、罗马人 c、维京人 D、斯巴达人 2. “雷神托尔”是哪个神话中的人物? A、希腊神话 B、北欧神话 c、玛雅神话 D、罗马神话 3. 应对雾霾污染、改善空气质量的首要人物是控制 A、汽车尾气 B、工业生产排放的废气 c、 D、建筑工地和道路交通产生的扬尘 4. 一下哪个产品不是出自腾讯? A、微云 B、滴滴打车 c、财付通 D、微信 5. “中国国际数码互动娱乐展览会”的英文缩写是 A、TGS B、TGA c、E3 D、cj 6. 有10颗糖,如果每天至少吃一颗,吃完为止,问有多少种不同的吃法?

A、144 B、217 c、512 D、640 7. 第一部编年体史书是 A、山海经 B、春秋 c、资治通鉴 D、史记 8. 《海贼王》主角路飞吃了哪种恶魔果实 A、烟雾果实 B、沿江果实 c、橡胶果实 D、黑暗果实 9. 《洛神赋》是谁的作品? A、曹操 B、曹植 c、蒲松龄 D、李贺 10. 以下哪一场战役不是以少胜多的战役? A、夷陵之战 B、巨鹿之战 c、淝水之战 D、官渡之战 11. 以下哪个角色不是出自《火影忍者》? A、大蛇丸 B、旗木卡卡西 c、黑崎一护 D、李洛克 12. 以下哪部电影不是出自美国? A、被解救的姜戈 B、逃离德黑兰 c、三傻大闹宝莱坞 D、少年派的奇幻漂流 13. 以下不属于“美国漫画英雄”系列的是 A、蝙蝠侠 B、超人 c、战神奎托斯 D、雷神索尔 14. 以下哪一个公司的主要业务与其他三个不同?

手机游戏开发流程

J2ME游戏开发流程 一款J2ME游戏的开发流程大致如下: 以下为文字描述: 1、立项 在制作游戏之前,策划首先要确定一点:到底想要制作一个什么样的游戏?而要制作一个游戏并不是闭门造车,一个策划说了就算数的简单事情。制作一款游戏受到多方面的限制:市场:即将做的游戏是不是具备市场潜力?在市场上推出以后会不会被大家所接受?是

否能够取得良好的市场回报? 技术:即将做的游戏从程序和美术上是不是完全能够实现?如果不能实现,是不是能够有折中的办法? 规模:以现有的资源是否能很好的协调并完成即将要做的游戏?是否需要另外增加人员或设备? 周期:游戏的开发周期是否长短合适?能否在开发结束时正好赶上游戏的销售旺季? 产品:即将做的游戏在其同类产品中是否有新颖的设计?是否能有吸引玩家的地方?如果在游戏设计上达不到革新,是否能够在美术及程序方面加以补足?如果同类型的游戏市场上已经有了很多,那么即将做的游戏的卖点在哪里? 以上各个问题都是要经过开发组全体成员反复进行讨论才能够确定下来的,大家一起集思广益,共同探讨一个可行的方案。如果对上述全部问题都能够有肯定的答案的话,那么这个项目基本是可行的。但是即便项目获得了通过,在进行过程中也可能会有种种不可预知的因素导致意外情况的发生,所以项目能够成立,只是游戏制作的刚开始。 在项目确立了以后,下一步要进行的就是进行游戏的大纲策划工作。 2、大纲策划的进行 游戏大纲关系到游戏的整体面貌,当大纲策划案定稿以后,没有特别特殊的情况,是不允许进行更改的。程序和美术工作人员将按照策划所构思的游戏形式来架构整个游戏,因此,在制定策划案时一定要做到慎重和尽量考虑成熟。 3、游戏的正式制作 当游戏大纲策划案完成并讨论通过后,游戏就由三方面同时开始进行制作了。在这一阶段,策划的主要任务是在大纲的基础上对游戏的所有细节进行完善,将游戏大纲逐步填充为完整的游戏策划案。根据不同的游戏种类,所要进行细化的部分也不尽相同。 在正式制作的过程中,策划、程序、美工人员进行及时和经常性的交流,了解工作进展以及是否有难以克服的困难,并且根据现实情况有目的的变更工作计划或设计思想。三方面的配合在游戏正式制作过程中是最重要的。 4、配音、配乐 在程序和美工进行的差不多要结束的时候,就要进行配音和配乐的工作了。虽然音乐和音效是游戏的重要组成部分,能够起到很好的烘托游戏气氛的作用,但是限于J2ME游戏的开发成本和设置的处理能力,这部份已经被弱化到可有可无的地步了。但仍应选择跟游戏风格能很好配合的音乐当作游戏背景音乐,这个工作交给策划比较合适。 5、检测、调试 游戏刚制作完成,肯定在程序上会有很多的错误,严重情况下会导致游戏完全没有办法进行下去。同样,策划的设计也会有不完善的地方,主要在游戏的参数部分。参数部分的不合理,会导致影响游戏的可玩性。此时测试人员需检测程序上的漏洞和通过试玩,调整游戏的各个部分参数使之基本平衡。

……网络游戏角色模型制作流程

网络游戏角色模型制作流程: 工具:3D max or Maya (模型制作) Bodypaint and photoshop(贴图绘制) Ufold(Uv插件) 面数:534 贴图一张大小:512X512 (最终效果) 模型制作:跳过…… 制作完成后把模型导出导出格式为OBJ 分UV: 网游角色分UV插件Unfold 打开Unfold 打开刚刚导出的OBJ格式的模型文件

调整操作方式:点击右上角edit mouse binding 在Load presets下选择Alias Wavefront Maya 点击OK 把控制方式调整成Maya的操作方式 Alt+鼠标左键:平移 Alt+鼠标中键:缩放 Alt+鼠标右键:旋转 Ctrl+鼠标左键:减选+鼠标右键:框选减选

右侧工具栏从上只下分别是: 1.光影显示 2.线框显示 3.光影线框显示 4.UV棋盘格显示 5.关闭开启灯光 6.视角回归物体 7.断开 8.线选择 9.面选择 鼠标左键点击线选择按住shift可选择整条线 选择后按断开线 断开后线成橙黄色表明已断开 然后点击上方的工具栏中的Unfold 在右边的显示框内得到UV

图中有黄色的地方说明UV有拉伸颜色越靠近橙黄色说明拉伸越严重 如上图的的颜色可忽视 可根据具体情况切分UV 完成后Ctrl+S保存Unfold将自动保存为新的OBJ文件文件名为 文件名_Unfold3d 然后将分好UV的OBJ模型导入MAYA或者3DMAX里面调整大小布局 Unfold使用方法介绍完毕 第二部分 网络游戏的贴图绘制 主要软件Bodypainter 3D 这里在使用软件不同的情况下有3种启动BP的方式 直接用MAX的启动方式: 将BP安装包中的b3d.bmi和bodyex.dlu两个文件放到MAX安装地址中的插件管理包“plugins”这个文件夹中 然后进入MAX

游戏开发制作流程详细介绍

游戏开发制作流程详细介绍-标准化文件发布号:(9456-EUATWK-MWUB-WUNN-INNUL-DDQTY-KII

游戏开发制作流程详细介绍 一、项目计划阶段 1、创意管理:第一步,是召开会议,在会议中最常见的方法就是采取“头脑风暴法”。每个人都必须拿出自己的建议和想法,之后大家一起进行讨论。另外在会场内,会有专人进行会议记录。而在项目开发的前期则会有市场调查。 2、撰写草案:第二步,撰写策划草案,也叫意向书。撰写策划草案的目的在于,使得小组内每个成员对即将开发的项目有一个大体的认识,并且对目标进行明确。 3、市场分析:第三步,市场分析,决定了是否需要开发这个游戏。 1)、目标客户:最重要的一点是确定目标客户。即该游戏是面向核心玩家,还是普通的大众玩家。如果是面向核心玩家所开发的游戏,则需要游戏的难度更大一些;反之,如果是面向大众玩家开发的游戏,则需要游戏的难度简单一些。最好的方法是允许玩家自定义游戏的难度。 2)、成本估算:以网游为例,包括以下几个方面: 服务器:运行网络游戏所需花费的硬件方面的成本。成本中的大头,大约占到总成本的40%左右。 客服:属于人力成本的范畴。网络游戏不同于单机游戏的部分在于,其不同于单机游戏的“售后不理”的销售模式。用户在玩这个游戏之后,运营商需要不断的提供更新和各种在线服务。 社区关系专员:同上,属于人力成本的范畴。同其它方面的花销相比,这方面几乎可以忽略不计。 开发团队:人力成本,这方面花费的真正大头在核心成员和天才制作人的薪资上。 管理:管理方面花费的成本,这方面成本较少。 用户帐号管理:发行成本的一部分,但也属于运营的范畴。至于成本几乎可以忽略不计。 办公室、电脑、家具:这方面是大头,不过这次花费之后,开发下部游戏时基本上花费就不需要或者很少花费了。 带宽:发行成本的一部分,但也属于运营的范畴。成本也是极高的,当然各地可能都不一样。

安卓(Android)游戏以与手机游戏开发的详细流程

安卓(Android)游戏以及手机游戏开发的详细流程【精华版】 >>首先说游戏设计部门 通常这是如下职位:游戏设计主负责(也有称主策划) 执行游戏设计师(称执行策划):分剧情策划,数据策划,也有不分的,大家一起提高。辅助员(称辅助策划):做一些比较简单的表据维护,资料收集。 工作职责: 游戏设计主负责人:主要负责游戏设计的整体把握、给大家安排工作,审核工作,提高部门人员士气。, 剧情策划一般负责背景,任务等等故事性比较强的,要求文笔要好 数据策划再细分,为规则和数据平衡,包括规则的描述,公式确定,数据表设定等等。 辅助员,主要是收集资料,维护表格等等,比较不涉及核心的工作。 *注:有一些公司或者团队,在策划岗位,还有新的岗位,如: 表现策划:主要负责特效、动作、音效收集并提需求,部分如音效部分亦有策划来完成。资源策划:主要负责UI设计,模型相关配置,资源管理等等。

>>下面是程序部门 主程序与主设计师,是对游戏引擎最了解的人,以主程序为最强。主程的主要工作,安排程序部门工作,定游戏的数据结构,定一些主要方案的完成方法。 一般程序员,分服务器端与客户端、服务器端程序,对于数据库结构,数据传输、通讯方式等等。客户端程序,对图像及优化有研究的会易受重用。 >>美术部门 主美负责整体美术风格的把握 原画绘制原画交于3D 2D负责贴图,游戏界面等的制作 3D负责3D建模,动作等方面工作 >>脚本与编辑器 在具体游戏实现时,越来越多的公司不会说把游戏中的数据写在C++里,而是用“脚本与数据库”的方式。 C++的作用是用来解释脚本和调用数据库的 在脚本中,写上, if

相关主题
文本预览
相关文档 最新文档