对于所有单位类型使用相同的 SOP!
简介
事件处理程序获取有关触发它们的事件的信息:
event.target 属性包含执行事件处理程序的单位。
# 使用event.target,所有单位都可以使用相同的事件处理函数
def sayHello(event):
unit = event.target
unit.say("Hi!")
game.setActionFor("soldier", "spawn", sayHello)
默认代码
# 事件具有诸如event.target之类的属性
# 这使您可以为许多不同的单位使用相同的事件处理程序。
game.addDefeatGoal()
soldier1 = game.spawnXY("soldier", 50, 30)
soldier2 = game.spawnXY("soldier", 50, 35)
soldier3 = game.spawnXY("soldier", 50, 40)
munchkin1 = game.spawnXY("munchkin", 25, 30)
munchkin2 = game.spawnXY("munchkin", 25, 35)
munchkin3 = game.spawnXY("munchkin", 25, 40)
# 这个函数让兽人1攻击它的敌人。
# 使用event.target使这个函数适用于所有单位!
def fightEnemies(event):
while True:
# 创建一个单位变量,并将事件对象分配给它
# 现在将下面的行改为使用单元而不是兽人 1。
enemy = munchkin1.findNearestEnemy() # ∆
if enemy:
munchkin1.attack(enemy) # ∆
# 使用game.setActionFor() 将事件处理程序分配给许多单位。
game.setActionFor("munchkin", "spawn", fightEnemies)
game.setActionFor("soldier", "spawn", fightEnemies)
概览
在之前的关卡中,你做过这样的事情:
soldier1 = spawnXY("soldier", 10, 10)
def fightEnemies(event):
while True:
enemy = soldier1.findNearestEnemy()
if enemy:
soldier1.attack(enemy)
但是当我们增加更多的士兵会发生什么?
soldier1 = spawnXY("soldier", 10, 10)
soldier2 = spawnXY("soldier", 12, 10)
soldier3 = spawnXY("soldier", 15, 10)
因为 soldier1 被硬编码到 fightEnemies() 函数中,所以 soldier2 或 soldier3 不起作用!
相反,我们应该使用 event.target 来知道哪个士兵正在执行事件处理函数:
def fightEnemies(event):
while True:
unit = event.target
enemy = unit.findNearestEnemy()
if enemy:
unit.attack(enemy)
现在它适用于所有的士兵,以及任何其他类型的单位,如弓箭手或兽人!
标准操作规程 解法
# 事件具有诸如event.target之类的属性
# 这使您可以为许多不同的单位使用相同的事件处理程序。
game.addDefeatGoal()
soldier1 = game.spawnXY("soldier", 50, 30)
soldier2 = game.spawnXY("soldier", 50, 35)
soldier3 = game.spawnXY("soldier", 50, 40)
munchkin1 = game.spawnXY("munchkin", 25, 30)
munchkin2 = game.spawnXY("munchkin", 25, 35)
munchkin3 = game.spawnXY("munchkin", 25, 40)
# 这个函数让兽人1攻击它的敌人。
# 使用event.target使这个函数适用于所有单位!
def fightEnemies(event):
while True:
# 创建一个单位变量,并将事件对象分配给它
unit = event.target
# 现在将下面的行改为使用单元而不是兽人 1。
enemy = unit.findNearestEnemy() # ∆
if enemy:
unit.attack(enemy) # ∆
# 使用game.setActionFor() 将事件处理程序分配给许多单位。
game.setActionFor("munchkin", "spawn", fightEnemies)
game.setActionFor("soldier", "spawn", fightEnemies)
本攻略发于极客战记官方教学栏目,原文地址为: