본문 바로가기
루아(LUA)/마이크로스튜디오

여러개의 똥이 내려온다 [마이크로 스튜디오#5]

by JK77 2022. 1. 21.

downPoop = {
  new = function(self,o)
    o = o or {}
    setmetatable(o,self)
    self.__index = self
    return o
  end,

}

init = function()
  yPos=0
  
  poop={}
  for i=1,10 do
    poop[i] = downPoop:new()
    poop[i].xPos = math.random()*screen.width/2
                  -math.random()*screen.width/2
    print(poop[i].xPos)
  end
  
  
end

update = function()
  yPos = yPos+math.random()*3
    
end

draw = function()
  screen:clear(-1)
 for i=1,#poop do
    screen:drawSprite("poop",poop[i].xPos,100-yPos,15,15)
 end
end

주의할 점: 루아에서 랜덤으로 숫자를 뽑아낼 때 함수에 넣어두고 호출하는 식으로 숫자를 추출하면 수초간 같은 숫자만 뽑아 낸다. 

randomNumber = {
  new = function(self,o)
  o = o or {}
  setmetatable(o, self)
  self.__index = self
  return o
  end,

  math.randomseed(os.time()),

  getNum = math.random()
}

for i = 1, 10 do
  x = randomNumber:new()
  print(x.getNum)
end

for i = 1, 10 do
  y = randomNumber:new()
  print(y.getNum)
end

위의 코드에서 출력된 20개의 랜덤 숫자는 모두 같으며, math.randomseed(os.time())을 사용해도 결과는 동일하다. 또한 위 코드와 다르게 랜덤 숫자를 리턴하는 함수를 작성하고 함수를 호출하면 한동안 - 내 느낌으로는 (1~2초) - 같은 숫자를 추출한다.

 

로블록스 개발자 커뮤니티에 질문을 올렸더니 금방 답을 해주신분이 계셨다.

 

getNum = math.random() 을 적기만 하면 고정된 한 값만 계속 사용하게 됩니다
작성하신 코드를 보시면 getNum이 랜덤화 한 숫자를 선언을 했지 랜덤화 시키는 로직이 없습니다.

이럴때는 함수로 따로 빼서 함수요청이 오면 랜덤화 시키는 방향으로 가면 됩니다.

 

이것은 수정한 코드.

randomNumber = {
  new = function(self,o)
  o = o or {}
  setmetatable(o, self)
  self.__index = self
  return o
  end,

  getNum = function()
    return math.random()
    end
}

x={}

for i = 1, 10 do
  x[i] = randomNumber:new()
  print(x[i].getNum())
end