1

私はプログラミングに非常に慣れておらず、SC2 のようなゲームで「カスタム マップ」のバックグラウンドを持っています。現在、Love2d でプラットフォーマー ゲームを作ろうとしています。しかし、次のことを行う前に何かを X 秒待機させるにはどうすればよいのでしょうか。

主人公を5秒間不死にしたいのですが、そのコードはどのようになりますか?

Immortal = true 
????????????????
Immortal = false

私が理解しているように、LuaにもLove2dにも組み込みの待機はありません。

4

4 に答える 4

10

ゲーム エンティティの 1 つの一時的な状態に関心があるようですね。これはよくあることです。パワーアップが 6 秒間続く、敵が 2 秒間気絶する、ジャンプ中のキャラクターの見た目が異なる、などです。一時的な状態は待機状態とは異なります。待っているということは、あなたの5秒間の不死の間に他に何も起こらないことを示唆しています. ゲームを通常どおり続行したいようですが、不滅の主人公が 5 秒間います。

一時的な状態を表すには、ブール値ではなく「残り時間」変数を使用することを検討してください。例えば:

local protagonist = {
    -- This is the amount of immortality remaining, in seconds
    immortalityRemaining = 0,
    health = 100
}

-- Then, imagine grabbing an immortality powerup somewhere in the game.
-- Simply set immortalityRemaining to the desired length of immortality.
function protagonistGrabbedImmortalityPowerup()
    protagonist.immortalityRemaining = 5
end

-- You then shave off a little bit of the remaining time during each love.update
-- Remember, dt is the time passed since the last update.
function love.update(dt)
    protagonist.immortalityRemaining = protagonist.immortalityRemaining - dt
end

-- When resolving damage to your protagonist, consider immortalityRemaining
function applyDamageToProtagonist(damage)
    if protagonist.immortalityRemaining <= 0 then
        protagonist.health = protagonist.health - damage
    end
end

waittimerなどの概念には注意してください。通常、スレッドの管理を指します。多くの可動部分があるゲームでは、多くの場合、スレッドを使用せずに物事を管理する方が簡単で予測可能です。可能であれば、スレッド間で作業を同期するのではなく、ゲームを巨大なステート マシンのように扱います。スレッドが絶対に必要な場合、Löve はlove.threadモジュールでそれらを提供します。

于 2013-03-19T14:57:58.650 に答える
2

私は通常、あなたが話していることに cron.lua を使用します: https://github.com/kikito/cron.lua

Immortal = true
immortalTimer = cron.after(5, function() 
  Immortal = false 
end)

そしてimmortalTimer:update(dt)、あなたのlove.updateに固執してください。

于 2013-05-08T18:21:19.320 に答える
-1

あなたはこれを行うことができます:

function delay_s(delay)
  delay = delay or 1
  local time_to = os.time() + delay
  while os.time() < time_to do end
end

次に、次のことができます。

Immortal == true
delay_s(5)
Immortal == false

もちろん、独自のスレッドで実行しない限り、他のことはできません。しかし、残念ながら私は Love2d について何も知らないので、これは厳密には Lua です。

于 2013-03-19T07:28:45.187 に答える