贪吃蛇的大概实现过程!

从主到从的介绍吧!

蛇是怎么动的?

@Override
	public 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 {

		@Override
		public void handleMessage(Message msg) {
			SnakeView.this.update();
			SnakeView.this.invalidate();
		}

		public void sleep(long delayMillis) {
			//移除what = 0 的 message
			this.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;
			}
			//延时mMoveDelay
			mRedrawHandler.sleep(mMoveDelay);
		}

	}


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

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


贪吃蛇中的android知识点:

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

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

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

@Override
	public 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 "蓝色 是自定义属性的前缀,红色 是我们包名.    





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值