标签:
别踩白块:
齐岳:负责代码的实现(一)
blogs:http://www.cnblogs.com/July0207/
codes:
package com.orange.block;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Bundle;
import com.orange.engine.camera.ZoomCamera;
import com.orange.engine.options.PixelPerfectEngineOptions;
import com.orange.engine.options.PixelPerfectMode;
import com.orange.engine.options.ScreenOrientation;
import com.orange.res.FontRes;
import com.orange.res.RegionRes;
import com.orange.ui.activity.GameActivity;
import com.orange.block.res.Res;
import com.orange.block.scene.GameScene;
import com.orange.block.util.ConstantUtil;
import com.orange.block.util.LogUtil;
/**
 * 入口主Activity 类
 * @author lch<OGEngine@orangegame.cn>
 * @
 */
public class MainActivity extends GameActivity {
	@Override
	protected void onCreate(Bundle pSavedInstanceState) {
		super.onCreate(pSavedInstanceState);
	}
	@Override
	protected PixelPerfectEngineOptions onCreatePixelPerfectEngineOptions() {
		PixelPerfectEngineOptions pixelPerfectEngineOptions = new PixelPerfectEngineOptions(
				this, ZoomCamera.class);
		pixelPerfectEngineOptions
				.setScreenOrientation(ScreenOrientation.PORTRAIT_FIXED); // 设置竖屏
		pixelPerfectEngineOptions
				.setPixelPerfectMode(PixelPerfectMode.CHANGE_HEIGHT);// 适配模式,这里设置为“保持宽度不变,改变高”
		pixelPerfectEngineOptions.setDesiredSize(ConstantUtil.DESIRED_SIZE);// 参考尺寸
		return pixelPerfectEngineOptions;
	}
	@Override
	protected void onLoadResources() {
		// 加载相关初始的资源等
		LogUtil.d("开始加载资源...");
		RegionRes.loadTexturesFromAssets(Res.ALL_XML);
		FontRes.loadFont(128, 128,
				Typeface.create(Typeface.DEFAULT, Typeface.BOLD), 40, true,
				Color.RED, ConstantUtil.FONT_NAME_TIMER);
		
		FontRes.loadFont(256, 512,
				Typeface.create(Typeface.DEFAULT, Typeface.BOLD), 50, true,
				Color.BLACK, ConstantUtil.FONT_NAME_RESULT);
	}
	@Override
	protected void onLoadComplete() {
		// 加载资源完成后
		LogUtil.d("加载资源完成...");
		this.startScene(GameScene.class);// 启动游戏场景
	}
	
	@Override
	protected void onPause() {
		super.onPause();
		this.getEngine().stop();
	}
	
	@Override
	protected synchronized void onResume() {
		super.onResume();
		this.getEngine().start();
	}
	@Override
	protected void onDestroy() {
		super.onDestroy();
		
		android.os.Process.killProcess(android.os.Process.myPid());
	}
}
package com.orange.block.util;
public class ConstantUtil {
	/**屏幕参考尺寸**/
	public static final float DESIRED_SIZE = 480;
	
	/**标示白颜色**/
	public static final int COLOR_WHITE = 0;
	/**标示黑颜色**/
	public static final int COLOR_BLACK = 1;
	
	/**游戏进行状态**/
	public static final int GAME_START = 1;
	/**游戏结束状态**/
	public static final int GAME_OVER = 2;
	
	/** 游戏总共有多少行 **/
	public static final int LINES_LEN = 50;
	
	/**字体颜色的 key**/
	public static final String FONT_NAME_TIMER = "timer";
	public static final String FONT_NAME_RESULT = "result";
}
package com.orange.block.util;
import android.util.Log;
/**
 * 
 * @author lch
 * 
 */
public class LogUtil {
	private static boolean showLogEnabled = true;
	private static final String TAG = "OG";
	public static void out(String msg) {
		if (showLogEnabled)
			System.out.println(msg);
	}
	public static void d(String msg) {
		if (showLogEnabled)
			Log.d(TAG, msg);
	}
	public static void i(String msg) {
		if (showLogEnabled)
			Log.i(TAG, msg);
	}
	public static void v(String msg) {
		if (showLogEnabled)
			Log.v(TAG, msg);
	}
	public static void w(String msg) {
		if (showLogEnabled)
			Log.w(TAG, msg);
	}
	public static void e(String msg) {
		if (showLogEnabled)
			Log.e(TAG, msg);
	}
}
package com.orange.block.util;
import android.content.Context;
import android.content.SharedPreferences.Editor;
/**
 * 保存到 SharedPreferences 的数据
 * 
 * @author lch
 * 
 */
