📄 mysurfaceview.java
字号:
//绘制Replay按钮
hbReplay.draw(canvas, paint);
//绘制Menu按钮
hbMenu.draw(canvas, paint);
} else
//游戏胜利
if (gameIsWin) {
//绘制失败背景
canvas.drawBitmap(bmpWinbg, screenW / 2 - bmpWinbg.getWidth() / 2, screenH / 2 - bmpWinbg.getHeight() / 2, paint);
//绘制Replay按钮
hbReplay.draw(canvas, paint);
//绘制Menu按钮
hbMenu.draw(canvas, paint);
}
break;
}
} catch (Exception e) {
Log.e("Himi", "myDraw is Error!");
} finally {
if (canvas != null)
sfh.unlockCanvasAndPost(canvas);
}
}
/**
* 触屏按键事件处理
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (gameState) {
case GAMESTATE_MENU:
//判断Play按钮是否被点击
if (hbPlay.isPressed(event)) {
//Play按钮被点击开始游戏
gameState = GAMESTATE_GAMEING;
//判断Help按钮是否被点击
} else if (hbHelp.isPressed(event)) {
//Play按钮被点击进入游戏游戏帮助界面
gameState = GAMESTATE_HELP;
//判断Exit按钮是否被点击
} else if (hbExit.isPressed(event)) {
//Exit按钮被点击调用退出函数
MainActivity.main.exit();
}
break;
case GAMESTATE_HELP:
//判断Back按钮是否被点击
if (hbBack.isPressed(event)) {
//Back按钮被点击进入主菜单界面
gameState = GAMESTATE_MENU;
}
break;
case GAMESTATE_GAMEING:
// 游戏暂停(因为游戏失败和游戏胜利中按钮处理事件一样,所以就不需要重写)
if (gameIsPause || gameIsLost || gameIsWin) {
if (hbResume.isPressed(event)) {
gameIsPause = false;
} else if (hbReplay.isPressed(event)) {
//因为在重置前小球可能拥有力,所以重置游戏要先使用putToSleep()方法
//让其Body进入睡眠,并让Body停止模拟,速度置为0
bodyBall.putToSleep();
// 然后对小球的坐标进行重置
bodyBall.setXForm(new Vec2((bmpH.getHeight() + bmpBall.getWidth() / 2 + 2) / RATE, (bmpH.getHeight() + bmpBall.getWidth() / 2 + 2) / RATE),
0);
//并且设置默认重力方向为向下
world.setGravity(new Vec2(0, 10));
//唤醒小球
bodyBall.wakeUp();
//游戏暂停、胜利、失败条件还原默认false
gameIsPause = false;
gameIsLost = false;
gameIsWin = false;
} else if (hbMenu.isPressed(event)) {
//因为在重置前小球可能拥有力,所以重置游戏要先使用putToSleep()方法
//让其Body进入睡眠,并让Body停止模拟,速度置为0
bodyBall.putToSleep();
// 然后对小球的坐标进行重置
bodyBall.setXForm(new Vec2((bmpH.getHeight() + bmpBall.getWidth() / 2 + 2) / RATE, (bmpH.getHeight() + bmpBall.getWidth() / 2 + 2) / RATE),
0);
//并且设置默认重力方向为向下
world.setGravity(new Vec2(0, 10));
//唤醒小球
bodyBall.wakeUp();
//重置游戏状态为主菜单
gameState = GAMESTATE_MENU;
//游戏暂停、胜利、失败条件还原默认false
gameIsPause = false;
gameIsLost = false;
gameIsWin = false;
}
}
break;
}
return true;
}
/**
* 实体键盘按键处理
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// 当前游戏状态不处于正在游戏中时,屏蔽“返回”实体按键,避免程序进入后台;
if (keyCode == KeyEvent.KEYCODE_BACK && gameState != GAMESTATE_GAMEING) {
return true;
}
switch (gameState) {
case GAMESTATE_MENU:
break;
case GAMESTATE_HELP:
break;
case GAMESTATE_GAMEING:
// 游戏没有暂停、失败、胜利
if (!gameIsPause && !gameIsLost && !gameIsWin) {
//如果方向键左键被按下
if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT)
//设置物理世界的重力方向向左
world.setGravity(new Vec2(-10, 2));
//如果方向键右键被按下
else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT)
//设置物理世界的重力方向向右
world.setGravity(new Vec2(10, 2));
//如果方向键上键被按下
else if (keyCode == KeyEvent.KEYCODE_DPAD_UP)
//设置物理世界的重力方向向上
world.setGravity(new Vec2(0, -10));
//如果方向键下键被按下
else if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN)
//设置物理世界的重力方向向下
world.setGravity(new Vec2(0, 10));
//如果返回键被按下
else if (keyCode == KeyEvent.KEYCODE_BACK) {
//进入游戏暂停界面
gameIsPause = true;
}
}
//屏蔽“返回”实体按键,避免程序进入后台;
return true;
}
return super.onKeyDown(keyCode, event);
}
//游戏逻辑函数
public void Logic() {
switch (gameState) {
case GAMESTATE_MENU:
break;
case GAMESTATE_HELP:
break;
case GAMESTATE_GAMEING:
// 游戏没有暂停
if (!gameIsPause && !gameIsLost && !gameIsWin) {
// --开始模拟物理世界--->>
world.step(timeStep, iterations);
Body body = world.getBodyList();
for (int i = 1; i < world.getBodyCount(); i++) {
if ((body.m_userData) instanceof MyRect) {
MyRect rect = (MyRect) (body.m_userData);
rect.setX(body.getPosition().x * RATE - rect.getW() / 2);
rect.setY(body.getPosition().y * RATE - rect.getH() / 2);
} else if ((body.m_userData) instanceof MyCircle) {
MyCircle mcc = (MyCircle) (body.m_userData);
mcc.setX(body.getPosition().x * RATE - mcc.getR());
mcc.setY(body.getPosition().y * RATE - mcc.getR());
mcc.setAngle((float) (body.getAngle() * 180 / Math.PI));
}
body = body.m_next;
}
}
break;
}
}
public void run() {
while (flag) {
myDraw();
Logic();
try {
Thread.sleep((long) timeStep * 1000);
} catch (Exception ex) {
Log.e("Himi", "Thread is Error!");
}
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
public void surfaceDestroyed(SurfaceHolder holder) {
flag = false;
}
@Override
public void add(ContactPoint point) {
//当前游戏状态为进行游戏时
if (gameState == GAMESTATE_GAMEING) {
//游戏没有进入暂停、失败、胜利界面
if (!gameIsPause && !gameIsLost && !gameIsWin) {
//判定主角小球是否与失败小球1发生碰撞
if (point.shape1.getBody() == bodyBall && point.shape2.getBody() == lostBody2) {
//游戏失败
gameIsLost = true;
//判定主角小球是否与失败小球2发生碰撞
} else if (point.shape1.getBody() == bodyBall && point.shape2.getBody() == lostBody1) {
//游戏失败
gameIsLost = true;
//判定主角小球是否与胜利小球发生碰撞
} else if (point.shape1.getBody() == bodyBall && point.shape2.getBody() == winBody) {
//游戏胜利
gameIsWin = true;
}
}
}
}
@Override
public void persist(ContactPoint point) {
// TODO Auto-generated method stub
}
@Override
public void remove(ContactPoint point) {
// TODO Auto-generated method stub
}
@Override
public void result(ContactResult point) {
// TODO Auto-generated method stub
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -