Microsoft Word - 使用OGEngine开发别踩白块儿.doc

Similar documents
Microsoft Word - 第7章 图表反转形态.doc

第2章 数据类型、常量与变量

I


何 秋 琳 张 立 春 视 觉 学 习 研 究 进 展 视 觉 注 意 视 觉 感 知

国债回购交易业务指引

登录、注册功能的测试用例设计.doc

生产支援功能 使用说明书(IP-110 篇)

修改版-操作手册.doc

<4D F736F F D20B3D6B2D6CFDEB6EEB1EDB8F1D7EED6D52E646F63>

目 录 关 于 图 标... 3 登 陆 主 界 面... 3 工 单 管 理... 5 工 单 列 表... 5 搜 索 工 单... 5 工 单 详 情... 6 创 建 工 单... 9 设 备 管 理 巡 检 计 划 查 询 详 情 销 售 管

说 明 为 了 反 映 教 运 行 的 基 本 状 态, 为 校 和 院 制 定 相 关 政 策 和 进 行 教 建 设 与 改 革 提 供 据 依 据, 校 从 程 资 源 ( 开 类 别 开 量 规 模 ) 教 师 结 构 程 考 核 等 维 度, 对 2015 年 春 季 期 教 运 行 基

Template BR_Rec_2005.dot

,,,,, :,, (.,, );, (, : ), (.., ;. &., ;.. &.., ;, ;, ),,,,,,, ( ) ( ),,,,.,,,,,, : ;, ;,.,,,,, (., : - ),,,, ( ),,,, (, : ),, :,

3 复 试 如 何 准 备 4 复 试 成 绩 计 算 5 复 试 比 例 6 复 试 类 型 7 怎 么 样 面 对 各 种 复 试 04 05

全国建筑市场注册执业人员不良行为记录认定标准(试行).doc

抗 战 时 期 国 民 政 府 的 银 行 监 理 体 制 探 析 % # % % % ) % % # # + #, ) +, % % % % % % % %

火车浏览器脚本制作教程

Microsoft Word - 第3章.doc

目 录 一 系 统 访 问... 1 二 门 户 首 页 申 报 用 户 审 核 用 户... 2 三 系 统 登 录 用 户 名 密 码 登 录 新 用 户 注 册 用 户 登 录 已 注 册 用

2. 本 次 修 改 后, 投 资 者 申 购 新 股 的 持 有 市 值 要 求 市 值 计 算 规 则 及 证 券 账 户 使 用 的 相 关 规 定 是 否 发 生 了 变 化? 答 : 未 发 生 变 化 投 资 者 申 购 新 股 的 持 有 市 值 是 指, 以 投 资 者 为 单 位

<4D F736F F D C3E6CFF2B6D4CFF3A3A8B5DAC8FDD5C220C0E0CCD8D0D4A3A92E646F63>

<433A5C446F63756D656E E E67735C41646D696E F725CD7C0C3E65CC2DBCEC4CFB5CDB3CAB9D3C3D6B8C4CFA3A8BCF2BBAFA3A95CCAB9D3C3D6B8C4CF31302D31392E646F63>

深圳市新亚电子制程股份有限公司

第 期 李 伟 等 用 方 法 对 中 国 历 史 气 温 数 据 插 值 可 行 性 讨 论

0 年 上 半 年 评 价 与 考 核 细 则 序 号 部 门 要 素 值 考 核 内 容 考 核 方 式 考 核 标 准 考 核 ( 扣 原 因 ) 考 评 得 3 安 全 生 产 目 30 无 同 等 责 任 以 上 道 路 交 通 亡 人 事 故 无 轻 伤 责 任 事 故 无 重 大 质 量

上海证券交易所会议纪要

三武一宗灭佛研究

龚 亚 夫 在 重 新 思 考 基 础 教 育 英 语 教 学 的 理 念 一 文 中 援 引 的 观 点 认 为 当 跳 出 本 族 语 主 义 的 思 维 定 式 后 需 要 重 新 思 考 许 多 相 连 带 的 问 题 比 如 许 多 发 音 的 细 微 区 别 并 不 影 响 理 解 和

ETF、分级基金规模、份额变化统计

目 录 一 激 活 账 号... 2 二 忘 记 密 码 后 如 何 找 回 密 码?... 3 三 如 何 管 理 学 校 信 息 及 球 队 学 生 教 师 等 信 息... 6 四 如 何 发 布 本 校 校 园 文 化? 五 如 何 向 教 师 发 送 通 知? 六