public class SharedUtil {
	private static final String SHARED_OG = "Shared_og";
	private static final String RESULT_RECORD = "result_record";
	/**
	 * 保持最新的记录
	 * @param pContext
	 * @param pMillisPass
	 */
	public static void setRecord(Context pContext, long pMillisPass) {
		Editor edit = pContext.getSharedPreferences(SHARED_OG,
				Context.MODE_PRIVATE).edit();
		edit.putLong(RESULT_RECORD, pMillisPass);
		edit.commit();
	}
	/**
	 * 获取记录
	 * @param context
	 * @return
	 */
	public static long getRecord(Context context) {
		return context
				.getSharedPreferences(SHARED_OG, Context.MODE_PRIVATE)
				.getLong(RESULT_RECORD, 0);
	}
}
package com.orange.block.scene;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import android.view.KeyEvent;
import com.orange.content.SceneBundle;
import com.orange.entity.IEntity;
import com.orange.entity.modifier.ColorModifier;
import com.orange.entity.modifier.DelayModifier;
import com.orange.entity.modifier.IEntityModifier.IEntityModifierListener;
import com.orange.entity.modifier.LoopEntityModifier;
import com.orange.entity.modifier.MoveYModifier;
import com.orange.entity.modifier.ScaleModifier;
import com.orange.entity.modifier.SequenceEntityModifier;
import com.orange.entity.primitive.DrawMode;
import com.orange.entity.primitive.Mesh;
import com.orange.entity.scene.Scene;
import com.orange.entity.sprite.AnimatedSprite;
import com.orange.entity.text.Text;
import com.orange.res.FontRes;
import com.orange.util.color.Color;
import com.orange.util.modifier.IModifier;
import com.orange.block.control.TimerTool;
import com.orange.block.entity.Block;
import com.orange.block.entity.FailGroup;
import com.orange.block.entity.SuccGroup;
import com.orange.block.res.Res;
import com.orange.block.util.ConstantUtil;
import com.orange.block.util.LogUtil;
/**
 * 游戏场景
 * 
 * @author lch
 * 
 */
public class GameScene extends Scene {
	/** 块的宽 **/
	private float blockWidth = 0;
	/** 块的高 **/
	private float blockHight = 0;
	/** 用于装当前所有生成但未被删除的block **/
	private List<Block[]> blockList;
	/** 当前生成的块的行数 **/
	private int linesLength = 5;
	/** 游戏状态 **/
	private int gameStatus = ConstantUtil.GAME_START;
	/** 移动步数 **/
	private int moveNum = 0;
	/** 成功界面 **/
	private SuccGroup mSuccGroup;
	/** 失败界面 **/
	private FailGroup mFailGroup;
	/** 计时管理类 **/
	private TimerTool mTimerTool;
	/** 显示计时的Text **/
	private Text timerText;
	
