⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mysurfaceview.java

📁 Android开发精典案例60个
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
					//绘制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 + -