安卓贪吃蛇游戏设计.doc_第1页
安卓贪吃蛇游戏设计.doc_第2页
安卓贪吃蛇游戏设计.doc_第3页
安卓贪吃蛇游戏设计.doc_第4页
安卓贪吃蛇游戏设计.doc_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程设计实习实训手册专 业: 10嵌入式系统工程 实训名称: Android贪吃蛇游戏设计班 级: 姓 名:_学 号: 指导教师: 起止时间:201 年 月 日 至201 年 月 日信息工程系Android贪吃蛇游戏设计 Android是基于Linux开放性内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统。 早期由原名为Android的公司开发,谷歌在2005年收购Android.Inc后,继续对Android系统开发运营,它采用了软件堆层(software stack,又名软件叠层)的架构,主要分为三部分。底层Linux内核只提供基本功能,其他的应用软件则由各公司自行开发,部分程序以Java编写。1 项目背景说明针对当今游戏开发的流行趋势,手机游戏的设计已成为主流,随着计算机技术及硬件技术的不断发展,用户的需求量也越来越多,并且用户追求的效果也越来越好,在此形势下好的设计方法尤为重要,基于android系统的手机游戏设计方法简单且效率较高。贪吃蛇游戏也是很多人热衷的游戏,用户不仅要求其界面设计精美,更希望操作简单,程序执行速度快。Android支持使用Java作为编程语言来开发应用程序,而Android的Java开发方面从接口到功能,都有层出不穷的变化。考虑到Java虚拟机的效率和资源占用,谷歌重新设计了Android的Java,以便能提高效率和减少资源占用,因而与J2ME等不同。 操作系统与应用程序的沟通桥梁,应用分为两层:函数层(Library)和虚拟机(Virtual Machine)。Android的中间层多以Java 实现,并且采用特殊的Dalvik 虚拟机(Dalvik Virtual Machine)。Dalvik虚拟机是一种“暂存器型态”(Register Based)的Java虚拟机,变量皆存放于暂存器中,虚拟机的指令相对减少。贪吃蛇游戏是一款老牌的手机游戏,同时也是一款比较需要耐心地游戏。贪吃蛇游戏就是一条小蛇,不停地在屏幕上游走,吃各个方向出现的食物,越吃越长。只要蛇头碰到屏幕四周,或者碰到自己的身子,小蛇就立即毙命。玩“贪吃蛇游戏”,难度最大的不是蛇长得很长的时候,而是开始的时候。那时蛇身很短,看上去难度不大,却最容易死掉,因为把玩一条小蛇让人容易走神,失去耐心。Android应用越来越广泛,开发Android游戏也渐渐成为市场的必须,本游戏的开发是基于Android1.5系统,采用eclipse编程实现。2 时间安排 消化资料、系统调查1天系统分析、总体设计,实施计划 5天撰写报告 2天演示、验收 1天3 具体要求1、 明确课程设计的目的和重要性,认真领会课程设计的题目,读懂课程设计指导书的要求,学会设计的基本方法与步骤,学会如何运用前修知识与收集、归纳相关资料解决具体问题的方法。严格要求自己,要独立思考,按时、独立完成课程设计任务。2、 设计报告:要求层次清楚、整洁规范、不得相互抄袭,凡正文内容有整段完全相同者一律以抄袭论处。4设计与实现具体实现过程分为以下3步:项目框架、游戏类图设计、界面设计。项目框架新建一个Eclipse工程并命名为Snake,工程如下图所示:图1.1 Snake工程工程中包括4个Activity,分别为Snake(主界面)、Game(游戏界面)、Help(游戏说明界面)、AuthorView(作者信息界面),通过不同Activity之间的转换实现不同界面之间的切换。游戏主界面如下图所示:图1.2 游戏主界面游戏类图设计Game(Activity)继承了SnakeView类,SnakeView类继承了TileView类。TileView类继承了View,如下图所示:Game(Activity)SnakeViewTileViewView图1.3 类图TiltView的基类是View,包含了贪吃蛇游戏画面的各个设定参数,主要负责绘制游戏画面。TileView类定义如下:public class TileView extends View private static final String tag = yao;protected static int mTileSize = 20;/方格的边长protected static int mXTileCount;/X轴上方格的个数protected static int mYTileCount;/Y轴上方格的个数private static int mXOffset;/绘图时X轴上的起始坐标private static int mYOffset;/绘图时Y轴上的起始坐标private Bitmap mTileArray;/位图数组private int mTileGrid;/映射整个游戏画面的数组private final Paint mPaint = new Paint();/画笔public TileView(Context context, AttributeSet attrs) super(context, attrs);Log.i(tag, TileView Constructor);Log.i(tag, mTileSize= + mTileSize);/重置位图数组的长度public void resetTiles(int tilecount) mTileArray = new Bitmaptilecount;Override/适应各种分辨率的屏幕,当改变屏幕大小尺寸时,同时修改tile的相关计数指标protected void onSizeChanged(int w, int h, int oldw, int oldh) Log.i(tag, onSizeChanged, + w= + w + h= + h + oldw= + oldw + oldh= + oldh);mXTileCount = (int) Math.floor(w / mTileSize);mYTileCount = (int) Math.floor(h / mTileSize);Log.i(tag, mXTileCount= + mXTileCount);Log.i(tag, mYTileCount= + mYTileCount);mXOffset = (w - (mTileSize * mXTileCount) / 2);mYOffset = (h - (mTileSize * mYTileCount) / 2);Log.i(tag, mXOffset= + mXOffset);Log.i(tag, mYOffset= + mYOffset);mTileGrid = new intmXTileCountmYTileCount;clearTiles();/这里做了一个 Drawable 到 bitmap 的转换public void loadTile(int key, Drawable tile) Bitmap bitmap = Bitmap.createBitmap(mTileSize, mTileSize, Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(bitmap);tile.setBounds(0, 0, mTileSize, mTileSize);tile.draw(canvas);mTileArraykey = bitmap;/清空图形显示public void clearTiles() Log.i(tag, TileView.clearTiles);for (int x = 0; x mXTileCount; x+) for (int y = 0; y mYTileCount; y+) setTile(0, x, y);/在相应的坐标位置绘制相应的砖块public void setTile(int tileindex, int x, int y) mTileGridxy = tileindex;/ onDrawOverride/将直接操作的画布绘制到手机界面上public void onDraw(Canvas canvas) Log.i(tag, onDraw);super.onDraw(canvas);Bitmap bmp;float left;float top;for (int x = 0; x mXTileCount; x+) for (int y = 0; y 0) bmp = mTileArraymTileGridxy;left = x * mTileSize + mXOffset;top = y * mTileSize + mYOffset;canvas.drawBitmap(bmp, left, top, mPaint);SnakeView类定义了游戏运行时的画面改变及蛇体和果子的更新方法。首先用Handler机制实现定时刷新,代码如下:class RefreshHandler extends Handler /获取消息并处理Overridepublic void handleMessage(Message msg) SnakeView.this.update();SnakeView.this.invalidate();/刷新view为基类的界面Log.i(tag, handleMessage|Thread Name=+Thread.currentThread().getName(); /定时发送消息给UI线程,以此达到更新效果public void sleep(long delayMillis) this.removeMessages(0); /清空消息队列,Handler进入对新消息的等待 Log.i(tag, sleep|Thread Name=+Thread.currentThread().getName();/定时发送新消息,激活handler sendMessageDelayed(obtainMessage(0), delayMillis);定义SnakeView()函数初始化游戏,代码如下:public SnakeView(Context context, AttributeSet attrs) super(context, attrs);Log.i(tag, SnakeView Constructor);initSnakeView();/构造函数中,初始化游戏定义initSnakeView()初始化SnakeView类,代码如下:private void initSnakeView() Log.e(tag, initSnakeView);/设置焦点,由于存在 文字界面 和 游戏界面的跳转。这个focus是不可或缺的。setFocusable(true);/取得资源中的图片,加载到 砖块字典 中。 Resources r = this.getContext().getResources();resetTiles(4);loadTile(RED_STAR, r.getDrawable(R.drawable.redstar);loadTile(YELLOW_STAR, r.getDrawable(R.drawable.yellowstar);loadTile(GREEN_STAR, r.getDrawable(R.drawable.greenstar);此外还定义了updateWalls()、updateApples()、updateSnake()绘制墙、果子、蛇,以及更新画面函数、保存位置坐标函数等,具体代码请详见目录。界面设计界面设计包括游戏主界面(Snake)、作者信息界面、游戏说明界面、游戏界面的设计。界面的设计采用的是xml文档形式,在xml文档中规划好界面布局布局后,分别在java文件中声明。主界面设计:主界面包括一个 TextView、一个imagebutton、三个button,其main.xml文档如下: 其对应的Snake.java文件如下:public class Snake extends Activity /* Called when the activity is first created. */ Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); initialstart();/初始化 public void initialstart() ImageButton imageButton = (ImageButton)this.findViewById(R.id.ImageButton1); Button button1 = (Button)this.findViewById(R.id.Button1); Button button3 = (Button)this.findViewById(R.id.Button3); Button button5 = (Button)this.findViewById(R.id.Button5); button1.setText(作者信息); button3.setText(退出); button5.setText(游戏说明); imageButton.setImageResource(R.drawable.icon1); /按钮注册到各自的监听器 imageButton.setOnClickListener(new View.OnClickListener() public void onClick(View view) Intent intent=new Intent(); intent.setClass( Snake.this,Game.class); startActivity(intent);/跳转到Game界面 Snake.this.finish(); ); button1.setOnClickListener(new View.OnClickListener() public void onClick(View view) /setContentView(R.layout.author); Intent intent=new Intent(); intent.setClass( Snake.this,AuthorView.class); startActivity(intent);/跳转到作者信息界面 Snake.this.finish();/注销跳转之前的界面 ); button3.setOnClickListener(new View.OnClickListener() public void onClick(View view) Snake.this.finish();/退出应用程序 ); button5.setOnClickListener(new View.OnClickListener() public void onClick(View view) Intent intent=new Intent(); intent.setClass( Snake.this,Help.class); startActivity(intent);/跳转到游戏说明界面 Snake.this.finish(); ); 游戏界面设计:游戏界面包括一个 button,一个my.game.snake.SnakeView,其game.xml文档如下:相对应的Game.java文件如下:public class Game extends Activity/定义游戏参数private SnakeView mSnakeView;private static String ICICLE_KEY = snake-view;private int mMode = READY;public static final int PAUSE = 0;public static final int READY = 1;public static final int RUNNING = 2;public static final int LOSE = 3;Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.game); mSnakeView = (SnakeView) findViewById(R.id.snake); /设置界面背景 mSnakeView.setBackgroundResource(R.drawable.background); TextView tv = (TextView) findViewById(R.id.text); Button button4 = (Button)this.findViewById(R.id.button4); /根据TextView状态判断是否开始游戏 mSnakeView.setStatusTextView(tv); if (savedInstanceState = null) mSnakeView.setMode(SnakeView.READY); else Bundle bundle = savedInstanceState.getBundle(ICICLE_KEY);if (bundle != null) mSnakeView.restoreState(bundle); else mSnakeView.setMode(SnakeView.PAUSE); /按钮注册到监听器 button4.setOnClickListener(new View.OnClickListener() public void onClick(View view) Intent intent=new Intent(); intent.setClass( Game.this,Snake.class); startActivity(intent); Game.this.finish(););/设置键盘监听事件,若按下UP键则开始游戏public boolean onKeyDown(int keyCode, KeyEvent msg) if (keyCode = KeyEvent.KEYCODE_DPAD_UP) if (mMode = READY | mMode = LOSE) mSnakeView.initNewGame();mSnakeView.setMode(RUNNING);mSnakeView.update();return (true);return super.onKeyDown(keyCode, msg);/判断游戏状态是否为暂停protected void onPause() super.onPause(); / Pause the game along with the activity mSnakeView.setMode(SnakeView.PAUSE); Override /保存事件状态 public void onSaveInstanceState(Bundle outState) outState.putBundle(ICICLE_KEY, mSnakeView.saveState(); 作者信息界面设计:此界面包括一个 TextView、一个button,其author.xml文档如下: 相对应的AuthorView.java文件如下:public class AuthorView extends ActivityOverride public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.author); Button button2 = (Button)this.findViewById(R.id.Button2); /按钮注册到监听器 button2.setOnClickListener(new View.OnClickListener() public void onClick(View view) Intent intent=new Intent(); intent.setClass( AuthorView.this,Snake.class); /跳转到主界面 startActivity(intent); /注销当前界面 AuthorView.this.finish(); ); 游戏说明界面设计:此界面包括一个TextView、一个button,其help.xml文档如下: 相对应的Help.java文件如下:public class Help extends ActivityOverride public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.help); Button button6 = (Button)this.findViewById(R.id.Button6); /按钮注册到监听器 button6.setOnClickListener(new View.OnClickListener() public void onClick(View view) Intent intent=new Intent(); intent.setClass( Help.this,Snake.class); /跳转到主界面 startActivity(intent); /注销当前界面 Help.this.finish(); ); 至此,全部界面设计完成,但还有最重要的一步,就是将所有的Activity注册到AndroidManifest.xml中。AndroidManifest.xml文档如下: 另外strings.xml中定义了常量字符,文档如下: Hello World, Snake! Snake 贪吃蛇n按两次“向上”键开始暂停中n按“向上”键恢复游戏结束n得分: n按“向上”键开始n按“返回”按钮退出游戏至此,贪吃蛇游戏设计完毕。3项目演示程序运行效果图如下:图3.1 进入Snake应用程序图3.2 游戏主界面图3.3 游戏开始界面图3.4 游戏运行界面图3.5 游戏结束界面由于涉及到个人信息,所以未给出截图图3.6 作者信息界面图3.7 游戏说明界面4 小结本课程的设计的目的是通过实践使同学们经历面向对象全过程和受到一次综合训练,以便能较全面地理解、掌握和综合运用所学的知识。结合具体的开发案例,理解并初步掌握系统分析、系统设计、系统实施的主要环节和步骤以及软件文档的制作能力。附录TileView.javapackage my.game.snake;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.drawable.Drawable;import android.util.AttributeSet;import android.util.Log;import android.view.View;public class TileView extends View private static final String tag = yao;protected static int mTileSize = 20;/方格的边长protected static int mXTileCount;/X轴上方格的个数protected static int mYTileCount;/Y轴上方格的个数private static int mXOffset;/绘图时X轴上的起始坐标private static int mYOffset;/绘图时Y轴上的起始坐标private Bitmap mTileArray;/位图数组privat

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论