	/**游戏提示语**/
	private AnimatedSprite game_tip;
	// 用于Z索引排序
	private static final int pZIndex_middle = 2;
	private static final int pZIndex_top = 3;
	public Text getTimerText() {
		return timerText;
	}
	public TimerTool getmTimerTool() {
		return mTimerTool;
	}
	@Override
	public void onSceneCreate(SceneBundle bundle) {
		super.onSceneCreate(bundle);
		// 镜头里显示的是4*4的块,所以用镜头宽的四分之一作为块宽
		blockWidth = this.getCameraWidth() / 4;
		blockHight = this.getCameraHeight() / 4;
		this.blockList = new ArrayList<Block[]>();
		mTimerTool = new TimerTool(this);
		initView();
	}
	private void initView() {
		// 初始化blocks
		initBlocks();
		timerText = new Text(getCameraCenterX(), 10,
				FontRes.getFont(ConstantUtil.FONT_NAME_TIMER), "00.000\"",
				"00:00.000\"".length(), getVertexBufferObjectManager());
		this.attachChild(timerText);
		timerText.setCentrePositionX(getCameraCenterX());
		timerText.setZIndex(pZIndex_top);
		mSuccGroup = new SuccGroup(getCameraWidth(), getCameraHeight(), this);
		mSuccGroup.setZIndex(pZIndex_middle);
		mSuccGroup.setVisible(false);
		this.attachChild(mSuccGroup);
		mFailGroup = new FailGroup(getCameraWidth(), getCameraHeight(), this);
		this.attachChild(mFailGroup);
		mFailGroup.setZIndex(pZIndex_middle);
		
		game_tip = new AnimatedSprite(0, 0, Res.GAME_TIP, getVertexBufferObjectManager());
		game_tip.setCentrePositionX(this.getCameraCenterX());
		game_tip.setBottomPositionY(this.getCameraBottomY()-60);
		this.attachChild(game_tip);
		game_tip.setZIndex(pZIndex_top);
		
	}
	/**
	 * 初始化blocks
	 */
	private void initBlocks() {
		Random mRandom = new Random();
		int blackIndex = 0;
		// 初始blocks,先创建4*5表格,使用时候再一行行增加
		for (int row = 0; row < linesLength; row++) {// 行
			// 一行blocks
			Block[] rowBolcks = new Block[4];
			// 随机一个黑块所在位置
			blackIndex = mRandom.nextInt(4);
			for (int column = 0; column < 4; column++) {// 列
				rowBolcks[column] = new Block(this, row, column, blockWidth,
						blockHight, blackIndex, getVertexBufferObjectManager());
				this.attachChild(rowBolcks[column]);
			}
			blockList.add(rowBolcks);
		}
	}
	/**
	 * 重来时,重置游戏相关
	 */
	public void resetGame() {
		gameStatus = ConstantUtil.GAME_START;
		linesLength = 5;
		moveNum = 0;
		mSuccGroup.showItems(false);
		timerText.setText("00.000\"");
		timerText.setVisible(true);
		mTimerTool.resetTimer();
		mSuccGroup.setVisible(false);
		game_tip.setVisible(true);
		deletBlocks();
		initBlocks();
		// 按Z索引排序一下上下层顺序
		this.sortChildren();
	}
	/**
	 * 创建添加新的一行
	 */
	private void createNewRowBolcks() {
		// 超出屏幕没用的部分移除掉
		if (blockList.size() > 5) {
			Block[] rowBolcks = blockList.get(0);
			for (Block block : rowBolcks) {
				block.detachSelf();
			}
			blockList.remove(0);
		}
		// 目前顶部的一行块的Y坐标
		float topBlocksY = blockList.get(blockList.size() - 1)[0].getY();
		// 一行块
		Block[] rowBolcks = new Block[4];
		int blackIndex = new Random().nextInt(4);
		for (int column = 0; column < 4; column++) {
			// 新创建 Block
			rowBolcks[column] = new Block(this, column, blockWidth, blockHight,
					blackIndex, getVertexBufferObjectManager());
			// 设置Y坐标
			rowBolcks[column].setBottomPositionY(topBlocksY - 1);
			// 设置已经是第几行
			rowBolcks[column].setRow(linesLength);
			this.attachChild(rowBolcks[column]);
		}
		blockList.add(rowBolcks);
		// 按Z索引排序一下上下层顺序
		this.sortChildren();
		// 当前生成的块的行数增加
		linesLength++;
	}
	/**
	 * 最后一个移动,游戏胜利
	 * 
	 * @param pBlock
	 */
	private void gameSucc(Block pBlock) {
		gameStatus = ConstantUtil.GAME_OVER;
		// 最后一个移动,游戏胜利
		moveDown(pBlock, 0);
		// 停止计时
		mTimerTool.stop();
		// 显示游戏胜利画面
		mSuccGroup.showItems(true);
		// 隐藏显示时间的Text
		timerText.setVisible(false);
	}
	/**
	 * 点击错误后弹出红色的失败界面,游戏失败
	 */
	private void gameFail() {
		gameStatus = ConstantUtil.GAME_OVER;
		// 游戏失败,停止计时
		mTimerTool.stop();
		// 隐藏显示时间的Text
		timerText.setVisible(false);
	}
	/**
	 * 游戏快到顶部时开始出现绿色的胜利界面
	 */
	private void showSuccGroup() {
		// 目前顶部的一行块的Y坐标
		float topBlocksY = blockList.get(blockList.size() - 1)[0].getY();
		mSuccGroup.setBottomPositionY(topBlocksY);
		mSuccGroup.setVisible(true);
	}
	/**
	 * 移除剩下的block,清空blockList
	 */
	private void deletBlocks() {
		for (Block[] rowBlocks : blockList) {
			for (Block block : rowBlocks) {
				this.detachChild(block);
			}
		}
		blockList.clear();
	}
	/**
	 * 点击到Block时进行的逻辑处理
	 * 
	 * @param pBlock
	 *            所点击的block
	 */
	public void touchBlock(Block pBlock) {
		if (gameStatus == ConstantUtil.GAME_START) {
			if (pBlock.getRow() == moveNum + 2) {// 表示是在底部往上数的倒数第三行
				// 判断是不是点击了该点击的黑块的上一格,如果是,我们也判定这是正确点击了,做出相应移动
				upBlockTouch(pBlock);
			} else if (pBlock.getRow() == moveNum + 1) {// 表示是在底部往上数的倒数第二行
				if (pBlock.getColorType() == ConstantUtil.COLOR_BLACK) {
					if (linesLength == moveNum + 2) {
						// 游戏胜利
						gameSucc(pBlock);
					} else {
						// 整体blocks下移
						moveDown(pBlock, 1);
					}
				} else if (pBlock.getColorType() == ConstantUtil.COLOR_WHITE) {
					// 误点了白块,游戏失败
					gameFail();
					// 失败时pBlock的一个闪红效果
					LoopEntityModifier loop = failAction();
					// 播放效果
					pBlock.registerEntityModifier(loop);
				}
			}
		}
	}
	/**
	 * 失败时pBlock的一个闪红效果
	 * @return
	 */
	private LoopEntityModifier failAction() {
		SequenceEntityModifier sequence = new SequenceEntityModifier(
				new ColorModifier(0.1f, Color.RED, Color.WHITE),
				new DelayModifier(0.07f), new ColorModifier(0.1f,
						Color.WHITE, Color.RED));
		LoopEntityModifier loop = new LoopEntityModifier(sequence,
				3, new IEntityModifierListener() {
					@Override
					public void onModifierStarted(
							IModifier<IEntity> pModifier,
							IEntity pItem) {
					}
					@Override
					public void onModifierFinished(
							IModifier<IEntity> pModifier,
							IEntity pItem) {
						//效果播放完毕,显示游戏失败界面
						mFailGroup.showView();
					}
				});
		return loop;
	}
	/**
	 * 判断是不是点击了该点击的黑块的上一格,如果是,我们也判定这是正确点击了,做出相应移动
	 * 
	 * @param pBlock
	 *            所被点击的块
	 */
	private void upBlockTouch(Block pBlock) {
		int touchColumn = pBlock.getColumn();
		for (Block[] blocks : blockList) {
			for (Block block : blocks) {
				if (block.getRow() == moveNum + 1
						&& block.getColorType() == ConstantUtil.COLOR_BLACK) {
					if (block.getColumn() == touchColumn) {
						// 整体blocks下移
						moveDown(block, 1);
					}
					return;
				}
			}
		}
	}
	/**
	 * 正确点击该点击的黑块,或者上一行的块,整体向下移动、创建新的一样块,改变黑块颜色
	 * 
	 * @param pBlock
	 * @param stepNum
	 *            一般为1,到最后出现绿色成功界面的最后一步为0
	 */
	private void moveDown(Block pBlock, int stepNum) {
		if(moveNum == 0){
			// 开始计时
			mTimerTool.start();
			// 隐藏提示文字
			game_tip.setVisible(false);
		}
		
		if (moveNum < ConstantUtil.LINES_LEN) {
			// 创建添加新的一行
			createNewRowBolcks();
		} else if (moveNum == ConstantUtil.LINES_LEN) {
			// 开始显示绿色胜利界面,即将胜利,但还没有胜利
			showSuccGroup();
		}
		// 被点击的黑块变灰
		pBlock.setColor(0.63f, 0.63f, 0.63f);
		pBlock.registerEntityModifier(new ScaleModifier(0.1f, 0.5f, 1.0f));
		// 移动步数加1
		moveNum++;
		// 需要移动的距离
		float moveDistance = this.getCameraHeight() - blockHight * stepNum
				- pBlock.getY();
		for (Block[] rowBlocks : blockList) {
			for (Block block : rowBlocks) {
				// 遍历,所有block向下移动指定距离
				moveToY(block, moveDistance);
			}
		}
		// 快到胜利出现绿色胜利界面时,胜利界面跟着移动
		if (mSuccGroup.isVisible()) {
			moveToY(mSuccGroup, moveDistance);
		}
	}
	/**
	 * 在Y轴方向上,由当前位置移动指定的距离
	 * 
	 * @param entity
	 *            要移动的实体
	 * @param moveDistance
	 *            需要移动的距离
	 */
	private void moveToY(IEntity entity, float moveDistance) {
		float pFromY = entity.getY();
		float pToY = pFromY + moveDistance;
		entity.registerEntityModifier(new MoveYModifier(0.1f, pFromY, pToY));
	}
	@Override
	public boolean onKeyUp(int keyCode, KeyEvent event) {
		if (keyCode == KeyEvent.KEYCODE_BACK) {
			this.getActivity().finish();
			return true;
		}
		return false;
	}
	
