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