第 三 章 审 计 证 据 2

2006年顺德区高中阶段学校招生录取分数线

Microsoft Word - Disclose.doc

操作手册

珠江钢琴股东大会

·岗位设置管理流程

中 国 软 科 学 年 第 期!!!

黄 金 原 油 总 持 仓 增 长, 同 比 增 幅 分 别 为 4.2% 和 4.1% 而 铜 白 银 以 及 玉 米 则 出 现 减 持, 减 持 同 比 减 少 分 别 为 9.4%,9.4% 以 及 6.5% 大 豆, 豆 粕 结 束 连 续 4 周 总 持 仓 量 增 长, 出 现 小 幅

采 取 行 动 的 机 会 90% 开 拓 成 功 的 道 路 2

马 克 思 主 义 公 正 观 的 基 本 向 度 及 方 法 论 原 则!! # #


上证指数

Microsoft Word - 文件汇编.doc

抗 日 战 争 研 究 年 第 期 % & ( # #

<4D F736F F D20B9D8D3DAB0BABBAAA3A8C9CFBAA3A3A9D7D4B6AFBBAFB9A4B3CCB9C9B7DDD3D0CFDEB9ABCBBE C4EAC4EAB6C8B9C9B6ABB4F3BBE1B7A8C2C9D2E2BCFBCAE92E646F6378>


《C语言基础入门》课程教学大纲

一、资质申请

抗 日 战 争 研 究 年 第 期

关于修订《沪市股票上网发行资金申购

金 不 少 于 800 万 元, 净 资 产 不 少 于 960 万 元 ; (3) 近 五 年 独 立 承 担 过 单 项 合 同 额 不 少 于 1000 万 元 的 智 能 化 工 程 ( 设 计 或 施 工 或 设 计 施 工 一 体 ) 不 少 于 2 项 ; (4) 近 三 年 每 年

<4D F736F F D D323630D6D0B9FAD3A6B6D4C6F8BAF2B1E4BBAFB5C4D5FEB2DFD3EBD0D0B6AF C4EAB6C8B1A8B8E6>

18 上 报 该 学 期 新 生 数 据 至 阳 光 平 台 第 一 学 期 第 四 周 至 第 六 周 19 督 促 学 习 中 心 提 交 新 增 专 业 申 请 第 一 学 期 第 四 周 至 第 八 周 20 编 制 全 国 网 络 统 考 十 二 月 批 次 考 前 模 拟 题 第 一 学

世华财讯模拟操作手册

《深圳市场首次公开发行股票网上按市值申购实施办法》.doc

上海证券交易所会议纪要

用节点法和网孔法进行电路分析

i 1) 系 统 运 作 前 设 定 *1. [2.1 网 页 主 机 名 称 设 定 ] -- 设 定 校 务 系 统 的 主 机 IP 地 址, 以 供 其 他 个 人 电 脑 连 接 及 使 用 该 系 统 *2. [2.3.1 输 入 / 修 改 学 校 资 料 ] -- 输 入 系 统 使


Your Child is Myopic

课程类 别

年 8 月 11 日, 公 司 召 开 2015 年 第 五 次 临 时 股 东 大 会, 审 议 通 过 了 关 于 公 司 <2015 年 股 票 期 权 激 励 计 划 ( 草 案 )> 及 其 摘 要 的 议 案 关 于 提 请 股 东 大 会 授 权 董 事 会 办 理 公

系统设计文档_样稿管理模块 V1.1_.doc

投 资 者 可 在 基 金 管 理 人 指 定 的 销 售 机 构 申 购 和 赎 回 美 元 等 外 币 销 售 的 基 金 份 额, 具 体 详 见 基 金 管 理 人 相 关 公 告 2 在 三 申 购 与 赎 回 的 原 则 部 分 增 加 : 1 本 基 金 采 用 多 币 种 销 售,

!!!!!!!!!!

一 从 分 封 制 到 郡 县 制 一 从 打 虎 亭 汉 墓 说 起

目 录 一 插 入 您 的 保 密 杀 毒 U 盘 3 二 控 制 面 板 USB SECURE ANTIVIRUS 实 时 监 控 USB SECURE ANTIVIRUS 手 动 扫 描 USB SECURE ANTIVIRUS 开 放 空 间 存 取 12