	@Override
	public void onSceneResume() {
		super.onSceneResume();
		this.setIgnoreUpdate(false);
	}
	
	@Override
	public void onScenePause() {
		super.onScenePause();
		this.setIgnoreUpdate(true);
	}
	@Override
	public void onSceneDestroy() {
		super.onSceneDestroy();
		LogUtil.d("onSceneDestroy");
	}
	// ================================================================
	/**
	 * 获取镜头的 右边 x 坐标
	 */
	public float getCameraRightX() {
		return this.getCameraWidth();
	}
	/**
	 * 获取镜头的 中点 x 坐标
	 * 
	 * @return
	 */
	public float getCameraCenterX() {
		return this.getCameraWidth() * 0.5f;
	}
	/**
	 * 获取镜头底部Y坐标
	 * 
	 * @return
	 */
	public float getCameraBottomY() {
		return this.getCameraHeight();
	}
	/**
	 * 获取镜头中心Y坐标
	 * 
	 * @return
	 */
	public float getCameraCenterY() {
		return this.getCameraHeight() * 0.5f;
	}
}
池彬宁:负责代码的实现(二)
blogs:www.cnblogs.com/Spr1ngxx
codes:
package com.orange.block.res;
public class Res {
	public static final String XML_GFX_GAME = "gfx/game.xml";
	public static final String[] ALL_XML = new String[]{
		Res.XML_GFX_GAME
	};
	public static final String BTN_AGAIN = "btn_again";
	public static final String BTN_BACK = "btn_back";
	public static final String BTN_START = "btn_start";
	public static final String GAME_MODEL = "game_model";
	public static final String GAME_TIP = "game_tip";
	public static final String GAME_TITEL = "game_titel";
}
package com.orange.block.entity;
import com.orange.entity.primitive.Rectangle;
import com.orange.input.touch.TouchEvent;
import com.orange.opengl.vbo.VertexBufferObjectManager;
import com.orange.util.color.Color;
import com.orange.block.scene.GameScene;
import com.orange.block.util.ConstantUtil;
/**
 * 单个块元素
 * 
 * @author lch
 * 
 */
