如果在编写上述功能时,对范围内的单位造成伤害,显示的漂浮数字只会在一个单位的位置显示这个范围内所有单位受到伤害的总和,而要想实现在这个区域的每个单位的位置都显示其所受的伤害值该怎样修改
时间: 2023-02-11 16:09:20 浏览: 52
如果要在这个区域的每个单位的位置都显示其所受的伤害值,应该在计算伤害时为每个单位分别计算伤害值,并在每个单位的位置显示其所受的伤害值。在显示伤害数字时,需要遍历这个区域内的所有单位,并在每个单位的位置显示其所受的伤害值。
相关问题
利用jass语言编写当多个单位同时受到一个单位的攻击时,把在0.1秒之内对相应单位造成的伤害值之和利用漂浮文字在相应单位的位置显示出来
### 回答1:
使用 Jass 语言,可以在单位受到攻击时使用函数 "TimerStart" 开始计时,并在计时结束后使用函数 "CreateFloatText" 在单位位置显示伤害值之和。具体实现方法如下:
1. 在单位受到攻击时,使用 "TimerStart" 函数开始计时。
2. 使用 "Event" 函数监听计时器结束事件。
3. 在计时器结束事件中,使用 "CreateFloatText" 函数在单位位置显示伤害值之和。
示例代码如下:
```
// 计时器结束事件
function MyTimerEnd takes nothing returns nothing
local unit u = GetExpiredTimer()
local real damage = GetUnitState(u, UNIT_STATE_LIFE)
local string text = R2S(damage)
CreateFloatText(text, u, 0.0, 0.0)
endfunction
// 单位受到攻击事件
function MyUnitTakeDamage takes unit attacker, unit target, real damage returns nothing
TimerStart(0.1, false, function MyTimerEnd)
endfunction
```
上面的代码展示了如何在单位受到攻击时开始计时,并在计时结束后显示伤害值之和。
### 回答2:
利用JASS语言编写当多个单位同时受到一个单位的攻击时,可以通过以下方式将在0.1秒内对相应单位造成的伤害值之和利用漂浮文字显示出来。
首先,需要定义一个全局变量来存储总伤害值。我们可以称之为totalDamage。
接下来,在攻击单位的攻击伤害函数中,将对受攻击单位造成的伤害值累加到totalDamage变量中。可以通过如下代码实现:
function onAttackDamageTakes(unit attacker, unit target, real damage)
set totalDamage = totalDamage + damage
endfunction
然后,在游戏进行的每一帧中,检查是否有单位受到攻击。可以通过使用Trigger来实现:
local trigger t
function checkDamageTakenActions()
local unit target = GetTriggerUnit()
local real damage = GetEventDamage()
if IsUnitAlly(target, GetOwningPlayer(attacker)) and damage > 0 then
set totalDamage = totalDamage + damage
end
endfunction
set t = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_DAMAGED)
call TriggerAddAction(t, checkDamageTakenActions)
最后,在单位的位置显示伤害值的函数中,我们可以使用漂浮文字效果来显示totalDamage。可以通过如下代码实现:
function displayDamageTaken(unit target)
local string s = I2S(R2I(totalDamage)) + "伤害"
local real x = GetUnitX(target)
local real y = GetUnitY(target)
call DisplayTextToPlayer(GetOwningPlayer(target), x, y, s)
endfunction
在需要显示伤害值的地方,调用displayDamageTaken函数,并传入对应的受攻击单位作为参数即可。
通过以上代码,可以实现在单位受到攻击时,将0.1秒内对相应单位造成的伤害值之和利用漂浮文字显示在相应单位的位置上。
### 回答3:
在JASS语言中,可以使用触发器和浮动文字效果来实现当多个单位同时受到一个单位的攻击时,将0.1秒内对相应单位造成的伤害值之和显示在相应单位位置上。
首先,我们可以创建一个触发器,用于监听当受到攻击的单位受到伤害时的事件。触发器可以使用`EVENT_PLAYER_UNIT_DAMAGED`事件来监听受到攻击的单位,并且使用`TriggerRegisterAnyUnitEventBJ`函数将该事件与触发器绑定。
接着,在触发器中,我们可以创建一个循环,遍历所有受到伤害的单位,将每个单位在0.1秒内受到的伤害值累加起来。这里可以使用函数`GetEventDamage()`来获得受到伤害的数量,再使用全局变量或自定义数组来累加伤害值。
最后,我们可以使用浮动文字效果`SetTextTagText`和`SetTextTagPos`来在相应单位的位置显示伤害值之和。可以使用`SetTextTagSuspended`函数来设置浮动文字在0.1秒后自动消失,以实现按照时间显示。
总结起来,我们需要创建触发器来监听受到攻击的单位受到伤害的事件,然后在触发器中循环计算0.1秒内对相应单位的伤害之和,并使用浮动文字效果在相应单位的位置显示出伤害值。
示例代码如下:
```
local real damageSum
function ShowDamageSum()
local unit damagedUnit = GetTriggerUnit()
local real damage = GetEventDamage()
damageSum = damageSum + damage
local integer playerId = GetPlayerId(GetOwningPlayer(damagedUnit))
-- 在damagedUnit的位置上显示浮动文字
local textTag tt = CreateTextTag()
SetTextTagPos(tt, GetUnitX(damagedUnit), GetUnitY(damagedUnit), 0)
SetTextTagText(tt, R2S(damageSum))
SetTextTagColor(tt, 255, 0, 0, 255)
SetTextTagPermanent(tt, false)
SetTextTagLifespan(tt, 0.1)
SetTextTagVelocity(tt, 0, 0.03)
SetTextTagVisibility(tt, true)
end
function InitTriggers()
local trigger t = CreateTrigger()
TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_DAMAGED)
TriggerAddAction(t, ShowDamageSum)
end
function InitGlobals()
-- 初始化伤害值之和变量
damageSum = 0
end
function main()
InitGlobals()
InitTriggers()
end
```
这只是一个简单的示例代码,你可以根据具体需求进行修改和完善。希望对你有所帮助!
我在上个问题中编写的jass代码实现的功能是利用漂浮文字显示敌人在0.01秒内受到法术伤害之和,但是这段代码有问题,它在多个敌人同时受到来自一个单位的伤害时,只会在一个单位身上显示漂浮文字,怎样才能实现会在每一个单位身上都会显示漂浮文字呢
### 回答1:
这段代码的问题在于它只在一个单位身上显示了漂浮文字,而没有在其他单位身上显示。为了实现每一个单位身上都会显示漂浮文字,可以在对单位造成伤害时对每一个单位都进行漂浮文字的显示。可以通过使用循环语句,在循环中对每一个单位都进行显示漂浮文字的操作。
### 回答2:
要实现在每一个单位身上都显示漂浮文字,可以对每个敌人的受伤事件进行分别处理。可以通过在代码中使用循环来遍历每个敌人,并对每个敌人的受伤事件进行处理。
具体做法是,在受伤事件触发时,遍历存储敌人的数组,对每个敌人检查是否受到伤害。如果敌人受到伤害,则在其位置显示漂浮文字。
示例代码如下:
```
// 假设敌人保存在数组enemies中
// 假设敌人的伤害保存在数组damage中,长度与enemies相同
constant integer MAX_ENEMIES = 10
integer enemyDamage[MAX_ENEMIES]
function DamageHandler takes nothing returns nothing
local unit damagedUnit
local integer i
// 遍历敌人数组
loop
set i = 0
exitwhen i > MAX_ENEMIES
set damagedUnit = enemies[i]
// 判断该敌人是否受到伤害
if damagedUnit is damaged then
// 在该敌人位置显示漂浮文字
call DisplayFloatingText(damagedUnit, enemyDamage[i])
// 可以在这里进行其他处理,如播放音效等
// 重置敌人的受伤状态
set damagedUnit.isDamaged = false
endif
set i = i + 1
endloop
endfunction
```
以上代码通过遍历敌人数组,对每个敌人进行处理。在受到伤害的敌人位置显示漂浮文字,并重置其受伤状态。这样就可以实现在每一个单位身上都会显示漂浮文字的效果。
### 回答3:
要实现在每一个单位身上都显示漂浮文字,可以通过修改代码中的部分逻辑来实现。下面是一种可能的修改方式:
1. 首先,需要对每个单位创建一个独立的漂浮文字对象。在代码中,可以使用一个数组来存储这些漂浮文字对象。
2. 在计算法术伤害的代码部分,需要对每个受到伤害的单位都执行以下步骤:
- 判断该单位是否已经存在漂浮文字对象。
- 如果该单位已经存在漂浮文字对象,则更新漂浮文字对象上的数字。
- 如果该单位不存在漂浮文字对象,则创建一个新的漂浮文字对象,并将其添加到漂浮文字对象数组中。
- 在漂浮文字对象上设置显示位置和显示时间等参数。
3. 最后,在代码的某一个合适的时机(例如每一帧的结束)遍历漂浮文字对象数组,并根据对象的显示时间来判断是否需要移除该漂浮文字对象。如果一个漂浮文字对象的显示时间已经结束,则需要将其从数组中移除,并释放相应的内存。
通过以上修改,即可实现在每一个单位身上都会显示漂浮文字的效果。记得要注意代码的性能和内存的使用,尤其是在有大量单位同时受到伤害的情况下。可以合理调整代码中的参数和逻辑,以满足实际需求。