비주얼노벨 강좌

lua의 파일을 데이터 구조로 사용하기 위해서 table을 사용할려고 했다.

 

책을 제대로 보지 못하고 했는지 모르지만.. ^^ 암튼 처음 할려니 어렵다.

그래서 아래와 같이 설정해봤다.

 

resid = {} --테이블을 설정

 

//방법1

resid[1].id = 10

 

//방법2

resid.id = 10

 

//방법3

function ResIDInit()
 --배열을 초기화 할려면 여기서 for문을 돌려야 한다. 
 for indx = 1, ResIDCount do
  resid[indx] = {}
 end
end

 

-----------------------------------------------

결과

> 방법1

   - 이 부분은 에러가 난다. print()를 해도 값이 없다고 나온다.

> 방법2

   - 이 부분은 에러가 나지 않는다. 정상 동작 한다. 하지만 resid는 배열이 아니라

     단순한 구조체 방법을 취하고 있다. 그래서 resid[1].id 이런건 되지 않는다.

> 방법3

   - 이 부분이 정답이다. table을 만들고 그 테이블이 배열구조를 가지게 할려면

     초기화를 해줘야 한다.

 

------------------------------------------------

참조할 코드

--=======================================
-- function:  EnemyInit()
-- author:    Nick Carlson
-- created:   February 11, 2005
-- returns:   nothing (process)
-- descrip:   sets up initial enemies
--=======================================
function EnemyInit()
    enemyCount = 5 --Number of enemies in the game
    myEnemies = {} --Creates myEnemies table

    --Creates table, one entry per potential enemy
    for indx = 1,enemyCount do
        --Creates a table to hold the data for each enemy
        myEnemies[indx] = {}
        --Now initialize the enemy
        EnemyRespawn(indx)
    end
end


--=======================================
-- function:  EnemyRespawn(indx)
-- author:    Nick Carlson
-- created:   February 11, 2005
-- returns:   nothing (process)
-- descrip:   fills in enemy data given an index to the myEnemies table
--=======================================
function EnemyRespawn(indx)
--Fills/refills myEnemies table according to indx
--indx is the myEnemies table index assigned to the enemy

    --Initial values
    myEnemies[indx].XTHRUST = 0 --Thrust along the x-axis (#)
    myEnemies[indx].YTHRUST = 0 --Thrust along the y-axis (#)
    myEnemies[indx].ROT = math.random(1,8) --Rotation of enemy ship (#)
    myEnemies[indx].ID = GUI_RUNTIME_SPRITES + indx + 100 --Starts GUI identification at 101 (#)
    myEnemies[indx].E_TOW = "no" --Towing flag (target ID # or "no")
    myEnemies[indx].FIRE = 0 --Projectile firing time interval (#)

    --Randomly selects side of screen to enter from
    entrySide = math.random(1,4)
    if entrySide == 1 then       --Left
        myEnemies[indx].EX = math.random(-40,-20) --X coordinate (#)
        myEnemies[indx].EY = math.random(-40,620) --Y coordinate (#)
    elseif entrySide == 2 then   --Right
        myEnemies[indx].EX = math.random(800,820) --X coordinate (#)
        myEnemies[indx].EY = math.random(-40,620) --Y coordinate (#)
    elseif entrySide == 3 then   --Top
        myEnemies[indx].EX = math.random(-40,820) --X coordinate (#)
        myEnemies[indx].EY = math.random(-40,-20) --Y coordinate (#)
    else                        --Bottom
        myEnemies[indx].EX = math.random(-40,820) --X coordinate (#)
        myEnemies[indx].EY = math.random(600,620) --Y coordinate (#)
    end

    --Determines enemy's thrust, reaction, and firing abilities based on time
    --Reaction time decreases as REACT decreases (must be at least 1)
    --Maximum thrust increases as MAX increases
    --enemyFireInterval (#) compared to FIRE to determine enemy shooting (see EnemyFacing(indx) function)
    if (timeCounter >= 0) and (timeCounter < 100) then
        myEnemies[indx].REACT = 5 --Reaction time interval (#)
        myEnemies[indx].MAX = 5 --Maximum thrust (#)
        enemyFireInterval = 9
    elseif (timeCounter >= 100) and (timeCounter < 200) then
        myEnemies[indx].REACT = 4 --Reaction time interval (#)
        myEnemies[indx].MAX = 6 --Maximum thrust (#)
        enemyFireInterval = 8
    elseif (timeCounter >= 200) and (timeCounter < 300) then
        myEnemies[indx].REACT = 3 --Reaction time interval (#)
        myEnemies[indx].MAX = 7 --Maximum thrust (#)
        enemyFireInterval = 7
    elseif (timeCounter >= 300) and (timeCounter < 400) then
        myEnemies[indx].REACT = 2 --Reaction time interval (#)
        myEnemies[indx].MAX = 8 --Maximum thrust (#)
        enemyFireInterval = 6
    elseif (timeCounter >= 400) then
        myEnemies[indx].REACT = 1 --Reaction time interval (#)
        myEnemies[indx].MAX = 9 --Maximum thrust (#)
        enemyFireInterval = 5
    end

    --Randomly selects the AI type and diplays the proper ship image
    myEnemies[indx].TYPE = math.random(1,4) --AI type (1,2,3, or 4)
    if myEnemies[indx].TYPE == 1 then
        CreateItem(myEnemies[indx].ID, "Sprite", "e1_ship1.bmp")
    elseif myEnemies[indx].TYPE == 2 then
        CreateItem(myEnemies[indx].ID, "Sprite", "e2_ship1.bmp")
    elseif myEnemies[indx].TYPE == 3 then
        myEnemies[indx].MAX = 10
        CreateItem(myEnemies[indx].ID, "Sprite", "e3_ship1.bmp")
    elseif myEnemies[indx].TYPE == 4 then
        CreateItem(myEnemies[indx].ID, "Sprite", "e4_ship1.bmp")
    end
    SetItemPosition(myEnemies[indx].ID, myEnemies[indx].EX, myEnemies[indx].EY, 20, 20)
end

Comment '3'