`
wo_deqing
  • 浏览: 64197 次
文章分类
社区版块
存档分类
最新评论

Android游戏开发入门: 贪吃蛇 源代码分析

 
阅读更多

作为一个刚入门或者还没入门的新手,着实花了我一些力气来理解这段代码。

对于各种不懂的地方,慢慢查询资料,对于新的方法,通过修改代码尝试效果。到现在终于能算个一知半解。

在代码中,对于自己有所收获的地方,我都做了相应的注释。

回过头来,觉得从这段代码中,能学到不少东西~~

包括Android应用的基本架构,他的面向对象的思想,以及代码的简洁明了。

于是,我想到,何不将这些东西分享出来,如果碰巧对感兴趣的朋友们有搜帮助,那就更好了~

好了,闲话不说~代码和注释如下(处于对源码的敬意,原本的英文注释部分都没有删去~大家可以配合理解):

PS:最近我正在写自己的“贪吃蛇”,说事贪吃蛇,其实完全颠覆了这个经典版本的设计理念和操作方式。具体细节先卖一个关子,作品准备参加这次第二届大学生Android应用开发大赛。

Snake工程中,总共有三个文件: *TileView是基于Android的View类实现的方块图类,用来支撑上层类的调用,绘制方块图的显示界面。通过这些代码,能打之了解如何 扩展View,实现特色的界面效果。 *SnakeView调用了TileView,实现了游戏逻辑 和 具体的显示。 *Snake为主Activity类。

建议大家按照上面的顺序看三个文件,可能逻辑上更舒服一点~~

下面贴上代码和注释。

PS: 调试版本为Android2.2。 其他版本应该也没问题吧,不过得用虚拟机。因为它是上下左右按键操作,现在大多数android机是没有方向键的吧。


  1: package com.example.Android.snake;  

  2: import Android.content.Context;  

  3: import Android.content.res.TypedArray;  

  4: import Android.graphics.Bitmap;  

  5: import Android.graphics.Canvas;  

  6: import Android.graphics.Paint;  

  7: import Android.graphics.drawable.Drawable;  

  8: import Android.util.AttributeSet;  

  9: import Android.view.View;  

 10: /**

 11:  * TileView: a View-variant designed for handling arrays of "icons" or other

 12:  * drawables.

 13:  * 

 14:  */

 15: public class TileView extends View {  

 16: /**

 17:      * Parameters controlling the size of the tiles and their range within view.

 18:      * Width/Height are in pixels, and Drawables will be scaled to fit to these

 19:      * dimensions. X/Y Tile Counts are the number of tiles that will be drawn.

 20:      */

 21: protected static int mTileSize; //每个tile的边长的像素数量 

 22: protected static int mXTileCount; //屏幕内能容纳的 X方向上方块的总数量 

 23: protected static int mYTileCount;//屏幕内能容纳的 Y方向上方块的总数量 

 24: private static int mXOffset; //原点坐标,按pixel计。 

 25: private static int mYOffset;  

 26: /**

 27:      * A hash that maps integer handles specified by the subclasser to the

 28:      * drawable that will be used for that reference

 29:      * 存储着不同种类的bitmap图。通过resetTiles,loadTile,将游戏中的方块加载到这个数组。

 30:      * 可以理解为 砖块字典

 31:      */

 32: private Bitmap[] mTileArray;      

 33: /**

 34:      * A two-dimensional array of integers in which the number represents the

 35:      * index of the tile that should be drawn at that locations

 36:      * 存储整个界面内每个tile位置应该绘制的tile。

 37:      * 可看作是我们直接操作的画布。

 38:      * 通过setTile、clearTile 进行图形显示的修改操作。 

 39:      * 

 40:      */

 41: private int[][] mTileGrid;   

 42: //画笔,canvas的图形绘制,需要画笔Paint实现。 

 43: private final Paint mPaint = new Paint();  

 44: public TileView(Context context, AttributeSet attrs, int defStyle) {  

 45: super(context, attrs, defStyle);  

 46: //使用TypedArray,获取在attrs.xml中为TileView定义的新属性tileSize 。参考: http://weizhulin.blog.51cto.com/1556324/311453 

 47:         TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TileView);  

 48:         mTileSize = a.getInt(R.styleable.TileView_tileSize, 12);  

 49:         a.recycle();  

 50:     }  

 51: public TileView(Context context, AttributeSet attrs) {  

 52: super(context, attrs);  

 53:         TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TileView);  

 54:         mTileSize = a.getInt(R.styleable.TileView_tileSize, 12);  

 55:         a.recycle();  

 56:     }  

 57: /**

 58:      * Rests the internal array of Bitmaps used for drawing tiles, and

 59:      * sets the maximum index of tiles to be inserted

 60:      * 重置清零mTileArray,在游戏初始的时候使用。

 61:      * 即清空砖块字典

 62:      * @param tilecount

 63:      */

 64: public void resetTiles(int tilecount) {  

 65:         mTileArray = new Bitmap[tilecount];  

 66:     }  

 67: /*

 68:      * 当改变屏幕大小尺寸时,同时修改tile的相关计数指标。

 69:      */

 70: @Override

 71: protected void onSizeChanged(int w, int h, int oldw, int oldh) {  

 72:         mXTileCount = (int) Math.floor(w / mTileSize);  

 73:         mYTileCount = (int) Math.floor(h / mTileSize);  

 74: //mXOffset mYOffset是绘图的起点坐标。 

 75:         mXOffset = ((w - (mTileSize * mXTileCount)) / 2);  

 76:         mYOffset = ((h - (mTileSize * mYTileCount)) / 2);  

 77:         mTileGrid = new int[mXTileCount][mYTileCount];  

 78:         clearTiles();  

 79:     }  

 80: /**

 81:      * Function to set the specified Drawable as the tile for a particular

 82:      * integer key.

 83:      * 加载具体的砖块图片 到 砖块字典。

 84:      * 即将对应的砖块的图片 对应的加载到 mTileArray数组中

 85:      * @param key

 86:      * @param tile

 87:      */

 88: public void loadTile(int key, Drawable tile) {  

 89: //这里做了一个 Drawable 到 bitmap 的转换。由于外部程序使用的时候是直接读取资源文件中的图片, 

 90: //是drawable格式,而我们的数组是bitmap格式,方便最终的绘制。所以,需要进行一次到 bitmap的转换。 

 91:         Bitmap bitmap = Bitmap.createBitmap(mTileSize, mTileSize, Bitmap.Config.ARGB_8888);  

 92:         Canvas canvas = new Canvas(bitmap);  

 93:         tile.setBounds(0, 0, mTileSize, mTileSize);  

 94:         tile.draw(canvas);  

 95:         mTileArray[key] = bitmap;  

 96:     }  

 97: /**

 98:      * Used to indicate that a particular tile (set with loadTile and referenced

 99:      * by an integer) should be drawn at the given x/y coordinates during the

100:      * next invalidate/draw cycle.

101:      * 在相应的坐标位置绘制相应的砖块

102:      * 记得哦,mTileGrid其实就是我们直接操作的画布。

103:      * @param tileindex

104:      * @param x

105:      * @param y

106:      */

107: public void setTile(int tileindex, int x, int y) {  

108:         mTileGrid[x][y] = tileindex;  

109:     }  

110: /**

111:      * Resets all tiles to 0 (empty)

112:      * 清空图形显示。

113:      * 用以更新画面。

114:      * 调用了绘图的setTile()。

115:      */

116: public void clearTiles() {  

117: for (int x = 0; x < mXTileCount; x++) {  

118: for (int y = 0; y < mYTileCount; y++) {  

119:                 setTile(0, x, y);  

120:             }  

121:         }  

122:     }  

123: /*

124:  * 将我们直接操作的画布绘制到手机界面上!

125:  * @see Android.view.View#onDraw(android.graphics.Canvas)

126:  */

127: @Override

128: public void onDraw(Canvas canvas) {  

129: super.onDraw(canvas);  

130: for (int x = 0; x < mXTileCount; x += 1) {  

131: for (int y = 0; y < mYTileCount; y += 1) {  

132: if (mTileGrid[x][y] > 0) {  

133:                     canvas.drawBitmap(mTileArray[mTileGrid[x][y]],   

134:                             mXOffset + x * mTileSize,  

135:                             mYOffset + y * mTileSize,  

136:                             mPaint);  

137:                 }  

138:             }  

139:         }  

140:     }  

141: }

142: 

SnakeView.java


: package com.example.Android.snake;  

  2: import Android.app.Activity;  

  3: import Android.os.Bundle;  

  4: import Android.view.Window;  

  5: import Android.widget.TextView;  

  6: /**

  7:  * Snake: a simple game that everyone can enjoy.

  8:  * This is an implementation of the classic Game "Snake", in which you control a

  9:  * serpent roaming around the garden looking for apples. Be careful, though,

 10:  * because when you catch one, not only will you become longer, but you'll move

 11:  * faster. Running into yourself or the walls will end the game.

 12:  */

 13: public class Snake extends Activity {  

 14: private SnakeView mSnakeView;  

 15: private static String ICICLE_KEY = "snake-view";  

 16: /**

 17:      * Called when Activity is first created. Turns off the title bar, sets up

 18:      * the content views, and fires up the SnakeView.

 19:      * 

 20:      */

 21: @Override

 22: public void onCreate(Bundle savedInstanceState) {  

 23: super.onCreate(savedInstanceState);  

 24:         setContentView(R.layout.snake_layout);  

 25:         mSnakeView = (SnakeView) findViewById(R.id.snake);  

 26:         mSnakeView.setTextView((TextView) findViewById(R.id.text));  

 27: if (savedInstanceState == null) {  

 28: // We were just launched -- set up a new game 

 29:             mSnakeView.setMode(SnakeView.READY);  

 30:         } else {  

 31: // We are being restored 

 32:             Bundle map = savedInstanceState.getBundle(ICICLE_KEY);  

 33: if (map != null) {  

 34:                 mSnakeView.restoreState(map);  

 35:             } else {  

 36:                 mSnakeView.setMode(SnakeView.PAUSE);  

 37:             }  

 38:         }  

 39:     }  

 40: @Override

 41: protected void onPause() {  

 42: super.onPause();  

 43: // Pause the game along with the activity 

 44:         mSnakeView.setMode(SnakeView.PAUSE);  

 45:     }  

 46: @Override

 47: public void onSaveInstanceState(Bundle outState) {  

 48: //Store the game state 

 49:         outState.putBundle(ICICLE_KEY, mSnakeView.saveState());  

 50:     }  

 51: }  


分享到:
评论

相关推荐

    android游戏开发入门: 贪吃蛇 源代码分析.docx

    "Android 游戏开发入门:贪吃蛇源代码分析" 本文档主要讲解了 Android 游戏开发入门的知识点,通过分析贪吃蛇游戏的源代码,了解 Android 应用的基本架构、面向对象的思想,以及代码的简洁明了。该游戏的实现是基于...

    android游戏开发入门: 贪吃蛇 源代码分析.pdf

    《Android游戏开发入门:贪吃蛇源代码分析》 贪吃蛇是一款深受玩家喜爱的经典游戏,其简单易懂的操作和直观的游戏机制使其成为初学者学习游戏开发的理想选择。本文将深入解析Android平台上的贪吃蛇游戏源代码,帮助...

    android贪吃蛇游戏源码

    通过分析这个Android贪吃蛇游戏的源码,我们可以学习到Android应用开发的基本流程,包括用户交互、图形绘制、资源管理、状态维护等多个方面。这对于初学者来说,是一次宝贵的实践经验,有助于理解和掌握Android开发...

    Android入门应用贪吃蛇游戏

    在Android开发领域,贪吃蛇游戏是一个经典的入门项目,它能帮助初学者了解基本的UI设计、事件处理、动画制作以及游戏逻辑等基础知识。在这个项目中,我们将深入探讨如何使用Android Studio来创建一个简单的贪吃蛇...

    android贪吃蛇源码

    在Android平台上开发游戏,贪吃蛇是一个经典的入门级项目,它可以帮助开发者熟悉Android SDK的基本用法、图形绘制、事件处理等核心概念。本源码是基于Android SDK构建的,我们可以从以下几个方面来探讨其包含的知识...

    android版简单贪吃蛇小游戏代码

    在Android平台上,开发一款简单的贪吃蛇小游戏是一个经典的入门级项目,它可以帮助初学者了解基本的Android应用开发流程,以及一些关键的编程概念。在这个项目中,我们将关注以下几个核心知识点: 1. **Android ...

    Android贪吃蛇源码

    【Android贪吃蛇源码】是一个经典的移动游戏项目,它基于Android平台开发,适用于学习和研究Android编程,尤其是游戏开发的基础知识。贪吃蛇游戏在移动设备上具有广泛的用户基础,是许多初学者入门Android应用开发的...

    安卓Android源码——简单的贪吃蛇源码.rar

    在安卓Android平台上开发游戏是开发者们常进行的实践,其中“贪吃蛇”是一个经典的入门级项目,它能够帮助开发者熟悉基本的移动应用编程概念,如图形绘制、事件处理和游戏循环等。这个源码包包含了实现一个简单...

    Android贪吃蛇(源码演示)

    在Android平台上开发游戏,尤其是经典的贪吃蛇游戏,是许多开发者学习Android编程时的入门实践。这个源码演示提供了一个由老外编写的完整Android贪吃蛇游戏的实现,虽然注释为英文,但通过细致的分析,即使是英语不...

    五本android开发书籍+五个项目源码下载

    Android股票软件源代码 这款软件提供了一个关于股票行情的应用案例,对于想要开发金融类应用的开发者来说非常有用。 #### 2. Android贪吃蛇游戏源码(支持触屏) 贪吃蛇是一个经典的游戏,这个项目源码展示了...

    Android 贪吃蛇

    【Android 贪吃蛇】是一款经典的Android平台入门级游戏,它基于早期手机及电子设备上的经典游戏"Snake"进行开发。这个游戏展示了Android应用程序的基本构建和交互,是学习Android编程和游戏开发的一个理想起点。 ...

    贪吃蛇大作战unity3d版_unity3d_unity3d_3d贪吃蛇unity_贪吃蛇大作战_源码

    【贪吃蛇大作战Unity3D版】是一个基于Unity3D引擎开发的复刻版经典游戏,适合初学者进行学习和实践。Unity3D是一款强大的跨平台游戏开发工具,广泛应用于2D、3D游戏及交互式应用的制作。这款项目以贪吃蛇大作战为例...

    Unity游戏源码(2017.2)贪吃蛇

    ### Unity游戏源码(2017.2)贪吃蛇知识点详解 #### 一、Unity引擎基础介绍 Unity是一款跨平台的游戏开发工具,由Unity Technologies公司开发并维护。它支持多种编程语言,如C#、JavaScript等,并能将游戏发布到多个...

    coco2d源码snake(贪吃蛇)

    不过,根据贪吃蛇游戏的特点和Cocos2d-x的开发经验,我们可以推测该源代码可能包含以下结构和功能: - **主场景(Scene)**:作为游戏的入口,包含游戏的所有逻辑和元素。 - **蛇类(Snake)**:定义蛇的行为和属性...

    Android系统与应用开发.docx

    4. **源代码结构与编译**:理解Android的源代码结构,包括AOSP(Android Open Source Project),以及如何编译修改后的源代码。 5. **Hello, Android!程序**:编写、调试和运行基础的“Hello, World!”程序,作为...

    两本书一个小游戏(android)

    标题中的“两本书一个小游戏(android)”表明这是一个关于Android平台的学习资源包,包含了两本电子书和一个游戏的源代码。这个资源包对于初学者来说是一个很好的起点,它可以帮助你了解Android开发的基础,同时通过...

    android入门需知

    在Android开发领域,掌握基本的UI控件是入门的关键。以下是一些常见的Android控件及其用法,这些知识对于初学者来说是必不可少的。 1. TextView:TextView 是用来显示文本的控件,常用于显示标题、说明等。在XML...

    安卓开发实例

    5. **Android程序源码--贪吃蛇**:这是另一个经典游戏源码,通过它你可以学习到游戏循环、碰撞检测以及简单的AI设计。 6. **Android 培训示例大全--18个单项功能实例源码**:这些实例专注于特定的功能,如地图集成...

Global site tag (gtag.js) - Google Analytics