<443A5C6D B5C30312EB9A4D7F7CEC4B5B55C30322EBACFCDACCEC4B5B55C C30342EC8CBC9E7CCFC5C31332ECFEEC4BFC5E0D1B55C E30385C322EB2D9D7F7CAD6B2E12E646F63>

现 场 会 议 时 间 为 :2016 年 5 月 19 日 网 络 投 票 时 间 为 :2016 年 5 月 18 日 年 5 月 19 日 其 中 通 过 深 圳 证 券 交 易 所 交 易 系 统 进 行 网 络 投 票 的 时 间 为 2016 年 5 月 19 日 9:30-

Excel basics

Cybozu Garoon 3 管理员手册

第二讲 数列

4.3.3 while 语 句 用 于 无 限 循 环 当 while 语 句 的 表 达 式 永 远 不 会 为 布 尔 假 时, 循 环 将 永 远 不 会 结 束, 形 成 无 限 循 环, 也 称 死 循 环 使 用 while 语 句 构 成 无 限 循 环 的 格 式 通 常

 编号:

云信Linux SSH认证代理用户手册

<4D F736F F D C4EAB9A4B3CCCBB6CABFCAFDD1A7D7A8D2B5BFCEBFBCCAD4B4F3B8D9D3EBD2AAC7F3>

<4D F736F F D DB9FAD5AEC6DABBF5B1A8B8E6CAAEC8FDA3BAB9FAD5AEC6DABBF5B5C4B6A8BCDBBBFAD6C6D3EBBBF9B2EEBDBBD2D7D1D0BEBF>

光明乳业股份有限公司

3 月 30 日 在 中 国 证 券 报 上 海 证 券 报 证 券 时 报 证 券 日 报 和 上 海 证 券 交 易 所 网 站 上 发 出 召 开 本 次 股 东 大 会 公 告, 该 公 告 中 载 明 了 召 开 股 东 大 会 的 日 期 网 络 投 票 的 方 式 时 间 以 及 审

引言

超 级 玛 丽 JAVA 小 游 戏 测 试 报 告 1. 导 言 1.1 编 写 目 的 该 文 档 的 目 的 是 描 述 超 级 玛 丽 JAVA 小 游 戏 的 系 统 测 试 的 总 结 报 告, 其 主 要 内 容 包 括 : 系 统 环 境 的 介 绍 功 能 的 实 现 的 测 试

第 一 部 分 MagiCAD for Revit 安 装 流 程

<4D F736F F F696E74202D20D5D4BAE9BDF8D6D0BCB B9C9B7DDD6A7B8B6BFCEBCFE>

电信系教学大纲的基本规范

目 录 页 1. 欢 迎 使 用 网 上 预 约 面 谈 访 问 系 统 新 用 户 新 用 户 登 入 帐 户 程 序 启 动 网 上 预 约 面 谈 访 问 帐 户 核 对 帐 户 的 地 址 资 料


评 委 : 李 炎 斌 - 个 人 技 术 标 资 信 标 初 步 审 查 明 细 表 序 号 投 标 单 位 投 标 函 未 按 招 标 文 件 规 定 填 写 漏 填 或 内 容 填 写 错 误 的 ; 不 同 投 标 人 的 投 标 文 件 由 同 一 台 电 脑 或 同 一 家 投 标 单

目 录 第 一 章 博 星 卓 越 电 子 商 务 营 销 策 划 实 践 平 台 硬 件 使 用 介 绍... 3 第 二 章 博 星 卓 越 电 子 商 务 营 销 策 划 实 践 平 台 管 理 员 端 功 能 使 用 介 绍 系 统 管 理 员 登 陆 班

工 程 造 价 咨 询 企 业 管 理 系 统 操 作 手 册 目 录 1 造 价 企 业 登 录 企 业 基 本 信 息 查 看 企 业 人 员 信 息 查 看 企 业 基 本 信 息 操 作 企 业 简 介 企 业 章


第 9 章 如 果 打 印 机 通 过 FireWire 连 接, 则 HP 建 议 使 用 FireWire 模 块 添 加 打 印 机, 以 充 分 利 用 FireWire 打 印 的 各 项 功 能, 并 且 仅 使 用 IP over Firewire 访 问 打 印 机 的 内 嵌 式

四川省农村义务教育学生

<4D F736F F D20B6C0C1A2B6ADCAC2D0ECCCFABEFDCFC8C9FABCB0CCE1C3FBC8CBC9F9C3F72E646F63>

