"루아를 이용한 민첩하고 효과적인 게임 개발"  - 류광 역 -       서적을 통해 학습한 내용을 복습 및 지식공유를 위해 작성합니다.



루아는 포르투갈어로 

사용자 삽입 이미지
을 뜻한다.


스크립트에 대한 정의라던지 약관을 늘여놓은듯한 글은 생략한다...



1. 루아 콘솔 프로그램

 - 첨부파일에 루아 콘솔 프로그램이 있다.  (LuaConsole.exe)

 - 간단한 코드 및 한줄로 실험해 볼만한것이라면 콘솔을 이용하면 된다.



sample code1


  for indx=1,4 do print("line: ", indx) end


sample code2


  for indx=1,4 do

       print("line: ", indx)

   end



청크(chunk)란!? :  루아에서는 하나의 명령 또는 일련의 명령들(스크립트 파일 전체 등)을 칭함.



잘 모르겠지만.. 청크라는 용어를 앞으로 많이 쓰일 모양입니다.




2. 주석처리..

 -  c 에서는   //  ,   /*    */    두가지 방법을 사용하지요..

 - 루아에서는 --  ,   --[[   --]]   두가지 방법을 사용합니다.

    --[[     --]]  이녀석들... 마음에 안드는군요 -_-;                  --[[                 ]]--       이게 좀 더 그럴싸 했을텐데..




3. lua 파일을 만들어 실행해보자!!


helloworld.lua 파일 작성


-- disc : hello world

myString "Hello World"

print(myString)



※ 메모장으로 하면 안된다는 말을 얼핏 줏어들은것 같습니다.

    울트라에디터, vc, 에디터플러스 등으로 하면 될겁니다.





사용자 삽입 이미지
 
드디어 헬로우월드를 마스터 했군요 :)
 
 
 
 
 

4. 자료형

 - 루아는.. 플래시의 스크립트와 비슷하다.   정해놓고 쓰는 자료형이 없다.

    즉,   int iNum = 3 ;      이 아닌    iNum = 3   이라 하면 된다..

    그렇지만,    iNum = "삼이다"  이와같이 자료형 자체가 변할 수 있다..


 - nil,  bool,  문자열,  수치,   테이블      이와 같은 종류가 존재한다.


 - type()  함수를 통하여 그래도 정체를 좀 알 수 있다니.. 다행이군요..




5. nil   과  local

 - nil  과 local 이라는 특이한 녀석들이 있다..


 - nil : 일종의 null 이라 생각하면 간단할것 같다..  

          Value = nil     -- 변수를 삭제한다!?   삭제란 존재 자체가 지워지는가에 대해서는 잘 모르겠다..


 - local : 지역 변수를 선언할때 사용


          우선 루아는 기본적으로 모두 전역변수이다.

          전역변수로 사용하기 위해서는 local 을 사용해야 한다


sample code 1


function Sample()

    myDat_1                   -- 전역변수가 된다..

    local myDat_2           -- Sample 함수가 끝날때 소멸된다

end






sample code 2  ( 아래 for 문에 자세한 원리를 설명한다 )


function Sample(recvDat)        -- recvDat 는 자동으로 지역변수가 된다.  local 을 붙여줄 경우 오히려 에러를 낸다.

     for  local i = 1, 10 do           -- 오류   for 문에 쓰이는 변수는 자동으로 지역변수가 된답니다... 일관성이 조금 부족하군요

end




6. 테이블

 - ex)   myTable = { 1, 2, 3, 4, 5 }         myTable[1]  은  1입니다...   c 의 배열과는 종이 한장 차이군요

           myTable[6] = 6                       이와 같이 컨테이너의 가변 성향을 갖고 있군요


 - 테이블은 일종의 포인터이다.  진짜 정체를 가르키는 포인터라 생각하면 된다.

    그러므로 테이블간의 비교연산 등을 할 수 없다.


sample code)


tableA = [1, 2, 3]

tableB = [1, 2, 3]


if tableA == tableB then

      print( " 같다 " )

else

      print( " 틀리다 " )

eld


    결과는 '틀리다' tableA 와 tableB 가 갖는 포인터는 다르기 때문이다.



 - 배열을 사용하는 방식처럼 for 문 등을 돌려 비교해야 하는가 봅니다



7. 논리 연산자

 - 일반적으로 우린 && ||  두가지를 사용 하곤 하지요

 - 그 뜻 또한 잘 아시다시피 그리고 와 또는 입니다.

 - 책에서는 괜히 복잡하게 설명했다 생각되는군요..  바로 예제 들어갑니다.


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

sample code1


a = 5

b = 10

c = 20


if ( a < 10 ) and ( b < 20 ) then

   print ( "true" ) ;

else

   print ( "false" ) ;

end



위의 코드는 결과적으로 true 입니다.


c 코드로 표현을 해볼까요~


if ( a < 10  &&  b < 20 )

{

    // .....

}

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


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

sample code2


if ( a < 10 ) or ( b < 1 ) then

   print ( "true" ) ;

else

   print ( "false" ) ;

end



위의 코드에서  a < 10 는 참입니다.    그렇지만  b < 1  은 거짓입니다.  결과는 true 입니다.


우리가 알다시피 or 연산자로 인해  1    0       =    1    이 되는군요~



c 코드로 표현을 해볼까요~


if ( a < 10   ||   b < 1 )

{

    // .....

}

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



 - not  연산자

    이것 역시 책에서는 알송달송한 설명이다...  바로 c 코드로 확인해 보자.


if ( 0 )   // 이것은 0 이므로 if 문 안에 들어가지 않을것이다..

{

}


if ( 100 )  // if 문의 동작 원리는 아시다시피 0 이 아니면 들어가는 것이다.

{

}


그렇다면 not 은 무엇인가!?


if ( ! 100 )   //    0은  1로 변하게 되고     0 이 아닌것은 0 이 되버린다...   그러므로 ! 100 은  0 이 된다.

{

}


c 코드에서의 자주 쓰이는 방법이다.


#define  FALSE 0

#define  TRUE   1


static bool  bFlg = FALSE ;


bFlg != bFlg ;    // 결과는 FALSE -> TRUE 가 된다.

bFlg != bFlg ;    // 결과는 TRUE -> FALSE 가 된다.

bFlg != bFlg ;    // 결과는 FALSE -> TRUE 가 된다.

bFlg != bFlg ;    // 결과는 TRUE -> FALSE 가 된다.



if ( bFlg )      // bFlg 가 0 이 아니라면 if 문 속으로 들어갈 것이다.

{

    // .......

}


if ( ! bFlg )    // bFlg 가 0 과 같다면 if 문 속으로 들어갈 것이다.    이것은   if ( bFlg == 0 )   과도 같은 식이다.

{

    // .......

}



결과적으로 not 연산자는   c 에서  !  와  같은 원리이다.   


간단한걸 너무 어렵게 설명했나요? ㅜ_ㅜ


이것으로 논리 연산자  라는 녀석을 마칩니다.




8. while 문과  repeat 문

 - while : 루아에서의 while 문은  c 와 사용법이 동일하다. 좀 더 구체적인 설명은 while 문으로 검색하여 c 에서의 사용법을 참조.


sample code


indx = 1


while indx < 10

do

       print ( " loop pass: ", indx )

       indx = indx + 1

end



 - repeat : 루아에서의 repeat do while 문과 같은 원리이다. 일단 한번은 하고 보자는 식이다    :)


sample code


indx = 1


repeat

       print ( " loop pass: ", indx )

       indx = indx + 1

until indx > 10



 - 결론 :  while 문은   do  와  end  로 이뤄지며      repeat 는   repeat until 이 사용된다.



9. 우리의 호프 for

 - 무슨 말이 필요하랴 샘플 코드로 바로 들어갑니다.


sample code1



