Eungene's Imaginations...

Clet_02 핸드폰 화면에 도형 출력하기 본문

Programming/WIPI Clet

Clet_02 핸드폰 화면에 도형 출력하기

Eungene's 2007. 11. 6. 19:49
728x90
반응형
 저번 시간까지는 Clet을 Visual C++6.0에서 설정을 해주고, HelloWorld라는 문구를 에뮬레이터 상에서 출력을 해 주어 보았습니다.

이제 우리가 공부해 볼 것은 글자를 띄워 보았으니, 도형을 띄어볼 차례가 아니겠습니까?하하하하
그럼 이번에도 후덜덜하게 공부를 해보도록 하겠습니다.

공부를 하기 전에 http://www.wipi.or.kr 에서 제공을 해주는 도움말을 다운을 받아 놓도록 하겠습니다.
홈페이지의 메뉴를 보면 ‘WIPI 규격’이라는 메뉴가 있는데, 그 곳에서 최신 버전의 파일을 받아 놓으시기 바랍니다.


PDF 파일을 받던 MS-word 버전을 받던 상관은 없다. 그것은 공부를 하는 사람이나 프로그램을 하는 사람이나 편한 프로그램을 받으면 됩니다.
만약 그 곳에 파일을 살펴보면, WIPI의 모든 것을 문서로 설명을 해놓은 것을 확인할 수가 있을 것이다. 여기서 우리가 코딩을 하면서 가장 많이 볼 문서 파일은 제3편 C API 입니다.
사용자 삽입 이미지
<WIPI 공식 홈페이지>


그럼 이제부터 우리가 먼저 함수에 대해서 알기 전에 소스부터 코딩을 해 보도록 하겠습니다.
(프로젝트를 생성 해준 후, 메뉴에서 [Project]->[settings...]->[Link] 탭에서 [Output File name]'client.dll'로 해주었는지 확인 후, [Object/library modules:]의 텍스트박스에서 맨 마지막에 'WIPIstub.obj'를 추가를 해주어야 합니다. 이는 필수불가결한 사항입니다.)
==================================================
#include "WIPIHeader.h"

MC_GrpContext  cxt;
MC_GrpFrameBuffer bpl;

void startClet()
{
 MC_knlPrintk(" ====> Clet이 시작 되었습니다.\n");
 bpl = MC_grpGetScreenFrameBuffer(0);
}

void pauseClet()
{}

void resumeClet()
{}

void destroyClet()
{}

void paintClet()
{
 M_Int32 color;
 color = MC_grpGetPixelFromRGB(255, 255, 255);
 MC_grpSetContext(&cxt, MC_GRP_CONTEXT_FG_PIXEL_IDX, color);
 MC_grpFillRect(bpl, 0, 0, 120, 160, &cxt);
 color = MC_grpGetPixelFromRGB(0, 0, 0);
 MC_grpSetContext(&cxt, MC_GRP_CONTEXT_FG_PIXEL_IDX, color);
 MC_grpFillRect(bpl, 20, 20, 50, 50, &cxt);
 MC_knlPrintk("검정색 네모가 그려졌습니다.\n");
}

void handleCletEvent(int type, int parm1, int parm2)
{}
==================================================
<프로젝트를 만드는 순서와 Clet을 Visual C++6.0으로 설정을 해주는 것은 전 챕터에 있습니다.>

이 소스에서 굉장히 생소한 명령어와 함수들이 많을 것입니다.
쭈욱 나열을 해 보자면,

● MC_GrpContext cxt;
● MC_GrpFrameBuffer     bpl;
● bpl = MC_grpGetScreenFrameBuffer(0);
● M_Int32 color;
● color = MC_grpGetPixelFromRGB(255, 255, 255);
● MC_grpSetContext(&cxt, MC_GRP_CONTEXT_FG_PIXEL_IDX, color);
● MC_grpFillRect(bpl, 0, 0, 120, 160, &cxt);


위와 같이 있습니다.

이제 우리가 기존에 우리가 다운을 받아 놓았던 도움말을 보면서 무엇을 하는 것들인지 확인을 해보도록 하겠습니다.

그럼 ‘WIPI 2_0_1 제3편 C API’ 파일을 실행해서 [ctrl] + [F] 키를 눌러서 일일이 확인해 보도록 하겠습니다.

자세한 도움말은 직접 확인해보길 바란다. 이곳에는 간단하게 핵심 내용만 적도록 하겠습니다.

1. MC_GrpContext   cxt;
  그래픽과 관련된 모든 상황에서 꼭 들어가야 할 변수입니다. 더도 말고 덜도 말고 한 개는 꼭 생성을 해주어야 합니다.


2. MC_GrpFrameBuffer bpl;
  핸드폰 화면과 관련된 상황들을 정의해주는 것입니다. 예를 들어 화면의 가로길이 세로길이 등등의 해상도도 설정을 해줍니다. 이것도 프로젝트를 생성할 때마다 더도 말고 덜도 말고 한 번은 꼭 생성해야 합니다.


