---恢复内容开始---

一、敏捷开发与XP

二、编码标准

1.编码标准中的版式就是一个很好的例子,版式虽然不会影响程序的功能,但会影响可读性。程序的版式追求清晰、美观,是程序风格的重要因素。单击Eclipse菜单中的source->Format 或用快捷键Ctrl+Shift+F就可以按Eclipse规定的规范缩进。

2. 代码标准中很重要的一项是如何给包、类、变量、方法等标识符命名,能很好的命名可以让自己的代码立马上升一个档次。Java中的一般的命名规则有:

  • 要体现各自的含义
  • 包、类、变量用名词
  • 方法名用动宾
  • 包名全部小写,如:io,awt
  • 类名第一个字母要大写,如:HelloWorldApp
  • 变量名第一个字母要小写,如:userName
  • 方法名第一个字母要小写:setName

三、重构

重构(Refactor),就是在不改变软件外部行为的基础上,改变软件内部的结构,使其更加易于阅读、易于维护和易于变更 。

重构之后的Student Test代码:

别踩白块:

齐岳:负责代码的实现(一)

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);

}

池彬宁:负责代码的实现(二)

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%

}

/**

* 在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;

}

}

---恢复内容结束---

实验三 敏捷开发与XP实践(改)的更多相关文章

  1. JAVA课程实验报告 实验三 敏捷开发与XP实践

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计  班级:1353  姓名:韩玉琪  学号:20135317 成绩:             指导教师:娄嘉 ...

  2. 20155324 《Java程序设计》实验三 敏捷开发与XP实践

    20155324 <Java程序设计>实验三 敏捷开发与XP实践 实验内容 XP基础 1.XP核心实践 2.相关工具 实验步骤 敏捷开发与XP 1.敏捷开发(Agile Developme ...

  3. 20165235 实验三 敏捷开发与XP实践

    20165235 实验三 敏捷开发与XP实践 主目录: 姓名:祁瑛 学号:20165235 班级:1652 实验课程:JAVA程序设计 实验名称:Java面向对象程序设计 实验时间:2018.4.30 ...

  4. 20165305 实验三 敏捷开发与XP实践

    实验3-1 敏捷开发与XP实践 http://www.cnblogs.com/rocedu/p/4795776.html, Eclipse的内容替换成IDEA 参考 http://www.cnblog ...

  5. 20155303 实验三 敏捷开发与XP实践

    20155303 实验三 敏捷开发与XP实践 目录 一.编码标准 任务一:在IDEA中使用工具(Code->Reformate Code)格式化代码,并学习Code菜单的功能 二.敏捷开发与XP ...

  6. 20155314 2016-2017-2 《Java程序设计》实验三 敏捷开发与XP实践

    20155314 2016-2017-2 <Java程序设计>实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验知识点总结 (一)敏捷开发与XP 软件工程:把系统 ...

  7. 20145203盖泽双java实验三 敏捷开发与XP实践

    java实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> ...

  8. 20155327 实验三 敏捷开发与XP实践

    20155327 实验三 敏捷开发与XP实践 实验内容 任务一 参考 http://www.cnblogs.com/rocedu/p/6371315.html#SECCODESTANDARD 安装al ...

  9. 20155231 实验三 敏捷开发与XP实践

    20155231 实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器&g ...

  10. 2016-2017-2 20155339 《Java面向对象程序设计》实验三敏捷开发与XP实践实验报告

    2016-2017-2 20155339 <Java面向对象程序设计>实验三敏捷开发与XP实践实验报告 实验内容 XP基础 XP核心实践 相关工具 实验内容 一.在IDEA中使用工具(Co ...

随机推荐

  1. 4、Type fundamentals

    1.All Types Are Derived from System.Object The CLR requires all objects to be created using the new ...

  2. 序列的方法(str,list,tuple)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在快速教程中,我们了解了最基本的序列(sequence).回忆一下,序列包含有定值 ...

  3. day20 FORM补充(随时更新),F/Q操作,model之多对多,django中间件,缓存,信号

    python-day20 1.FROM生成select标签的数据应该来源于数据库. 2.model 操作 F/Q  (组合查询) 3.model 多对多操作. 4.中间件 :在请求到达url前先会经过 ...

  4. 20150203一些移动端H5小bug解决

    都是一些我也不知道为什么会有的bug. 1. 在三星note2,小米2,页面加载后,页面有黑块. 那么提高被盖住的部分z-index. 2. iphone5 ,ios7.0.4,上文字显示不出 那么就 ...

  5. JSP学习——语法

    JSP模版元素 JSP表达式 JSP脚本片断 JSP注释JSP指令JSP标签 JSP内置对象如何查找JSP页面中的错误 1:JSP模版元素 : JSP页面中的HTML内容称之为JSP模版元素. JSP ...

  6. sql概要

    sql(structured query language) 1.比较运算符一共有六种,分别为等于(=),小于(<),大于(>),小于或等于(<=),大于或等于(>=)以及不等 ...

  7. [转载] 每周推荐阅读 BFQ:实现IO的隔离共享与高吞吐访问

    磁盘IO和网络IO隔离与共享是混部应用中基本需求,从早些年的BVC到现在的Matrix,以及Galaxy,或者未来的BS/Mint混部都遇到类似的问题:由于无法有效实现IO级的隔离(包括吞吐隔离.延时 ...

  8. bootstrap学习笔记<二>(标题,段落样式)

    标题.样式:class="h1"~class="h6" bootstrap中重新定义了h1~h6标签,具体差别如下: 在bootstrap中其他任何标签使用cl ...

  9. Android 呼吸灯流程分析

    一.Android呼吸灯Driver实现 1.注册驱动 代码位置:mediatek/kernel/drivers/leds/leds_drv.c 602static struct platform_d ...

  10. poj1873The Fortified Forest

    链接 居然是WF的水题~ 二进制枚举砍哪些树,剩余的树围成一个凸包. 因为传数组WA了两发,忘记修改排序数组中的p[0]; #include <iostream> #include< ...