창조유저그룹-커즈닷컴
Window close
ID :     PASS :   
   
  처음으로
  창조
  창조 소개
창조 다운로드
CUGz.com 소개
온라인 도움말
  커뮤니티
  가입인사
자유게시판
Q/A게시판 (1/0)
TIP/TECH
열린강좌
자주하는질문
아이디어게시판
  자료실
  소스자료실
프로그램자료실
기타자료실
명예의 전당
이미지 자료실
  지원/기타
  표준용어재정
구글 웹서치  
관리자 전용


질문게시판
- 반드시 검색을 하신 후 원하는 답변을 찾을 수 없을 때, 질문을 올려주세요.


LIST ALL
Posted by 김환욱2006-09-24 00:55:09, Hit : 2789
[질문]게임개발시 요령?
Post URL : http://cugz.sjworks.net/bbs/zboard.php?id=qna&no=1652
제가 요즘 BitBlt에 맛들여서 이것저것 테스트해보고 있는데요..
어찌보면 창조 배경객체의 그려 명령어와 비슷함...

예를 들어 폭탄맨 게임같은 경우 맵에서 벽이 있는데 이 벽을 어떻게 감지하고 케릭터가
그 위로 못지나가게 할까요? 이걸 복잡하게 좌표 따져서 하지는 않을것 같은데 말이죠...

제가 만든 우주선게임에서 우주선이 장애물에 부닥쳤을때 터지는 방법은 우주선 주변을
타이머로 계속 무한 감지하여 검은색이 아니면 폭발하게 만들었는데, 이 방법은 효율이 좋지
못한것 같습니다.

이런 방법 말고 화끈한 요령좀 알려주세요....

지상현   2006-09-24 AM 2:57:04  
이런, 관심 있는 분야기에 그냥 지나치지 못하겠군요.
폭탄맨이라... 이런 것은 충돌 처리군요.
충돌 처리는 생각보다 굉장히 옹졸하게 처리하는 경우가 많습니다.
예를 들면 타일맵에서는 각 셀이 이동 가능/불가능 플래그를 포함하고 있어서, 이동 못하는 셀로 가려고 하면 그냥 안가지는 거지요.
즉, 이동할 수 있는 영역이 이미 맵에 저장되어 있습니다.
픽셀 단위가 아니라 타일이라는 좀 더 큰 묶음이므로 메모리는 적게 먹습니다.

일반적인 2D 게임에서는 대부분 갈 수 있는 곳과 없는 영역을 미리 만들어두고 게임 플레이 할 때는 단순히 "갈 수 있는 곳들"을 살펴보고 갈 수 있는 곳만 갑니다. 이런 식으로 데이터 기반으로 처리하는게 많습니다.

물론 이러한 방법은 정적인 객체, 즉 맵의 지형 같이 바뀌지 않는 것에서만 먹히는 방법이고, 캐릭터끼리 지나갈 수 없게 하는 것은 간단합니다.
캐릭터의 영역이 겹치나 비교하는 거죠. 다른 방법은 없다고 할 수 있습니다. 당연히 좌표를 하나 하나 검사합니다만, 다른 언어는 이 것을 좀 더 깔끔하게 포장할 수 있는 수단이 존재합니다.

우주선이 장애물에 부딪히는 경우라면, 우주선과 장애물의 충돌 사각형이 겹쳤을 때 폭발하게 만들면 됩니다.
충돌 사각형은 어떤 게임 안의 객체가 내부적으로 갖는 것으로, 그 객체가 차지하는 영역을 나타냅니다.
창조는 구조체를 지원하지 않아서 이런 객체가 차지하는 여러 변수들(영역 외에도 HP, MP 같은 여러 수치...)을 하나로 묶을 수 있는 수단이 없기 때문에, 그런 식의 코딩이 잘 이루어지지 않고 있습니다.

