贪吃蛇的大概实现过程!

来源:互联网 发布:pon网络组网方式 编辑:程序博客网 时间:2024/05/16 06:49

从主到从的介绍吧!

蛇是怎么动的?

@Overridepublic void onDraw(Canvas canvas) {super.onDraw(canvas);//mXTileCount,mYTileCount屏幕的长宽(长宽可容纳苹果的个数)for (int x = 0; x < mXTileCount; x += 1) {for (int y = 0; y < mYTileCount; y += 1) {if (mTileGrid[x][y] > 0) {//mTileGrid[][]储存要绘制Bitmap的位置//mTileArray[]储存不同颜色的苹果位图canvas.drawBitmap(mTileArray[mTileGrid[x][y]], mXOffset + x * mTileSize, mYOffset + y * mTileSize, mPaint);}}}}
说明:遍历mTitleGrid[ ][ ]中的所有数据,在制定的x,y上进行绘制相应的位图。但这只是绘制了一遍,如何进行重复绘制呢?

class RefreshHandler extends Handler {@Overridepublic void handleMessage(Message msg) {SnakeView.this.update();SnakeView.this.invalidate();}public void sleep(long delayMillis) {//移除what = 0 的 messagethis.removeMessages(0);//使用obtainMessage(0)重新创建一个message,延迟delayMills发送消息进行更新操作sendMessageDelayed(obtainMessage(0), delayMillis);}};

public void update() {if (mMode == RUNNING) {long now = System.currentTimeMillis();//只有当蛇移动之后的时间大于蛇的移动延迟才可以更新操作if (now - mLastMove > mMoveDelay) {clearTiles();//清空所有位置的绘图updateWalls();//更新外墙updateSnake();//更新蛇updateApples();//更新随机产生的苹果mLastMove = now;}//延时mMoveDelaymRedrawHandler.sleep(mMoveDelay);}}


说明:上面两段代码是互相重复调用的,所以可以利用Hanld机制不断调用invalidate()进行重新绘制(也就是回调了onDraw())。

源代码:不知道怎么上传,需要的留下邮箱哈!


贪吃蛇中的android知识点:

View.setVisibility(View.GONE);//设置按钮不可见,在ViewGroup中不留位置,空间

可以从savedInstanceState判断是否为空判断程序是否是第一次启动

当游戏的activity被销毁前保存当前activity的数据到 savedInstanceState

@Overridepublic void onSaveInstanceState(Bundle outState) {outState.putBundle(ICICLE_KEY, mSnakeView.saveState());}public Bundle saveState() {Bundle map = new Bundle();map.putIntArray("mAppleList", coordArrayListToArray(mAppleList));map.putInt("mDirection", Integer.valueOf(mDirection));map.putInt("mNextDirection", Integer.valueOf(mNextDirection));map.putLong("mMoveDelay", Long.valueOf(mMoveDelay));map.putLong("mScore", Long.valueOf(mScore));map.putIntArray("mSnakeTrail", coordArrayListToArray(mSnakeTrail));return map;}
根据drawable绘制bitmap,并且存进mTileArray[]中

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); mTileArray[key] = bitmap;}

自定义组件的自定义属性

//自定义属性数组TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.TileView);//获取对应的属性值,使用R.styleble.TileView加下划线的方式访问数组里面的属性mTileSize = a.getInt(R.styleable.TileView_tileSize, 12);

声明自定义属性

<?xml version="1.0" encoding="utf-8"?><resources>  <declare-styleable name="TileView">    <attr name="tileSize" format="integer" />  </declare-styleable></resources>

将我们自定义的组件加入布局main.xml 文件中,平且使用自定义属性,自定义属性必须加上:      

xmlns test="http://schemas.android.com/apk/res/com.android.tutor "蓝色 是自定义属性的前缀,红色 是我们包名.    





原创粉丝点击