2011 年 11 月 14 日
DESCRIPTION
2011 年 11 月 14 日. metagun. 1. 打游戏没有? 2. 项目结构: metagun metagun-android 或 游戏名 游戏名 -android 游戏名 -desktop. package com.badlogic.metagun; 入口,准备 package com.mojang.metagun.entity; 实体 package com.mojang.metagun.level; 关卡 package com.mojang.metagun.screen; 显示. 入口:. - PowerPoint PPT PresentationTRANSCRIPT
2011年 11月 14日
metagun
• 1.打游戏没有?• 2. 项目结构:
– metagun – metagun-android
• 或–游戏名–游戏名 -android–游戏名 -desktop
• package com.badlogic.metagun;–入口,准备
• package com.mojang.metagun.entity;–实体
• package com.mojang.metagun.level;–关卡
• package com.mojang.metagun.screen;–显示
入口:• public void create () {};• public void render () {};
准备• 图片素材 Art.java
• 声音 Sound.java
• 交互 Input.java
• 统计 Stats.java
Metagun.java的 render ()
• 行为:隔一会儿进来一次• 测试: System.out.println("screen.render
()");
• 参考解释:– 代码中的注释– 笔记:应用程序的 render()
不要:捡了芝麻丢了西瓜
• TitleScreen会牵连出 ExpositionScreen,一个是游戏开始画面、另一个是说明画面 ;我们先跳过,我们切入核心画面—— GameScreen。
GameScreen
• 核心 Tick() -overrides 说明父类有• 核心 Render() –implements 说明父类有,但抽象了
GameScreen的 Tick()
主要做的 3件事:1.若按下 ESCAPE,则交给 PauseScreen
2.若有 player,则 player.tick(),否则,看是否要重生 player.
3.关卡的 tick()
启发:显示屏幕的跳转,在 tick()里写
2、 3点:一个玩家、一个当前关卡GameScreen持有 Level, Level持有 Player
GameScreen的 Render()
• spriteBatch.begin();– 1.绘背景– 2.关卡地图绘制– 3.如重生,绘制提示 "PRESS X TO TRY AGAIN“
• spriteBatch.end();
• 启示:显示信息,用“状态变量”,直接在 Render()里显示;若交互,必须 tick()处理
Player.java
• Screen的核心是 GameScreen
• Entity的核心是 Player
• Player有什么
GameScreen、 Player、 Level的关系
• GameScreen产生 Level view
• Level知道是谁产生了自己 control
• Level产生了 Player,及其它实体 model
Level.java
• 关卡总共解决 4个问题:• 1.构造函数,墙材质、 Player和其它实体• 2.tick()
• 3.render()
• 4.遮罩
Level的构造函数:• 一个关卡中,屏幕显示出的所有东西,包括三类:
1.墙 ;2实体 ;3出生点• 在关卡的地图中用不同的颜色表明,通过颜色,在屏幕上显示相应屏幕的东西。
• 玩家角色,属于实体,但不用颜色来决定生成,而是用出生点决定生成位置
• 墙的种类有 9种:用字节数组 walls来保存 ,该数组大小 32*24
• 实体的种类有种 9种:用 ArrayList数组 entityMap来保存 ,该数组大小 32*24,同时用 entities保存
墙的种类:• //白色:普通墙• //wall = 1;• //粉红:能被枪子推动的箱子• //wall = 2;• //黄色:炸药箱• //wall = 3;• //红色:钉子地• //wall = 4;• //浅灰色:透明墙,敌人的子弹可以穿透射你,你的子弹却穿不透,打不到敌人!• //wall = 5;• //一种红色:向右滚动地面• //wall = 6;• //一种红色:向左滚动地面• //wall = 7;• //深灰色:过关门• //wall = 8;• //淡蓝绿色:最后一关,绿色方块• //wall = 9;
实体的总类:• 1个怪头 Boss (其父类为 BossPart)
• 10个绿球 BossNeck (其父类为 BossPart)
• 绿怪 Gremlin• 绿怪 Gremlin(与前个不同)• 架子怪 Jabberwocky• 帽子 Hat• 提示牌 Sign,包括一二级枪• 红色手枪人 Gunner• Player
构造函数做了 3件事• 根据 level.png里的颜色来,来设定用不同的“墙”,一共 9种材质;同时,来决定生成哪种实体。
• 32*24的每个像素点逐行,逐列“看颜色”,每个像素点对应 walls的一个元素,也对应一个 entityMap的一个元素(某个像素点对应有哪种墙材质和有几个实体)
墙 -walls实体 -entities,entityMap
• 实体的保存使用了 2个东西:• 一个 ArrayList类型的 entities
• 另一个 ArrayList数组类型的 entityMap
– entities保存该关卡所有实体,用来绘制– entityMap,保存某个像素格有几个实体,用来配合实现“遮罩”
Level的 tick()
• Removed 是实体的存在与消亡的标志• 考察 Player和其它实体
Level的 render()
• 给 walls的每个元素的值( 9种可能),指定某种材质,就是用 walls.png上哪个位置的图
• 根据保存该关卡所有实体的 entities,让每个实体自绘
Level的“遮罩”• isFree(), isBulletFree(), getEntities()
• 判断 Player的下一移动位置是否“受限制”
• entityMap用来存储某个像素格有几个实体
类的状态和行为• 现实世界中的对象都具有两个特征:它们都有各自的状态,它们都有各自的行为。比如,人有状态(名字,肤色,国籍,性别等)和行为(走、看)。
• 软件中的对象以现实生活中的对象为原型,它们也有状态和行为。把这些对象抽象成一类,这个类就代表了所有拥有这些属性的人的集合。软件对象就用类的成员变量来维护这些对象的状态,用类的成员函数来实现这些对象的行为。
主角现实世界中:玩家的化身 软件中的对象: Player
状态 属性、成员变量存在与不在 removed
帽子有几顶 hatCount
主角现实世界中:玩家的化身 软件中的对象: Player
动作、行为、功能 方法、成员函数撞到钉子上 hitSpikes
挂掉 die
被击中 shot
被炸药炸到 explode
和怪物碰到一起 collideMonster
读提示 readSign
超出边界 outOfBounds
主角• hitSpikes撞到钉子上就 die
主角• die挂掉:
–若状态 removed为真,则 return–有帽子的话,帽子留给关卡–播放死亡声音–关卡中增加 16个 PlayerGore–统计–状态 removed置为真
连锁反应• 看最后一句的:状态 removed置为真,• Level和 GameScreen的反映
关卡的 tick()
• 对于关卡• 若 player.removed为真,则 20次 tick后,
screen.mayRespawn置为 ture
• 20次,是延缓效果
GameScreen的 Render
• 若 GameScreen的mayRespawn为真,则显示 PRESS X TO TRY AGAIN
• 若 player.removed为真 ,则 entities.remove(i--);
• 则在 Level的 render时, entities里的元素自绘,此时 player已经给删掉了
• 有帽子的话,帽子留给关卡• 关卡的 entities里多了一个 Hat对象• 并在 entityMap的某个元素中多了一个 Hat对象
• 在关卡 render()时, Hat调用自己的 render()
• 关卡中增加 16个 PlayerGore
• 关卡的 entities里多了 16个 PlayerGore对象
• 并在 entityMap的某个元素中多了 16个 PlayerGore对象
• 在关卡 render()时, PlayerGore调用自己的 render()
提问• 帽子怎么飘飘悠悠的下降?
– 结合 tick()• xa = xxa + Math.sin(time * 0.05) * 0.2;• xxa *= 0.95;• ya *= 0.95;• ya += Level.GRAVITY * 0.1;
– Render()
– 还得看看
数学• 碰到左边和碰到右边• if (xa < 0) {• double xx = x / 10;• xa = -(xx - ((int)xx)) * 10;• } else {• double xx = (x + w) / 10;• xa = 10 - (xx - ((int)xx)) * 10;• }• if (level.isFree(this, x + xa, y, w, h, xa, 0)) {• x += xa;• }• this.xa *= -bounce;
• 地钉,上显示,下显示