타이머로 감지하는건 비효율적이긴 합니다. 중간에 체크하는 프레임이 생략될 수 있으니까요...(의도적으로 그렇게 하는 경우도 있지만)
창조에서는 상상하기 힘든 방법이지만, 일반적으로 게임은 모두 무한 루프를 돌리며 그 안에서 필요한 모든 처리를 합니다.
fps가 60이 넘으려면 이렇게 할 수 밖에 없습니다.
무한 루프를 돌린다는 것은 윈도우 메시지 시스템이 그리라고 할 때 그려주겠다(또 처리하고)는 것이 아니라, 매번 계속 화면을 업데이트하고 내부적인 처리를 수행하겠다는 뜻입니다.

실은 모든 윈도우 프로그램은 무한 루프를 하나씩 가지고 있습니다. 왜냐하면, 프로그램을 실행하면 코드를 하나 하나 실행하고, 마지막 코드에 다다르면 프로그램이 종료되기 때문입니다.
계속 화면에 떠있기 위해서는 루프를 돌 수 밖에 없습니다.
IE 같은 일반적인 윈도우 응용 프로그램은 메시지 루프라는 특수한 루프를 도는데, 이것은 윈도우에 어떤 메시지가 있을 때만 루프가 돌고, 메시지가 없으면 그냥 멈춰있는(CPU 시간을 할당받지 못하는) 루프입니다. 메시지는 그리 많이 오지 않으므로, IE 같은 프로그램은 가만히 두면 CPU를 거의 차지하지 않습니다.
창조로 만든 프로그램도 무한 루프를 돌고 있지만 그 코드 구현 부분이 숨겨져 있을 뿐이며, 끝내와 같은 명령어는 그 루프를 그치는 명령입니다.
같이실행해같은 명령어가 이런 메시지 루프를 처리하는 명령입니다.

그러나 게임은 사정이 다르며, 가만히 둬도 혼자 돌아가야 합니다. 그래서 메시지가 오든 말든 계속 돌아야 하며, 그것이 무한 루프의 형태로 나타납니다. 창조는 기본적으로 메시지 루프이기 때문에, 어쩔 수 없이 프로그램에서 직접 무한 루프를 만들어서 처리해야 합니다.
(VB도 마찬가지입니다.)
또, 게임은 이렇게 계속 CPU 시간을 써야 하기 때문에 CPU 사용량이 100이 되는 것은 지극히 자연스러운 일입니다.
바꿔 말하면, 게임은 빠른 처리 속도를 요하기 때문에 다른 프로그램에게 CPU를 나눠주며 놀면서 일할 여유가 없습니다.

이런 저런 이유로, 게임에서는 무한 루프를 돌리며 그 안에서 그리기나 사운드, 게임 내부 처리 따위를 수행하며, 사용자 입력(=메시지)에 반응하기 위해 같이실행해 같은 명령어를 넣는 것입니다.

대충 설명 드려봤는데, 도움이 되셨기를...
지상현   2006-09-24 AM 3:10:33  
만약 이러한 논리를 창조에서 구현한다면 대략 이런 코드가 될 겁니다.
(창의 생성될 때에서 처리합니다. VB라면 Load 이벤트죠)
다음 코드는 게임의 하나의 장면을 표현합니다.

(장면에 필요한 것들 로딩)
(게임 변수 초기화)
(...)
되풀이 (게임 종료 될 때까지) {
    게임객체처리하기;
    화면그려주기;
    키입력처리;
    사운드재생;
    기타처리;
    같이실행해;
}
(로딩한 것 메모리 돌려주기)

대충 이런 구조입니다.
루프에 들어가기 전 필요한 것을 로딩합니다.
(루프에 들어가서 로딩하는 경우도 있습니다-얼마나 로딩했는지 보여주는 경우)

굳이 저렇게 분리할 필요는 없지만, 분리하는 쪽이 편하므로 그렇게 합니다.
이 것을 우주선 게임을 예로 든다면

*게임객체처리하기-각 우주선들의 좌표를 계산합니다. 화면에 보여줄 필요는 없습니다. 우주선들의 위치나 HP 같은 것만 계산하며, 내 우주선과 적의 총알의 영역이 충돌했다면 HP를 감소시키며, 아이템의 영역과 충돌하면(겹치면) 아이템을 추가합니다. 또, 내 총알이 적 우주선과 겹치면 적을 터뜨리고 점수를 올립니다.

*화면그려주기-위에서 계산한 데이터로 그림을 그대로 화면에 그립니다. 아이템이 있으면 먹은 아이템도 표시하고, 점수도 표시합니다.

*키입력처리-어떤 키가 눌려있는지 판단해서 게임 진행에 영향을 줍니다. 예를 들어 방향키가 눌리면 내 우주선의 좌표를 바꿉니다.

*사운드재생-굳이 분리할 필요는 없지만, 적 우주선이 폭발했다거나 하면 그것을 어딘가에 기록해놨다가 여기에서 재생해주면 됩니다.

*기타처리-그 밖에 배경음이 바뀐다던지, 배경에 별똥별이 흐른다던지 하는 나머지 처리를 해주면 좋습니다.(이것을 게임객체처리하기에 포함시킬 수 있습니다)

*마지막으로, 창을 드래그 하거나... 이런 식으로 사용자가 주는 메시지를 처리하기 위해서 같이실행해를 사용합니다.

키입력처리에서 ESC를 누르면 게임종료 변수를 참으로 만들면, 되풀이에서 조건식에 의해 자동으로 루프를 나가게 만듭니다.
그러면 로딩한 것을 해제하는 코드가 나오고, 자동으로 게임이 마무리지어집니다.

흔히 다른 언어에서 게임을 만든다면 이런 구조로 만들게 됩니다.
루프 속도가 빠르기 때문에 이렇게 하는 거지만, 제가 해본 결과 창조로는 이렇게 해서는 안됩니다.
김환욱   2006-09-24 AM 3:10:40  
이야~ 정말 대단하십니다.. 게임 맵에 이미 그런 자료가 저장되어 있어서 게임플레이 할때는 그 자료의 형태만 확인해서 처리하면 되겠군요..
그런 방법이 있었군요.. 난 왜 생각해 내지 못했지 ㅡㅡ; 정말 감사합니다. 이렇게 긴글을 작성해 주시다니.. Directx 한번 공부해볼라고 했더니 뭔내용인지 감이 안오네요. ㅋㅋ
손상진   2006-09-24 AM 3:50:46  
오~ 상현님 폭주 하셨군요^^..
심심해서 창조로.. 버튼0이 좌표0에서 500까지.. 무한루프로 +1해가면서 가는데 얼마나 걸릴지 테스트를 해봤습니다.^^
평균 0.828초 걸리네요..
그런데 이경우 생각해볼것이.. 컴퓨터성능.. 그러니깐 CPU등의 성능등에 따라서 같은시간에 같은 횟수의 루프를 돌수 없을수도있다는 것인데..
그러니깐.. 루프안에서 무조껀 움직임을 주면 컴퓨터마다 동일한 속도의 움직임을 줄수가 없습니다.
프레임에 대한 움직임 처리라고 해야할까요?
이경우는 어떻게 해결을 봐야 현명한 방법이 될 수 있을까요?
지상현   2006-09-24 PM 2:13:03  
이런 경우 Frame Limit라는 기법을 사용합니다. 말 그대로 어떤 일정한 수준의 프레임을 넘지 못하도록 제한을 거는 거죠 뭐.
예를 들어 50fps로 고정하려면 한 프레임 처리가 끝난 다음 좀 더 기다려서 전체 처리 시간이 20ms가 되도록 하면 1초에 50번씩 처리할 수 있습니다.
컴퓨터가 이보다 느려서 한 프레임당 처리 속도가 20ms보다 길어지면 (자연스럽게) 전체적인 처리 속도가 느려지지만, 온라인 게임의 경우에는 프레임을 몇 개씩 건너 뛰는 Frame Skipping을 해버려서 어떻게든 시간을 맞추게 되어 있습니다...
손상진   2006-09-24 PM 2:16:59  
아.. 대충 머리속으로 그려지는 기법이 프레임 리미트라는 기법이군요..
(아. 오늘은 왠지 오타가 자주 일어나네요 ;;)
LIST ALL               GO TO THE TOP


