1

現在、Roblox のPointLightオブジェクトのメソッドを作成しています。Brightness現在、私は PointLight のプロパティを増減するメソッドを作成していますが、必要な数式を取得しようとして壁にぶつかりました。

プログラムは、DarkenSpeed (2 秒) のスパンで Brightness (1) から FadedBrightness (.3) までループする必要があります。考えられる解決策をグーグルで調べてみましたが、探しているものが具体的すぎるのではないかと心配しています。

コード スニペットを次に示します。

local LightSource = {
  -- The value the PointLight's Brightness property will be when night and day,
  -- respectively.
  Brightness = 1,
  FadedBrightness = .3,

  -- How long (in seconds) it takes for the light source's brightness to be
  -- faded in/out.
  BrightenSpeed = 2,
  DarkenSpeed = 2
}

-- There is an IncreaseBrightness method, but that should be easy enough to
-- modify once the below is working.

function LightSource:DecreaseBrightness()
  -- self.Light refers to the PointLight instance.
  -- light.Brightness would be the current `Brightness` property.
  local light = self.Light

  -- Need to combine Brightness, FadedBrightness and DarkenSpeed into a formula
  -- for decrementing.

  local decrement = self.FadedBrightness / (self.Brightness * self.DarkenSpeed) -- 0.15, that won't work at all.

  while light.Brightness >= self.FadedBrightness do
    light.Brightness = light.Brightness - decrement
    wait()
  end
end

これを達成するためのより良い方法、または別の方法があれば、私はすべて耳にします。私は自分のコードでトンネル ビジョンを取得する傾向があり、現在の問題以外は何も考えていません。

4

2 に答える 2

1

Roblox doc によると、wait() は引数なしでおそらく 1/30 秒生成されます: http://wiki.roblox.com/index.php?title=Function_dump/Functions_specific_to_ROBLOX#Wait

os.clock() を使用して各ループの差を計算し、比例してスケーリングすることができます。テストされていないコードですが、アイデアを提供する必要があります:

function LightSource:DecreaseBrightness()
  -- self.Light refers to the PointLight instance.
  -- light.Brightness would be the current `Brightness` property.
  local light = self.Light

  -- Need to combine Brightness, FadedBrightness and DarkenSpeed into a formula
  -- for decrementing.
  local strtBright=light.Brightness
  local _,strtTime=wait()
  local finTime=strt+self.DarkenSpeed
  while light.Brightness >= self.FadedBrightness do
    local _,currTime=wait()
    light.Brightness = math.max( self.FadedBrightness, strtBright - (strtBright-self.FadedBrightness) * ((curr-strtTime)/(finTime-strtTime)) )
  end
end
于 2014-05-09T01:02:33.780 に答える
0

Odoth のサンプル コードから に切り替え、コーディング スタイルに合わせて変数名を変更し、読みやすいように式を 2 行にwait()分割しました。tick()

それはうまく機能しています。唯一の問題は、FadedBrightness で完全に停止しないことです (約 .298 まで行きます)。そのため、不正確さを相殺するためにメソッドの下部に行を含めました。

タイミングは完璧に機能し、結果には非常に満足しています。

完成した方法:

function LightSource:DecreaseBrightness()
  local light = self.Light
  local startBrightness = light.Brightness
  local startTime = tick()
  local endTime = startTime + self.DarkenSpeed

  while light.Brightness >= self.FadedBrightness do
    local currentTime = tick()
    local timer = (currentTime - startTime) / (endTime - startTime)
    local brightness = startBrightness - (startBrightness - self.FadedBrightness) * timer

    light.Brightness = brightness
    wait()
  end

  -- Set the brightness in case the loop spills over.
  light.Brightness = self.FadedBrightness
end
于 2014-05-09T23:33:44.413 に答える