「网易官方」极客战记(codecombat)攻略-游戏开发2-标准操作规程-standard-operating-procedure

对于所有单位类型使用相同的 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)
 
 
原文地址:https://www.cnblogs.com/codecombat/p/12736257.html