2011 年 11 月 14 日

35
2011 年 11 年 14 年 metagun

Upload: eve-whitney

Post on 01-Jan-2016

57 views

Category:

Documents


9 download

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 Presentation

TRANSCRIPT

Page 1: 2011 年 11 月 14 日

2011年 11月 14日

metagun

Page 2: 2011 年 11 月 14 日

• 1.打游戏没有?• 2. 项目结构:

– metagun – metagun-android

• 或–游戏名–游戏名 -android–游戏名 -desktop

Page 3: 2011 年 11 月 14 日

• package com.badlogic.metagun;–入口,准备

• package com.mojang.metagun.entity;–实体

• package com.mojang.metagun.level;–关卡

• package com.mojang.metagun.screen;–显示

Page 4: 2011 年 11 月 14 日

入口:• public void create () {};• public void render () {};

Page 5: 2011 年 11 月 14 日

准备• 图片素材 Art.java

• 声音 Sound.java

• 交互 Input.java

• 统计 Stats.java

Page 6: 2011 年 11 月 14 日

Metagun.java的 render ()

• 行为:隔一会儿进来一次• 测试: System.out.println("screen.render

()");

• 参考解释:– 代码中的注释– 笔记:应用程序的 render()

Page 7: 2011 年 11 月 14 日

不要:捡了芝麻丢了西瓜 

• TitleScreen会牵连出 ExpositionScreen,一个是游戏开始画面、另一个是说明画面 ;我们先跳过,我们切入核心画面—— GameScreen。

Page 8: 2011 年 11 月 14 日

GameScreen

• 核心 Tick() -overrides 说明父类有• 核心 Render() –implements 说明父类有,但抽象了

Page 9: 2011 年 11 月 14 日

GameScreen的 Tick()

主要做的 3件事:1.若按下 ESCAPE,则交给 PauseScreen

2.若有 player,则 player.tick(),否则,看是否要重生 player.

3.关卡的 tick()

启发:显示屏幕的跳转,在 tick()里写

2、 3点:一个玩家、一个当前关卡GameScreen持有 Level, Level持有 Player

Page 10: 2011 年 11 月 14 日

GameScreen的 Render()

• spriteBatch.begin();– 1.绘背景– 2.关卡地图绘制– 3.如重生,绘制提示 "PRESS X TO TRY AGAIN“

• spriteBatch.end();

• 启示:显示信息,用“状态变量”,直接在 Render()里显示;若交互,必须 tick()处理

Page 11: 2011 年 11 月 14 日

Player.java

• Screen的核心是 GameScreen

• Entity的核心是 Player

• Player有什么

Page 12: 2011 年 11 月 14 日

GameScreen、 Player、 Level的关系

• GameScreen产生 Level view

• Level知道是谁产生了自己                 control

• Level产生了 Player,及其它实体        model

Page 13: 2011 年 11 月 14 日

Level.java

• 关卡总共解决 4个问题:• 1.构造函数,墙材质、 Player和其它实体• 2.tick()

• 3.render()

• 4.遮罩

Page 14: 2011 年 11 月 14 日

Level的构造函数:• 一个关卡中,屏幕显示出的所有东西,包括三类:

1.墙 ;2实体 ;3出生点• 在关卡的地图中用不同的颜色表明,通过颜色,在屏幕上显示相应屏幕的东西。

• 玩家角色,属于实体,但不用颜色来决定生成,而是用出生点决定生成位置

• 墙的种类有 9种:用字节数组 walls来保存 ,该数组大小 32*24

• 实体的种类有种 9种:用 ArrayList数组 entityMap来保存 ,该数组大小 32*24,同时用 entities保存

Page 15: 2011 年 11 月 14 日

墙的种类:• //白色:普通墙• //wall = 1;• //粉红:能被枪子推动的箱子• //wall = 2;• //黄色:炸药箱• //wall = 3;• //红色:钉子地• //wall = 4;• //浅灰色:透明墙,敌人的子弹可以穿透射你,你的子弹却穿不透,打不到敌人!• //wall = 5;• //一种红色:向右滚动地面• //wall = 6;• //一种红色:向左滚动地面• //wall = 7;• //深灰色:过关门• //wall = 8;• //淡蓝绿色:最后一关,绿色方块• //wall = 9;

Page 16: 2011 年 11 月 14 日

实体的总类:• 1个怪头  Boss (其父类为 BossPart)

• 10个绿球  BossNeck (其父类为 BossPart)

• 绿怪  Gremlin• 绿怪  Gremlin(与前个不同)• 架子怪  Jabberwocky• 帽子  Hat• 提示牌  Sign,包括一二级枪• 红色手枪人  Gunner• Player

Page 17: 2011 年 11 月 14 日

构造函数做了 3件事• 根据 level.png里的颜色来,来设定用不同的“墙”,一共 9种材质;同时,来决定生成哪种实体。

• 32*24的每个像素点逐行,逐列“看颜色”,每个像素点对应 walls的一个元素,也对应一个 entityMap的一个元素(某个像素点对应有哪种墙材质和有几个实体)

Page 18: 2011 年 11 月 14 日

墙 -walls实体 -entities,entityMap

• 实体的保存使用了 2个东西:• 一个 ArrayList类型的 entities

• 另一个 ArrayList数组类型的 entityMap

– entities保存该关卡所有实体,用来绘制– entityMap,保存某个像素格有几个实体,用来配合实现“遮罩”

Page 19: 2011 年 11 月 14 日

Level的 tick()

• Removed 是实体的存在与消亡的标志• 考察 Player和其它实体

Page 20: 2011 年 11 月 14 日

Level的 render()

• 给 walls的每个元素的值( 9种可能),指定某种材质,就是用 walls.png上哪个位置的图

• 根据保存该关卡所有实体的 entities,让每个实体自绘

Page 21: 2011 年 11 月 14 日

Level的“遮罩”• isFree(), isBulletFree(), getEntities()

• 判断 Player的下一移动位置是否“受限制”

• entityMap用来存储某个像素格有几个实体

Page 22: 2011 年 11 月 14 日

类的状态和行为• 现实世界中的对象都具有两个特征:它们都有各自的状态,它们都有各自的行为。比如,人有状态(名字,肤色,国籍,性别等)和行为(走、看)。

• 软件中的对象以现实生活中的对象为原型,它们也有状态和行为。把这些对象抽象成一类,这个类就代表了所有拥有这些属性的人的集合。软件对象就用类的成员变量来维护这些对象的状态,用类的成员函数来实现这些对象的行为。

Page 23: 2011 年 11 月 14 日

主角现实世界中:玩家的化身 软件中的对象: Player

状态 属性、成员变量存在与不在 removed

帽子有几顶 hatCount

Page 24: 2011 年 11 月 14 日

主角现实世界中:玩家的化身 软件中的对象: Player

动作、行为、功能 方法、成员函数撞到钉子上 hitSpikes

挂掉 die

被击中 shot

被炸药炸到 explode

和怪物碰到一起 collideMonster

读提示 readSign

超出边界 outOfBounds

Page 25: 2011 年 11 月 14 日

主角• hitSpikes撞到钉子上就 die

Page 26: 2011 年 11 月 14 日

主角• die挂掉:

–若状态 removed为真,则 return–有帽子的话,帽子留给关卡–播放死亡声音–关卡中增加 16个 PlayerGore–统计–状态 removed置为真

Page 27: 2011 年 11 月 14 日

连锁反应• 看最后一句的:状态 removed置为真,• Level和 GameScreen的反映

Page 28: 2011 年 11 月 14 日

关卡的 tick()

• 对于关卡• 若 player.removed为真,则 20次 tick后,

screen.mayRespawn置为 ture

• 20次,是延缓效果

Page 29: 2011 年 11 月 14 日

GameScreen的 Render

• 若 GameScreen的mayRespawn为真,则显示 PRESS X TO TRY AGAIN

Page 30: 2011 年 11 月 14 日

• 若 player.removed为真 ,则 entities.remove(i--);

• 则在 Level的 render时, entities里的元素自绘,此时 player已经给删掉了

Page 31: 2011 年 11 月 14 日

• 有帽子的话,帽子留给关卡• 关卡的 entities里多了一个 Hat对象• 并在 entityMap的某个元素中多了一个 Hat对象

• 在关卡 render()时, Hat调用自己的 render()

Page 32: 2011 年 11 月 14 日

• 关卡中增加 16个 PlayerGore

• 关卡的 entities里多了 16个 PlayerGore对象

• 并在 entityMap的某个元素中多了 16个 PlayerGore对象

• 在关卡 render()时,  PlayerGore调用自己的 render()

Page 33: 2011 年 11 月 14 日

提问• 帽子怎么飘飘悠悠的下降?

– 结合 tick()• xa = xxa + Math.sin(time * 0.05) * 0.2;• xxa *= 0.95;• ya *= 0.95;• ya += Level.GRAVITY * 0.1;

– Render()

– 还得看看

Page 34: 2011 年 11 月 14 日

数学• 碰到左边和碰到右边• 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;

Page 35: 2011 年 11 月 14 日

• 地钉,上显示,下显示