<4D F736F F D20D3A5D2EDC6DABBF5D6FACAD6CFB5CDB356312E302DD3C3BBA7CAB9D3C3CBB5C3F7CAE9>

证券代码: 证券简称:长城电脑 公告编号:

类 似 地, 又 可 定 义 变 下 限 的 定 积 分 : ( ). 与 ψ 统 称 为 变 限 积 分. f ( ) d f ( t) dt,, 注 在 变 限 积 分 (1) 与 () 中, 不 可 再 把 积 分 变 量 写 成 的 形 式 ( 例 如 ) 以 免 与 积 分 上 下 限 的

第 六 章 债 券 股 票 价 值 评 估 1 考 点 一 : 债 券 价 值 的 影 响 因 素 2

HSK( 一 级 ) 考 查 考 生 的 日 常 汉 语 应 用 能 力, 它 对 应 于 国 际 汉 语 能 力 标 准 一 级 欧 洲 语 言 共 同 参 考 框 架 (CEF) A1 级 通 过 HSK( 一 级 ) 的 考 生 可 以 理 解 并 使 用 一 些 非 常 简 单 的 汉 语

境 外 上 市 外 资 股 股 东 持 有 股 份 总 数 (H 股 ) 489,157,907 3 出 席 会 议 的 股 东 所 持 有 表 决 权 股 份 数 占 公 司 有 表 决 权 股 份 总 数 的 其 中 :A 股 股 东 持 股 占 股 份 总 数 的

Transcription:

别 踩 白 块 儿 别 踩 白 块 儿 是 目 前 非 常 火 的 一 款 游 戏, 游 戏 非 常 简 单 刺 激 关 于 具 体 怎 么 火 法 怎 么 玩 我 就 不 多 说 了, 相 信 看 到 本 文 的 朋 友 们 都 非 常 地 清 楚 什 么 游 戏 火, 我 们 都 想 知 道 自 己 能 不 能 也 弄 一 个 玩 玩, 我 也 花 了 点 时 间 弄 了 一 个, 游 戏 代 码 将 会 开 源, 利 人 利 己, 大 家 一 起 提 高, 希 望 各 位 多 多 支 持 下 面 介 绍 如 何 用 OGEngine 游 戏 引 擎 完 成 别 踩 白 块 儿 游 戏 的 经 典 模 式 一 最 终 实 现 的 部 分 效 果 截 图 1 刚 开 始 时, 最 下 面 有 一 栏 为 黄 色, 紧 接 着 上 面 每 一 行 都 是 有 一 个 黑 色 块, 其 余 为 白 色 块, 准 备 冲 啊... 2 游 戏 中, 在 游 戏 过 程 中 都 有 一 个 计 时 器, 记 录 当 前 所 进 行 的 时 间 冲 啊... 注 意 别 点 到 了 白 块 儿

3 玩 家 如 果 误 点 了 白 色 块, 会 出 现 游 戏 失 败 界 面, 如 果 之 前 有 创 立 过 最 佳 成 绩, 则 会 显 示 出 来, 记 录 的 是 完 成 任 务 所 用 的 时 间, 时 间 越 短 说 明 你 越 厉 害 点 击 重 来 即 会 重 新 开 始 4 游 戏 进 行 到 最 后 会 出 现 绿 色 栏, 游 戏 胜 利 界 面, 会 显 示 本 次 所 用 时 间, 如 果 刷 新 了 记 录

则 标 记 新 纪 录 字 样, 如 果 没 有 刷 新 记 录 则 还 会 显 示 历 史 最 佳 记 录 大 伙 努 力 挑 战 新 记 录 吧!

二 创 建 Block 类 游 戏 中 要 用 到 很 多 方 块, 所 以 我 们 单 独 创 建 一 个 方 块 类 Block Block 是 一 个 个 白 块 或 者 黑 块, 单 个 块 元 素, 这 里 我 们 的 Block 继 承 矩 形 Rectangle, 每 个 Block 用 矩 形 来 展 示 1 声 明 一 些 所 需 要 的 成 员 变 量 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; // =====================================================

2 构 造 器 1, 初 始 化 blocks 时 用 到, 当 为 最 底 部 一 行 时 设 为 黄 色 * 构 造 器 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);

3 构 造 器 2, 新 增 blocks 时 用 到 * 构 造 器 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); 4 实 现 函 数 initblockdata 初 始 化 block 的 颜 色 数 据, 是 白 块 还 是 黑 块 * 初 始 化 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;