N
Category
   Subject
Posted by
Date
H
1808 창조
   자동 생성된 창을 닫으면 그 창은 어떻게 되... [3]
장규형 2006/11/12  2767
1807 창조
   실행파일에 대한 질문입니다 [6]
다현아빠 2005/03/06  2769
1806 창조
     [re] 하나의 창을 옆에 붙어다니게 할려면 어떻게... [3]
박재성[날개달기] 2006/02/14  2769
1805 창조
     [re] [질문] 어디 방송에서 방영된줄아세요
김훈 2004/08/31  2770
1804 창조
     여러가지 방법이 있습니다.
이진백 2005/01/26  2770
1803 창조
   이런것도 창조로 가능한가요? [5]
철희 2006/02/06  2770
1802 창조
   마우스를 위에 올려놨을 때 버튼의 그림의 모... [2]
미도르 2003/01/20  2771
1801 창조
   너무 많이 질문해서 죄송합니다. [4]
『이경석』 2005/09/25  2771
1800 창조
   비밀번호 제작기를 만들려고 하는데요.
신용주 2006/08/01  2772
1799 창조
   아..한번만 더 질문..ㅈㅅ 글자 변환하기... [4]
김태형 2007/12/18  2772
1798 창조
   마우스...
에일리언 2003/02/19  2774
1797 창조
   이걸 어떻게 적용시키죠?! [3]
장규형 2006/08/02  2775
1796 창조
   난수도 잘 나올 확률이 있나요? [2]
『이경석』 2005/12/17  2779
1795 창조
   웹브라우저 에서 창조 제어하기 [2]
김길남 2006/07/31  2779
1794 창조
     [re] 리스트박스1과 리스트박스2의 내용을 서로 ... [1]
손상진 2006/11/17  2781
1793 창조
     [re] 답변 [1]
위자드 2004/09/18  2782
1792 창조
   웹브라우져 관련 질문 [6]
이지행[세죠위그이] 2005/01/08  2782
1791 창조
     [re] 창 이동 불가. [예제소스] [3]
박종훈 2006/09/11  2782
1790 창조
   리스트박스 선택여부 질문...
위자드 2004/07/25  2785
1789 창조
   인터넷 방송 플레이어를 탐색중에 있습니다. [3]
신용주 2006/07/28  2787
기타
   [질문]게임개발시 요령? [6]
김환욱 2006/09/24  2789
1787 창조
   아이콘 만드는 프로그램 [2]
신용주 2005/12/16  2795
1786 창조
   창조로 제작가능하는지요? [1]
김훈 2006/04/25  2796
1785 창조
   리스트박스에서..원래있는 스크롤바대신 [9]
이시영 2004/07/09  2797
1784 창조
   메뉴에 체크넣기.. [4]
qkrwhdgns 2005/11/13  2797
LIST ALL   Prev [1]..[11][12][13][14] 15 [16][17][18][19][20]..[87] Next
Copyright 1999-2024 Zeroboard / skin by reedyfox in miniwini style
로그인
지우개 Expert 3.0
제작자 : 천호성 님 [LINK]
로그인
대박로또2005
제작자 : 최재일 님 [LINK]
로그인
1박종훈15292 점
2지상현8809 점
3손상진7388 점
4권선중6060 점
5이진백5174 점
로그인
가입일닉네임
05/31김동률
03/31홍형기
09/01o00pp99oo
12/27이재민
11/20이희철
로그인