安卓学习之路_20140430_拼图游戏点击事件、状态控制、胜利状态

1、拼图游戏点击事件:

上一次已经做好了图片的切块和打乱,所以还需要给每一个小切块添加点击事件,和打乱的操作类似,要点击某个切块能向某个方向移动,必须得他的那个方向上是白块,这样才能交换位置,否则就无效:

public boolean blockMove(Block b) {
	if (b.xLine > 0 && block[b.xLine - 1][b.yLine].id == whiteB) {
		int temp = b.id;
		b.id = block[b.xLine - 1][b.yLine].id;
		block[b.xLine - 1][b.yLine].id = temp;
		step++;
		return true;
	}

	if (b.xLine < level - 1 && block[b.xLine + 1][b.yLine].id == whiteB) {
		int temp = b.id;
		b.id = block[b.xLine + 1][b.yLine].id;
		block[b.xLine + 1][b.yLine].id = temp;
		step++;
		return true;
	}

	if (b.yLine > 0 && block[b.xLine][b.yLine - 1].id == whiteB) {
		int temp = b.id;
		b.id = block[b.xLine][b.yLine - 1].id;
		block[b.xLine][b.yLine - 1].id = temp;
		step++;
		return true;
	}

	if (b.yLine < level - 1 && block[b.xLine][b.yLine + 1].id == whiteB) {
		int temp = b.id;
		b.id = block[b.xLine][b.yLine + 1].id;
		block[b.xLine][b.yLine + 1].id = temp;
		step++;
		return true;
	}

	return false;
}
然后写一个方法来判断点击的具体是哪一个切块

public boolean OnClick(float x, float y) {
		for (int i = 0; i < level * level; i++) {
			Block b = block[i % level][i / level];
			if (b.onClick(x, y)) {
				if (blockMove(b)) {
					return true;
				}
			}
		}
		return false;
	}

这样就可以直接在view的ontouch方法中调用这个点击方法了

public boolean onTouchEvent(MotionEvent event) {

		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			touchX = event.getX();
			touchY = event.getY() - 105;
			break;

		default:
			break;
		}

		return super.onTouchEvent(event);
	}

2、状态控制

在这个项目中,图片的打乱和图片的点击是两个不同的状态,图片打乱了才能进行图片的移动操作,所以这样我们可以定义一些常量来代表某个状态,然后通过switch来判断具体是在哪个状态。

                public void status() {
		SurfaceHolder holder = getHolder();
		Canvas canvas = holder.lockCanvas();
		if (canvas == null) {
			return;
		}
		switch (status) {
		case GAME_UPSET:
			upset(canvas);
			break;
		case GAME_RUN:
			draw(canvas);
			picGroup.OnClick(touchX, touchY);
			if (win()) {
				status = GAME_WIN;
			}
			break;
		case GAME_WIN:
			Intent intent = new Intent(context, WinActivity.class);
			intent.putExtra("score", getTime());
			intent.putExtra("step", picGroup.step);
			context.startActivity(intent);
			GameActivity.ga.finish();
			isRunning = false;
			break;
		default:
			break;
		}
		holder.unlockCanvasAndPost(canvas);
	}
3、胜利状态:就是玩家拼好图后肯定就代表胜利了,这里胜利过后我们跳转到一个activity。

判断是否胜利的思路,我是根据所有小切块的id是否为当初还没有打乱时候的id顺序,就是在图片管理类中的切图类的二维数组中每一个切块的id是否按照01234...顺序排列,如果是就代表胜利,通过遍历包装小切块的二维数组,然后判断他的id是否为当前的迭代器的值,如果不是,就放回一个false代表没有赢,如果都等于了就返回一个true就代表胜利

public boolean win() {
	for (int i = 0; i < GameActivity.level * GameActivity.level; i++) {
		if (picGroup.block[i % picGroup.level][i / picGroup.level].id != i) {
			return false;
		}
	}
	return true;
}



学习感受:

通过这几天的学习,确实有点晕啊,做游戏的逻辑太强了,一不小心就晕了,但是我们的陈老师不得不说真的很负责啊,遇到问题都非常耐心的给我们讲解,讲到我们明白为止,所以这几天学的基本还是弄得了。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值