public class Block extends Rectangle {
	// 游戏场景
	private GameScene mGameScene;
	// 此block的颜色类型,白色还是黑色?
	private int colorType;
	// block 所在的行
	private int row;
	// block 所在的列
	private int column;
	// ======================get&set========================
	public int getRow() {
		return row;
	}
	public void setRow(int row) {
		this.row = row;
	}
	public int getColumn() {
		return column;
	}
	public int getColorType() {
		return colorType;
	}
	// =====================================================
	/**
	 * 构造器1,初始化blocks时用到
	 * @param pGameScene 游戏场景
	 * @param row block所在的行
	 * @param column block所在的列
	 * @param pWidth block的宽
	 * @param pHeight block的高
	 * @param blackIndex 用来确定是否是黑块,如果blackIndex == column时设为黑块
	 * @param pVertexBufferObjectManager
	 */
	public Block(GameScene pGameScene, int row, int column, float pWidth,
			float pHeight, int blackIndex,
			VertexBufferObjectManager pVertexBufferObjectManager) {
		super(column * pWidth, (3 - row) * pHeight, pWidth - 1, pHeight - 1,
				pVertexBufferObjectManager);
		this.mGameScene = pGameScene;
		this.row = row;
		this.column = column;
		if (row == 0) {
			// 第一行设置为黄块
			this.setColor(Color.YELLOW);
		} else {
			// 初始化block的颜色数据,是白块还是黑块?
			initBlockData(column, blackIndex);
		}
		// 设置可以相应触碰事件
		this.setIgnoreTouch(false);
	}
	/**
	 * 构造器2,新增blocks时用到
	 * @param pGameScene 游戏场景
	 * @param column block所在的列
	 * @param pWidth block的宽
	 * @param pHeight block的高
	 * @param blackIndex 来确定是否是黑块,如果blackIndex == column时设为黑块
	 * @param pVertexBufferObjectManager
	 */
	public Block(GameScene pGameScene, int column, float pWidth, float pHeight,
			int blackIndex, VertexBufferObjectManager pVertexBufferObjectManager) {
		super(column * pWidth, 0, pWidth - 1, pHeight - 1,
				pVertexBufferObjectManager);
		this.mGameScene = pGameScene;
		this.column = column;
		// 初始化block的颜色数据,是白块还是黑块?
		initBlockData(column, blackIndex);
		// 设置可以相应触碰事件
		this.setIgnoreTouch(false);
	}
	