for indx = 1, 10

do

      print ( indx )

end


   

c code


for ( int indx = 1  ;  i <= 10  ;  i += 1 )

{

       printf ( indx ) ;

}


첫 예제에 보면  indx = 1, 10   이라 되있다.   1 부터 10 까지 인데 증가치는 얼마인지 보이질 않는다.

일종의 증가치를 생략한 경우인데  기본값  1  이 증가된다.   이것 역시 일관성이 부족하다...



sample code2


for indx = 10, 1, -1

do

       print ( indx )

end



c code


for ( int i = 10  ;  i >= 1  ;  -- i )

{

     printf( indx ) ;

}





for loop = 0 ,  100 , 1

do

       -- ...............

end


loop 변수는 for 문이 끝남과 동시에 소멸한다.

이는,  지역변수의 성질에 대해 이해가 필요하다.


c 코드로 보는 지역변수의 개념 정복


void SampleFunc()

{

     {

           int i = 0 ;

     

           for (  ;  i < 100  ;  ++ i )

           {

                printf ( " %d", i ) ;

           }

      }                    // int i = 0 ;      변수  i 는 이 라인을 통과 함으로써 지역변수로써 존재가 소멸된다.


      i = 200 ;           // error


     {

           int i = 1 ;    // ok    위의 int i = 0 ;  과는 별개의 지역변수이다.

           // ......

      }

}


위의 코드는 빌드 되지 않는다.

컴파일러는 i = 200 ;  이라는 부분에서 오류를 낼것이다.   i 는 존재하지 않기 때문이다.

이에 따른 지역변수의 완벽한 이해개념 역시 c, c++ 등의 언어를 통해 연마해야 할 것이다..





10. break

 - c 와 용도 및 원리가 동일하다.



※ C, C++ 에선 없는것..

 - "1" + 1       은   2 가 됩니다.

 - "1 + 1 "      은   문자열로 "1 + 1"  이 됩니다.

 - "abcd" + 1  은  오류를 냅니다.


  ※  이러한 형의 선언이 없는것들끼리 섞이는건.. 혼선이 일어나는건 아닐련지..


 - if a ~= b  then     이와 같은 문법은 c 에서 표현할 경우  if( a != b )  가 된다.  (부등)

   이 외의 다른 관계연산은 c 와 같다.





※ 루아에서 없는것..

 - 루아는 나머지 연산자 ( % )  가 존재 하지 않는다.         ( 이게 얼마나 중요한건데 --; )

   차기 버전에 추가될 것이라 한다.  ( 5.0 이하 버전엔 없음 )


 - switchcase 가 없다..  이로 인해 if 신공만이 만병통치약이 되겠군요


TIP

◈ 단정도 실수형 float 4 바이트 -1.2E - 38 ~ 3.4E38

◈ 배정도 실수형 double 8바이트 2.2E - 308 ~ 1.8E308


   - 현재 루아 5.0 에는 배정도 부동소수점만 쓴답니다.

   - 그렇지만 컴파일시 단정도 부동소수점을 사용하도록 설정하는것이 가능하다 합니다.


   - 루아 5.1 버전에서 정수 형식이 추가될것이라 하는군요..  



  3.14e8    (  3.14 * 10의 8승,   314,000,000 ==  3.14 * 100,000,000 )

  3.14e-2   (  3.14 * 10의 -2승,  0.314         ==  3.14 * 0.1 )




                                                                          최근 업데이트 :  2006. 1. 13


                                                                           작성자 : 되엔자앙 ( 권진영 )     - rpna@korea.com

                                                                                       from - http://cafe.naver.com/createwindow.cafe




정보란 공유를 위함이다.  수정 및 배포는 자유입니다.

다만, 출처를 분명히 하며 절대 상업적 목적에 사용될 수 없습니다.

대한민국이 강해질 그날까지..


신고
블로그 이미지

프로그래머 지향자 RosaGigantea

바쁜 일상 생활중의 기억 장소