5 每 个 block 实 现 触 碰 监 听, 当 按 下 时, 调 起 在 GameScene 中 实 现 的 touchblock 方 法 记 得 设 置 可 以 相 应 触 碰 事 件 setignoretouch(false); @Override public boolean onareatouched(touchevent pscenetouchevent, float ptoucharealocalx, float ptoucharealocaly) { // 触 碰 事 件 监 听 if (pscenetouchevent.isactiondown()) { // 点 击 到 Block 时 进 行 的 逻 辑 处 理 mgamescene.touchblock(this); return true; 三 创 建 GameScene 类 GameScene 类 是 游 戏 场 景 类, 是 本 游 戏 的 主 要 部 分, 主 要 实 现 游 戏 界 面 及 相 关 逻 辑 1 先 看 看 其 成 员 变 量 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;

2 计 算 每 个 block 块 的 宽 高 // 镜 头 里 显 示 的 是 4*4 的 块, 所 以 用 镜 头 宽 的 四 分 之 一 作 为 块 宽 blockwidth = this.getcamerawidth() / 4; blockhight = this.getcameraheight() / 4; 3 初 始 blocks, 先 创 建 4*5 表 格, 使 用 时 候 再 一 行 行 增 加 * 初 始 化 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);

游 戏 交 互 实 现 1 前 面 已 经 介 绍 在 Block 类 实 现 了 每 个 block 的 触 碰 监 听,block 实 现 触 碰 监 听, 当 按 下 时, 调 起 在 GameScene 中 实 现 的 touchblock 方 法 下 面 来 看 改 方 法 的 实 现 * 点 击 到 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);

上 面 的 代 码 已 经 有 所 注 释, 这 里 再 简 单 解 析 一 下 1 理 论 上 可 以 点 击 的 一 行 为 倒 数 第 二 行, 如 果 点 击 到 该 行 的 黑 块, 则 所 有 block 向 下 移 动 一 格, 如 果 点 击 到 该 行 的 白 块, 则 游 戏 失 败, 弹 出 失 败 界 面 2 为 了 体 验 上 的 优 化, 如 果 点 击 到 倒 数 第 二 行 黑 块 所 在 列 正 对 上 的 一 个 block( 不 管 是 黑 块 还 是 白 块 ) 也 视 为 正 确 点 击 了 黑 块 因 为 在 快 速 点 击 黑 块 的 同 时 整 体 的 block 也 迅 速 向 下 移 动, 很 容 易 点 击 到 上 一 格, 此 时 我 们 认 为 这 也 是 正 确 的 点 击, 这 样 才 能 保 证 快 速 点 击 的 连 贯 性 2 判 断 是 不 是 点 击 了 该 点 击 的 黑 块 的 上 一 格, 如 果 是, 我 们 也 判 定 这 是 正 确 点 击 了, 做 出 相 应 移 动 * 判 断 是 不 是 点 击 了 该 点 击 的 黑 块 的 上 一 格, 如 果 是, 我 们 也 判 定 这 是 正 确 点 击 了, 做 出 相 应 移 动 * * @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;

3 方 块 下 移 等 相 关 逻 辑 movedown 方 法 的 实 现 // 正 确 点 击 该 点 击 的 黑 块, 或 者 上 一 行 的 块, 整 体 向 下 移 动 创 建 新 的 一 样 块, 改 变 黑 块 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); 1moveNum 用 来 记 录 移 动 了 多 少 步, 第 一 次 开 始 下 移 时, 我 们 开 始 计 时 以 及 隐 藏 下 边 的 提 示 文 字 2 如 果 还 没 有 达 到 预 设 的 总 行 数 就 创 建 添 加 新 的 一 行 blocks, 如 果 到 了 则 开 始 显 示 绿 色 胜 利 界 面 3 被 点 击 的 黑 块 变 灰 色, 加 点 小 小 的 动 作 效 果 4 计 算 出 需 要 向 下 移 动 的 距 离, 遍 历 所 有 blocks, 向 下 移 动 指 定 距 离 5 快 到 胜 利 出 现 绿 色 胜 利 界 面 时, 胜 利 界 面 跟 着 移 动

4 创 建 添 加 新 的 一 行 createnewrowbolcks() 方 法 的 实 现 // 创 建 添 加 新 的 一 行 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++; 1 先 把 超 出 屏 幕 没 用 的 部 分 移 除 掉, 把 新 增 的 一 行 blocks 的 位 置 设 在 最 顶 端, 设 置 已 经 是 第 几 行

