开发带体感操作的打砖块小游戏

概述

实现旧式打砖块游戏,综合传感器的学习完成球拍的体感操作模式。


主界面

核心代码

1、Ball类:小球

//绘制圆

public voiddraw(Canvas canvas) {

canvas.drawCircle(mCenter.x,mCenter.y,mRadius,mPaint);

mCenter.offset(mSpeed.x,mSpeed.y);

}

//设置绘制位置

public voidsetPosition(intx,inty) {

mCenter.x= x;

mCenter.y= y;

}

//发射坐标

public voidshot(intx,inty) {

mSpeed.x= x;

mSpeed.y= y;

}

//球类:设置颜色、中心点、速度

publicBall() {

mPaint=newPaint();

mPaint.setColor(Color.RED);

mCenter=newPoint(INIT_POS_CX,INIT_POS_CY);

mRadius=RADIUS;

mSpeed=newPoint(0,0);

}


2、Bat类:球拍

      球拍绘制方法同上

//左移

public voidmoveLeft() {

mBody.offset(-mSpeed,0);

}

//右移

public voidmoveRight() {

mBody.offset(mSpeed,0);

}

3、Brick类:砖块

//砖块颜色,随机显示

private static int[]sBloodColors= {

Color.RED, Color.YELLOW, Color.GREEN

};

//定义砖块

publicBrick(introw,intcol,intwidth,intheight,intblood) {

intleft = col * width +BRICK_GAP/2;

intright = left + width -3*BRICK_GAP/2;

inttop = row * height +BRICK_GAP;

intbottom = top + height -BRICK_GAP;

mBody=newRect(left, top, right, bottom);

mBlood= blood;

this.row= row;

this.col= col;

}

//砖块绘制

@Override

public voiddraw(Canvas canvas) {

mPaint.setColor(sBloodColors[mBlood]);

mPaint.setStyle(Paint.Style.FILL);

canvas.drawRect(mBody,mPaint);

mPaint.setColor(Color.BLACK);

mPaint.setStyle(Paint.Style.STROKE);

canvas.drawRect(mBody.left+BRICK_BORDER,

mBody.top+BRICK_BORDER,

mBody.right-BRICK_BORDER,

mBody.bottom-BRICK_BORDER,

mPaint);

}

//判断砖块数(碰撞则减一)

@Override

public booleanhit() {

mBlood--;

returnmBlood<0;

}

4、Table类:界面设置

//更新关卡

private voidloadLevel() {

//初始化数组,20行,5列

mCells=newCell[ROW_NUM][COL_NUM];

mCellWidth=mBoundary.width() /COL_NUM;

mCellHeight=mBoundary.height() /ROW_NUM;

try{

String[] filenames =mAssetManager.list("levels");

//TODO:应该根据关卡加载

String filename = filenames[0];

loadLevel(filename);

}catch(IOException e) {

e.printStackTrace();

}

}

//判断球是否和边界碰撞(碰撞则改变移动的x.y为相反值)

inthitType = getHitType();

if((hitType & (HIT_TOP|HIT_BOTTOM)) >0) {

mBall.reverseYSpeed();

}

if((hitType & (HIT_LEFT|HIT_RIGHT)) >0) {

mBall.reverseXSpeed();

}

if(isBatHit() &&mBall.isToBottom()) {

mBall.reverseYSpeed();

}

mBall.draw(canvas);

moveBat();

mBat.draw(canvas);

界面中判断小球与球拍的撞击位置

//判断撞头

if(ballInTable && row >0) {

cell =mCells[row -1][col];

if(cell !=null) {

body = cell.getBody();

hitCell = c.y> body.bottom&& c.y- r <= body.bottom;

if(hitCell) {

playHitBrickSound(cell);

if(cell.hit()) {

mCells[cell.row][cell.col] =null;

}

}

}

}

if(mBall.isToTop() && (c.y- r <=0|| hitCell)) {

type |=HIT_TOP;

}

//判断撞右边

hitCell =false;

if(ballInTable && col

cell =mCells[row][col +1];

if(cell !=null) {

body = cell.getBody();

hitCell = c.x< body.left&& c.x+ r >= body.left;

if(hitCell) {

playHitBrickSound(cell);

if(cell.hit()) {

mCells[cell.row][cell.col] =null;

}

}

}

}

if(mBall.isToRight() &&

(c.x+ r >=mBoundary.right&& c.y

type |=HIT_RIGHT;

}

//判断撞左边

hitCell =false;

if(ballInTable && col >0) {

cell =mCells[row][col -1];

if(cell !=null) {

body = cell.getBody();

hitCell = c.x> body.right&& c.x- r <= body.right;

if(hitCell) {

playHitBrickSound(cell);

if(cell.hit()) {

mCells[cell.row][cell.col] =null;

}

}

}

}

if(mBall.isToLeft() &&

((c.x- r <=0&& c.y

type |=HIT_LEFT;

}

//判断撞下边

if(ballInTable && row

cell =mCells[row +1][col];

if(cell !=null) {

body = cell.getBody();

hitCell = c.y< body.top&& c.y+ r >= body.top;

if(hitCell) {

playHitBrickSound(cell);

if(cell.hit()) {

mCells[cell.row][cell.col] =null;

}

}

}

}

if(mBall.isToBottom() && hitCell) {

type |=HIT_BOTTOM;

}

returntype;

}

利用手机自带的旋转矢量传感器,通过手机倾斜的角度改变球拍的位置

//通过倾斜度改变板的形状

public voidchangeBatBody(doublepitch) {

Rect body =mBat.getBody();

booleanwider = body.width() ==mBoundary.width();//板和边界宽度是否一致

booleanhigher = body.height() >mNormalBatBody.height();//板是否比正常板的高度高

if(wider) {

if(pitch > -25) {//倾斜度判断

body.left=mNormalBatBody.left;

body.right=mNormalBatBody.right;

}

}else{

if(pitch < -30) {

body.left=mBoundary.left;

body.right=mBoundary.right;

}

}

if(higher) {

if(pitch <10) {

body.top=mNormalBatBody.top;

}

}else{

if(pitch >15) {

body.top= body.bottom-10* body.height();

}

}

}

效果展示

点击小球,游戏开始,小球弹起,倾斜手机不同角度,球拍惊醒相应的移动


手机向前倾斜,球拍变大
手机向左倾斜,球拍向右

设置了可“作弊”玩法,手机向后倾斜,球拍充满整个底部,则小球不会落下


“作弊”玩法

总结

通过打砖块游戏的操作及代码理解,对手机传感器有了更深的理解,能更加熟练地操作,进行简单游戏的开发。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,719评论 0 33
  • 上一章中,我们了解了生理心理学的部分,但是在一篇文章中要想写完一个学科实属不易,所以在这一篇文章中,我们接着来了解...
    地平线上的背影阅读 891评论 1 0
  • 前言 在手机上玩kali时,发现一个问题,内置的网卡无法开启混杂模式,而外接网卡(rt5370)无法驱动起来,经过...
    SHUTUP阅读 2,264评论 0 4
  • 本来打算忘了你 却又梦到了你 那么美得梦 我是真的不想醒过来 梦就是现实该多好
    向小羽阅读 158评论 0 0
  • 《腊叶》 我的日记本中也经常会掉落干枯的树叶和花瓣,有些我记得它来自哪里,有怎样的故事,有些则记不得了。大多数情况...
    书青麦阅读 340评论 0 0