3. bpl = MC_grpGetScreenFrameBuffer(0);
  말 그대로 핸드폰 화면의 프레임 버퍼를 얻어오는 것인데, 매개변수는 특별한 경우가 아닌 이상은 0을 거의 무조건 적으로 넣어주는 것입니다. 0이 의미하는 바는 외부 화면이 아닌 핸드폰 자체에 달린 LCD화면의 프레임 버퍼를 가져오는 것입니다. 즉 위의 bpl이라는 변수는 화면의 프레임버퍼에 대한 정보를 저장을 하는 것입니다.


4. M_Int32 color;
  기존 C언어의 int형과 똑같다. Clet에서 유의할 점은 쓰기 힘들더라도 꼭 M_Int32를 꼭 써야합니다.


5. color = MC_grpGetPixelFromRGB(255, 255, 255);
  말 그대로 RGB의 색상값을 color라는 정수형 변수에다가 저장을 해줍니다.


6. MC_grpSetContext(&cxt, MC_GRP_CONTEXT_FG_PIXEL_IDX, color);
  위에 보았듯이 color 변수에다가 색상값을 넣어줬는데, 그 색상값을 cxt에 넣어주는 역할을 합니다. 여기서 ‘MC_GRP_CONTEXT_FG_PIXEL_IDX'는 전경색상이 color 값이라는 것인데, 대부분 우리가 전경색을 이용해 줄 것입니다. ’MC_GRP_CONTEXT_BG_PIXEL_IDX'는 배경색을 설정해 주는 것입니다. BG는 BackGround, FG는 ForeGround 를 의미합니다.


7. MC_grpFillRect(bpl, 0, 0, 120, 160, &cxt);
  사각형을 그려주는 역할을 한다. bpl은 어떤 화면에 출력할 것인지,
  두 번째 파라미터(0)는 사각형 위쪽 왼쪽 모서리의 x축 좌표, 세 번재 파라미터(0)은 사각형 위쪽 왼쪽에 y축 좌표를 뜻합니다.
  파라미터 값 중에 120, 160은 사각형의 크기로 가로 120픽셀, 세로 160 픽셀의 의미한다. 즉, 이 그림은 핸드폰화면에 꽉 차도록 화면에 그린 것입니다.
  그리고, &cxt는 cxt에 설정된 색상값을 가져오는 것입니다.



위 소스에서 핵심적인 것은 위의 것들입니다.
이 밖에도 도형을 그릴 수 있는 함수가 있습니다.
● MC_grpPutPixel - 점
● MC_grpDrawLine - 선
● MC_grpDrawRect - 선으로만 구성된 사각형
● MC_grpDrawArc - 선으로만 구성된 원
● MC_grpFillArc - 안이 색칠된 원
● MC_grpDrawString - 글자 출력

이것들이 대표적인 도형을 그릴 수 있는 함수들입니다.
우리들이 MC_grpFillRect() 함수를 자유자재로 쓸 수 있다면, 위의 함수들도 WIPI 도움말만 보고도 쉽게 사용을 할 수 있을 것입니다. 기존의 Window API와 크게 사용법이 틀리지 않기 때문입니다.


---------> 도형 그리는데 노하우!
핸드폰 게임을 개발을 하게 될 때면 그래픽은 필수적으로 들어갑니다. 그렇기 때문에 이미지처리는 필수입니다.
즉,
MC_GrpContext  cxt;
MC_GrpFrameBuffer bpl;
bpl = MC_grpGetScreenFrameBuffer(0);
M_Int32 color;
color = MC_grpGetPixelFromRGB(255, 255, 255);
MC_grpSetContext(&cxt, MC_GRP_CONTEXT_FG_PIXEL_IDX, color);

은 꼭 들어가야 한다는 것입니다.

한 가지더 내가 뒷 배경을 'MC_GRP_CONTEXT_BG_PIXEL_IDX' 를 안 써주고, ‘MC_GRP_CONTEXT_FG_PIXEL_IDX‘ 로 해주었습니다. 그 이유는 캐릭터 이미지를 생성을 해주고 방향키를 눌러서 이동을 시켜줄 때, 이동 되는 곳마다 캐릭터 이미지들이 겹쳐서 출력이 되기 때문입니다. 그렇기 때문에 이동을 할 때마다 캐릭터 이미지 위쪽에 배경을 깔아주고 다시 좌표가 바뀐 캐릭터를 출력을 해줘야 하는 것입니다. 그렇기 때문에 위 소스처럼 작성을 해 주었습니다.
<--------- 노하우 끝


위 소스들을 반복해서 위 구조를 완벽히 파악을 하기 바랍니다.
그리고, 다른 도형을 그려주는 함수들을 사용해 보기 바랍니다.

의문사항이나 틀린점 잘 이해가 안되는 점들이 있다면, Eungene@gmail.com 으로 mail을 보내주기 바랍니다.


다음은 handleCletEvent() 함수를 이용해서 핸드폰 키패드를 만져 보도록 하겠습니다.

반응형
Comments