5 游 戏 成 功 或 者 游 戏 失 败 * 最 后 一 个 移 动, 游 戏 胜 利 * * @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);

计 时 控 制 类 TimerTool 的 实 现 我 们 知 道 游 戏 一 开 始 就 会 有 时 间 的 计 时, 完 成 指 定 任 务 后, 时 间 越 短 越 厉 害, 玩 家 通 过 不 断 刷 新 记 录 来 提 高 对 游 戏 的 成 就 感, 所 以 计 时 显 示 历 史 最 佳 记 录 必 不 可 少 下 面 我 们 就 来 看 看 如 何 实 现 计 时 我 们 使 用 OGEngine 引 擎 中 的 TimerHandler 来 实 现 计 时, 我 们 先 来 了 解 一 下 TimerHandler 从 源 码 我 们 发 现 它 实 现 IUpdateHandler 接 口 public class TimerHandler implements IUpdateHandler{ 再 来 看 一 下 它 的 构 造 器 * @param ptimerseconds 经 过 多 少 秒 后 执 行 ptimercallback 中 的 回 调 * @param pautoreset 是 否 循 环 执 行 * @param ptimercallback 回 调 函 数 public TimerHandler(final float ptimerseconds, final boolean pautoreset, final ITimerCallback ptimercallback) { if(ptimerseconds <= 0){ throw new IllegalStateException("pTimerSeconds must be > 0!"); this.mtimerseconds = ptimerseconds; this.mautoreset = pautoreset; this.mtimercallback = ptimercallback; 下 面 来 看 TimerTool 的 具 体 实 现 1 所 定 义 的 成 员 变 量, 构 造 器 实 现 public class TimerTool { private GameScene mgamescene; private TimerHandler mtimerhandler; 当 前 经 过 的 总 毫 秒 数 * private long millispass = 0; 是 否 计 时 中 * private boolean iscountdowning = false; 多 少 毫 秒 累 加 一 次 计 时 * private static long stepmillis = 83; public TimerTool(GameScene pgamescene) { this.mgamescene = pgamescene; inittimerhandler(); 2 初 始 化 TimerHandler

// 初 始 化 TimerHandler, 设 置 为 每 隔 stepmillis * 0.001f 秒 循 环 回 调 ontimepassed 方 法 private void inittimerhandler() { mtimerhandler = new TimerHandler(stepMillis * 0.001f, true, new ITimerCallback() { @Override public void ontimepassed(timerhandler ptimerhandler) { // 累 加 所 经 过 的 时 间, 并 在 界 面 上 更 新 显 示 当 前 时 间 addmillispass(); ); 3 相 关 时 间 的 逻 辑 实 现 // 重 置 时 间 public void resettimer() { millispass = 0; iscountdowning = false; // 累 加 所 经 过 的 时 间, 并 在 界 面 上 更 新 显 示 当 前 时 间 private void addmillispass() { millispass += stepmillis; mgamescene.gettimertext().settext(millistotimer(millispass)); // 获 取 当 前 经 过 的 总 毫 秒 数 public long getmillispass() { return millispass; // 把 毫 秒 转 化 为 一 种 分 秒 毫 秒 的 文 本 显 示 模 式 字 符 串 public String millistotimer(long pmillispass) { String timer = ""; long min = pmillispass / 60000; long sec = (pmillispass - min * 60000) / 1000; String secstr = sec < 10? "0" + sec : String.valueOf(sec); long millisec = pmillispass % 1000; if (min > 0) { timer += min + ":"; timer += secstr + "." + millisec + "\""; return timer; 4 开 始 计 时 和 结 束 计 时

// 注 册 mtimerhandler 开 始 计 时 public void start() { if (!iscountdowning) { iscountdowning = true; mgamescene.registerupdatehandler(mtimerhandler); // 反 注 册 mtimerhandler 停 止 计 时 public void stop() { mgamescene.unregisterupdatehandler(mtimerhandler); 在 正 确 点 击 第 一 块 黑 块 的 时 候 开 始 计 时, 游 戏 失 败 或 者 游 戏 完 成 时 停 止 计 时, 保 存 好 记 录 的 时 间, 在 胜 利 界 面 或 失 败 界 面 根 据 实 际 情 况 实 现 所 用 时 间 跟 最 佳 记 录 的 显 示 本 游 戏 就 介 绍 到 这 里, 更 多 细 节 请 看 游 戏 源 码