	/**
	 * 初始化block的颜色数据,是白块还是黑块?
	 * @param column
	 * @param blackIndex
	 */
	private void initBlockData(int column, int blackIndex) {
		if (blackIndex == column) {
			// 设置为黑块
			this.setColor(Color.BLACK);
			this.colorType = ConstantUtil.COLOR_BLACK;
		} else {
			// 设置为白块
			this.setColor(Color.WHITE);
			this.colorType = ConstantUtil.COLOR_WHITE;
		}
	}
	@Override
	public boolean onAreaTouched(TouchEvent pSceneTouchEvent,
			float pTouchAreaLocalX, float pTouchAreaLocalY) {
		// 触碰事件监听
		if (pSceneTouchEvent.isActionDown()) {
			// 点击到Block时进行的逻辑处理
			mGameScene.touchBlock(this);
		}
		return true;
	}
}
package com.orange.block.entity; import android.app.AlertDialog; import android.content.DialogInterface; import com.orange.entity.group.EntityGroup; import com.orange.entity.modifier.ScaleModifier; import com.orange.entity.primitive.Rectangle; import com.orange.entity.sprite.AnimatedSprite; import com.orange.entity.sprite.ButtonSprite; import com.orange.entity.sprite.ButtonSprite.OnClickListener; import com.orange.entity.text.Text; import com.orange.res.FontRes; import com.orange.util.color.Color; import com.orange.block.control.TimerTool; import com.orange.block.res.Res; import com.orange.block.scene.GameScene; import com.orange.block.util.ConstantUtil; import com.orange.block.util.SharedUtil; /** * 失败界面 * * @author lch * */ public class FailGroup extends EntityGroup { private GameScene mGameScene; private Rectangle bgRect; private AnimatedSprite titelSprite; private AnimatedSprite modelSprite; private ButtonSprite btn_back; // 返回按钮 private ButtonSprite btn_again;// 重来按钮 private Text txt_big; private Text txt_small; public FailGroup(float pWidth, float pHeight, GameScene pGameScene) { super(pWidth, pHeight, pGameScene); this.mGameScene = pGameScene; initView(); } private void initView() { // 背景 bgRect = new Rectangle(0, 0, this.getWidth(), this.getHeight(), this.getVertexBufferObjectManager()); this.attachChild(bgRect); bgRect.setColor(Color.RED); // 标题 “别踩白块儿” titelSprite = new AnimatedSprite(0, 10, Res.GAME_TITEL, this.getVertexBufferObjectManager()); titelSprite.setRightPositionX(this.getRightX() - 10); this.attachChild(titelSprite); // 模式 “经典模式” modelSprite = new AnimatedSprite(0, 150, Res.GAME_MODEL, this.getVertexBufferObjectManager()); modelSprite.setCentrePositionX(this.getCentreX()); this.attachChild(modelSprite); // 大字 txt_big = new Text(0, modelSprite.getBottomY() + 130, FontRes.getFont(ConstantUtil.FONT_NAME_RESULT), "", 15, this.getVertexBufferObjectManager()); this.attachChild(txt_big); txt_big.setScale(1.9f); // 小字 txt_small = new Text(0, txt_big.getBottomY() + 30, FontRes.getFont(ConstantUtil.FONT_NAME_RESULT), "", 15, this.getVertexBufferObjectManager()); this.attachChild(txt_small); txt_small.setScale(0.7f); // 返回按钮 btn_back = new ButtonSprite(80, 0, Res.BTN_BACK, this.getVertexBufferObjectManager()); btn_back.setBottomPositionY(this.getBottomY() - 50); btn_back.setIgnoreTouch(false); this.attachChild(btn_back); btn_back.setOnClickListener(onClickListener); // 重来按钮 btn_again = new ButtonSprite(0, 0, Res.BTN_AGAIN, this.getVertexBufferObjectManager()); btn_again.setRightPositionX(this.getRightX() - 80); btn_again.setBottomPositionY(this.getBottomY() - 50); btn_again.setIgnoreTouch(false); this.attachChild(btn_again); btn_again.setOnClickListener(onClickListener); resetView(); } public void showView() { setBtnEnable(true); this.setVisible(true); updateBigTxt("失败了!"); if (SharedUtil.getRecord(getActivity()) > 0) { TimerTool mTimerTool = mGameScene.getmTimerTool(); updateSmallTxt("最佳: " + mTimerTool.millisToTimer(SharedUtil .getRecord(getActivity()))); } ScaleModifier scaleModifier = new ScaleModifier(0.2f, 0.0f, 1.0f); this.registerEntityModifier(scaleModifier); } private void updateBigTxt(String pText) { txt_big.setText(pText); txt_big.setCentrePositionX(this.getCentreX()); } private void updateSmallTxt(String pText) { txt_small.setText(pText); txt_small.setCentrePositionX(this.getCentreX()); } private OnClickListener onClickListener = new OnClickListener() { @Override public void onClick(ButtonSprite pButtonSprite, float pTouchAreaLocalX, float pTouchAreaLocalY) { if (btn_back == pButtonSprite) { showDialog(); } else if (btn_again == pButtonSprite) { resetView(); mGameScene.resetGame(); } } }; private void resetView(){ this.setScale(0); this.setVisible(false); setBtnEnable(false); } private void setBtnEnable(boolean isEnable) { btn_back.setEnabled(isEnable); btn_again.setEnabled(isEnable); } /** * 退出游戏确认对话框 */ private void showDialog() { getActivity().runOnUiThread(new Runnable() { @Override public void run() { new AlertDialog.Builder(getActivity()) .setTitle("退出游戏") .setMessage("是否要退出游戏!") .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { getActivity().finish(); } }).setNegativeButton("取消", null).show(); } }); } }
package com.orange.block.entity; import android.app.AlertDialog; import android.content.DialogInterface; import com.orange.entity.group.EntityGroup; import com.orange.entity.primitive.Rectangle; import com.orange.entity.sprite.AnimatedSprite; import com.orange.entity.sprite.ButtonSprite; import com.orange.entity.sprite.ButtonSprite.OnClickListener; import com.orange.entity.text.Text; import com.orange.res.FontRes; import com.orange.util.color.Color; import com.orange.block.control.TimerTool; import com.orange.block.res.Res; import com.orange.block.scene.GameScene; import com.orange.block.util.ConstantUtil; import com.orange.block.util.SharedUtil; /** * 成功界面 * * @author lch * */ public class SuccGroup extends EntityGroup { private GameScene mGameScene; private Rectangle bgRect; private AnimatedSprite titelSprite; private AnimatedSprite modelSprite; private ButtonSprite btn_back; // 返回按钮 private ButtonSprite btn_again;// 重来按钮 private Text txt_big; private Text txt_small; public SuccGroup(float pWidth, float pHeight, GameScene pGameScene) { super(pWidth, pHeight, pGameScene); initView(); this.mGameScene = pGameScene; } private void initView() { // 背景 bgRect = new Rectangle(0, 0, this.getWidth(), this.getHeight(), this.getVertexBufferObjectManager()); this.attachChild(bgRect); bgRect.setColor(Color.GREEN); // 标题 “别踩白块儿” titelSprite = new AnimatedSprite(0, 10, Res.GAME_TITEL, this.getVertexBufferObjectManager()); titelSprite.setRightPositionX(this.getRightX() - 10); this.attachChild(titelSprite); titelSprite.setVisible(false); // 模式 “经典模式” modelSprite = new AnimatedSprite(0, 150, Res.GAME_MODEL, this.getVertexBufferObjectManager()); modelSprite.setCentrePositionX(this.getCentreX()); this.attachChild(modelSprite); modelSprite.setVisible(false); // 大字 txt_big = new Text(0, modelSprite.getBottomY() + 100, FontRes.getFont(ConstantUtil.FONT_NAME_RESULT), "", 15, this.getVertexBufferObjectManager()); this.attachChild(txt_big); txt_big.setScale(1.5f); txt_big.setVisible(false); // 小字 txt_small = new Text(0, txt_big.getBottomY() + 10, FontRes.getFont(ConstantUtil.FONT_NAME_RESULT), "", 15, this.getVertexBufferObjectManager()); this.attachChild(txt_small); txt_small.setScale(0.7f); txt_small.setVisible(false); // 返回按钮 btn_back = new ButtonSprite(80, 0, Res.BTN_BACK, this.getVertexBufferObjectManager()); btn_back.setBottomPositionY(this.getBottomY() - 50); btn_back.setIgnoreTouch(false); this.attachChild(btn_back); btn_back.setOnClickListener(onClickListener); btn_back.setVisible(false); // 重来按钮 btn_again = new ButtonSprite(0, 0, Res.BTN_AGAIN, this.getVertexBufferObjectManager()); btn_again.setRightPositionX(this.getRightX() - 80); btn_again.setBottomPositionY(this.getBottomY() - 50); btn_again.setIgnoreTouch(false); this.attachChild(btn_again); btn_again.setOnClickListener(onClickListener); btn_again.setVisible(false); } public void showItems(boolean pVisible) { titelSprite.setVisible(pVisible); modelSprite.setVisible(pVisible); txt_big.setVisible(pVisible); txt_small.setVisible(pVisible); btn_back.setVisible(pVisible); btn_again.setVisible(pVisible); if (pVisible) { TimerTool mTimerTool = mGameScene.getmTimerTool(); updateBigTxt(mTimerTool.millisToTimer(mTimerTool .getMillisPass())); long mMillisPass = mTimerTool.getMillisPass(); if (mMillisPass < SharedUtil.getRecord(getActivity()) || SharedUtil.getRecord(getActivity()) == 0) { // 新记录 updateSmallTxt("新记录"); SharedUtil.setRecord(getActivity(), mMillisPass); } else { updateSmallTxt("最佳: " + mTimerTool.millisToTimer(SharedUtil .getRecord(getActivity()))); } } } public void updateBigTxt(String pText) { txt_big.setText(pText); txt_big.setCentrePositionX(this.getCentreX()); } public void updateSmallTxt(String pText) { txt_small.setText(pText); txt_small.setCentrePositionX(this.getCentreX()); } private OnClickListener onClickListener = new OnClickListener() { @Override public void onClick(ButtonSprite pButtonSprite, float pTouchAreaLocalX, float pTouchAreaLocalY) { if (btn_back == pButtonSprite) { showDialog(); } else if (btn_again == pButtonSprite) { mGameScene.resetGame(); } } }; /** * 退出游戏确认对话框 */ private void showDialog() { getActivity().runOnUiThread(new Runnable() { @Override public void run() { new AlertDialog.Builder(getActivity()) .setTitle("退出游戏") .setMessage("是否要退出游戏!") .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { getActivity().finish(); } }).setNegativeButton("取消", null).show(); } }); } }
贺邦:负责代码的调试与测试
blogs:http://www.cnblogs.com/L1nke/
codes:
1 public class Test { 2 private int fAmount; 3 private String fCurrency; 4 5 public Test(int amount, String currency) { 6 fAmount= amount; 7 fCurrency= currency; 8 } 9 10 public int amount() { 11 return fAmount; 12 } 13 14 public String currency() { 15 return fCurrency; 16 } 17 18 public Test add(Test m) { 19 return new Test(amount()+m.amount(), currency()); 20 } 21 22 public boolean equals(Object anObject) { 23 if (anObject instanceof Test) { 24 Test aMoney= (Test)anObject; 25 return aMoney.currency().equals(currency()) 26 && amount() == aMoney.amount(); 27 } 28 return false; 29 } 30 }
| 步骤 | 耗时 | 百分比 | 
| 需求分析 | 20min | 3.8% | 
| 设计 | 50min | 9.6% | 
| 代码实现 | 300min | 57.7% | 
| 测试 | 120min | 23.1% | 
| 分析总结 | 30min | 5.8% | 
标签:
原文地址:http://www.cnblogs.com/Spr1ngxx/p/4550434.html