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