CodeCombat 物理实验室

Event: "collide" (碰撞检测)

LEVEL 17

狂战士 (Berserker)

变身巨人的逻辑

想一想《超级马里奥》,当他吃了蘑菇会发生什么?变大!变大后就能撞碎砖块。 这一关我们就要实现这个机制。

状态变化 (Collect)

吃到蘑菇 -> unit.scale = 2 (体型变大两倍)。
同时设置一个倒计时,时间到了变回原形。

碰撞检测 (Collide)

当英雄碰到东西时:
1. 对方是墙(Fence)吗?
2. 我现在是巨人(scale == 2)吗?
如果两个条件都满足,那就把墙撞碎(destroy)!

Bang! (Ouch)
CRUSH!
hulk_smash.py
1
# 蘑菇允许player在一段时间内摧毁围栏。
2
player = game.spawnPlayerXY('captain', 12, 34)
3
player.maxSpeed = 15
4
game.addMoveGoalXY(76, 34)
目标:移动到终点
5
ui.track(game, "time")
6
7
game.powerDuration = 3
变身持续3秒
8
game.powerEndTime = 0
9
# "mushroom"(蘑菇)是没有默认效果的可收集物品。
10
game.spawnXY("mushroom", 12, 52)
生成一堆蘑菇...
11
game.spawnXY("mushroom", 12, 16)
12
game.spawnXY("mushroom", 36, 16)
13
game.spawnXY("mushroom", 36, 52)
14
game.spawnXY("mushroom", 56, 12)
15
game.spawnXY("mushroom", 56, 56)
16
game.spawnXY("mushroom", 56, 34)
17
18
def onCollect(event):
19
unit = event.target
20
item = event.other
21
if item.type == "mushroom":
22
# "scale" 改变单位的视觉尺寸。
23
unit.scale = 2
变大两倍!
24
game.powerEndTime = game.time + game.powerDuration
设置变身结束时间
25
unit.say("ARRRGH!!!")
26
27
def onCollide(event):
碰撞处理器
28
# 与某物发生碰撞的事件所有者。
29
unit = event.target
我(英雄)
30
# 单位碰撞的对象。
31
collidedObject = event.other
我撞到了谁?
32
# 如果它是围栏。
33
if collidedObject.type == "fence":
34
if unit.scale == 2:
只有变大时才能撞
35
# collidedObject对象调用摧毁(`destroy` )方法
36
collidedObject.destroy()
粉碎围栏!
37
38
player.on("collide", onCollide)
绑定碰撞事件
39
player.on("collect", onCollect)
绑定收集事件
40
41
def checkTimers():
42
if game.time > game.powerEndTime:
时间到了吗?
43
if player.scale == 2:
44
# 将玩家角色的尺寸设置为1。
45
player.scale = 1
变回小个子
46
47
while True:
48
checkTimers()
LEVEL 18

冻结标签 (Frozen Tag)

冰冻人游戏规则

这是一个经典的捉迷藏游戏!你是“鬼”,弓箭手是“人”。
我们用 behavior 属性来标记它们的状态。

奔跑状态 (Scampers)

弓箭手到处乱跑。如果这时被你(Player)碰到 -> 变成冰冻状态
behavior = "Defends" (站着不动)

冰冻状态 (Defends)

弓箭手站着不动。如果这时被其他弓箭手(Archer)碰到 -> 解冻!
behavior = "Scampers" (又开始跑了)

Frozen Count: 0

Scampers

Defends

tag_game.py
1
# 让我们制作一个冻结标签的游戏!
2
game.tagged = 0
初始化被冻结的人数
3
ui.track(game, "tagged")
4
goal = game.addManualGoal("标记所有弓箭手。")
5
6
game.spawnXY("archer", 12, 52)
生成弓箭手们
7
game.spawnXY("archer", 12, 16)
8
game.spawnXY("archer", 24, 52)
9
game.spawnXY("archer", 24, 16)
10
11
player = game.spawnPlayerXY('captain', 68, 24)
12
player.maxSpeed = 20
13
# 让player变大一些,这样标记弓箭手就更容易了。
14
player.scale = 2
15
16
def onSpawn(event):
17
unit = event.target
18
unit.behavior = "Scampers"
初始状态:乱跑
19
unit.maxSpeed = 8
20
game.setActionFor("archer", "spawn", onSpawn)
21
22
def onCollide(event):
碰撞逻辑
23
unit = event.target
弓箭手
24
other = event.other
撞到的对象
25
# "Scampers"意味着弓箭手尚未被标记。
26
if unit.behavior == "Scampers":
如果是乱跑状态
27
if other == player:
被玩家抓住了
28
other.say("Freeze!")
29
# 将unit.behavior设置为"Defends":
30
unit.behavior = "Defends"
冻结!
31
# 将game.tagged增加1:
32
game.tagged += 1
冻结数 +1
33
if unit.behavior == "Defends":
如果是冻结状态
34
# 如果other的类型是"archer":
35
if other.type == "archer":
被队友碰到了
36
# 将unit.behavior设置为"Scampers":
37
unit.behavior = "Scampers"
解冻!
38
# 将game.tagged减少1。
39
game.tagged -= 1
冻结数 -1
40
41
game.setActionFor("archer", "collide", onCollide)
绑定碰撞事件
42
43
while True:
44
if game.tagged >= 4:
如果4个都被冻住
45
game.setGoalState(goal, True)
胜利!