PGR21.com
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
Date 2008/09/27 23:26:26
Name Haru
Subject API 캐릭터 이동할려고 하는데 화면이 계속 말썽이네요. 고수님들 부탁~~
#include <windows.h>
#include "resource.h"

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
HWND hWndMain;
LPSTR lpszClass="Heart";

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
                  ,LPSTR lpszCmdParam,int nCmdShow)
{
        HWND hWnd;
        MSG Message;
        WNDCLASS WndClass;
        g_hInst=hInstance;
        
        WndClass.cbClsExtra=0;
        WndClass.cbWndExtra=0;
        WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
        WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
        WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
        WndClass.hInstance=hInstance;
        WndClass.lpfnWndProc=(WNDPROC)WndProc;
        WndClass.lpszClassName=lpszClass;
        WndClass.lpszMenuName=NULL;
        WndClass.style=CS_HREDRAW | CS_VREDRAW;
        RegisterClass(&WndClass);

        hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
                  CW_USEDEFAULT,CW_USEDEFAULT,800,600,
                  NULL,(HMENU)NULL,hInstance,NULL);
        ShowWindow(hWnd,nCmdShow);
        
        while(GetMessage(&Message,0,0,0)) {
                TranslateMessage(&Message);
                DispatchMessage(&Message);
        }
        return Message.wParam;
}

#ifdef STRESS
#else
#endif
#define MANSPEED 5
int cx;
const int cy=480;

HBITMAP hBit;
enum {STOP,RUN} Status;
int nStage;
int nLife;
int nScore;

void DrawBitmap(HDC hdc, int x, int y, HBITMAP hBit);
void OnTimer(HWND hWnd);


LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
        HDC hdc;
        PAINTSTRUCT ps;
        TCHAR *Mes="PRESS BUTTON ENTER";

        switch(iMessage) {
        case WM_CREATE:
                hWndMain=hWnd;
                hBit=LoadBitmap(g_hInst,MAKEINTRESOURCE(IDB_HERO1));
                return 0;
        case WM_KEYDOWN:
                switch (wParam){
        case VK_RETURN:
                if(Status == STOP){
                        Status=RUN;
#ifdef STRESS
                        nStage=10;
#else
                        nStage=1;
#endif
                        nLife=5;
                        nScore=0;
                        SetTimer(hWnd,1,20,NULL);
                }
                break;
                }
                return 0;
        case WM_TIMER:
                OnTimer(hWnd);
                return 0;
        case WM_PAINT:
                hdc=BeginPaint(hWnd, &ps);
                if(Status == RUN){
                        DrawBitmap(hdc,0,0,hBit);
                }
                EndPaint(hWnd, &ps);
                return 0;
        case WM_DESTROY:
                KillTimer(hWnd,1);
                DeleteObject(hBit);
                PostQuitMessage(0);
                return 0;
        }
        return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

void OnTimer(HWND hWnd)
{
        HDC hdc;
        RECT crt;
        HDC hMemDC;
        HBITMAP OldBit;

        hdc=GetDC(hWnd);
        GetClientRect(hWnd,&crt);
        if(hBit==NULL){
                hBit=CreateCompatibleBitmap(hdc,crt.right,crt.bottom);
        }
        hMemDC=CreateCompatibleDC(hdc);
        OldBit=(HBITMAP)SelectObject(hMemDC,hBit);

        if(GetKeyState(VK_LEFT) < 0){
                if(cx > 10) cx-=MANSPEED;
        }
        if(GetKeyState(VK_RIGHT) < 0){
                if(cx < 780) cx+=MANSPEED;
        }

        

        TransparentBlt(hdc, cx, cy, 30, 60, hMemDC, 0, 0, 30, 60, RGB(255,0,0));

        SelectObject(hMemDC,OldBit);
        DeleteDC(hMemDC);
        ReleaseDC(hWnd,hdc);
        InvalidateRect(hWnd,NULL,FALSE);
}

void DrawBitmap(HDC hdc, int x, int y, HBITMAP hBit)
{
        HDC MemDC;
        HBITMAP OldBitmap;
        int bx,by;
        BITMAP bit;

        MemDC=CreateCompatibleDC(hdc);
        OldBitmap=(HBITMAP)SelectObject(MemDC,hBit);

        GetObject(hBit,sizeof(BITMAP),&bit);
        bx=bit.bmWidth;
        by=bit.bmHeight;

        TransparentBlt(hdc, cx, cy, 30, 60, MemDC, 0, 0, 30, 60, RGB(255,0,0));

        SelectObject(MemDC,OldBitmap);
        DeleteDC(MemDC);
}

책 보고 여러 기능 넣어볼려고 이것저것 쳐놨는데 일단 캐릭터 좌우 이동만 해볼려고 합니다.
그런데 캐릭터가 지나가면 뒤에 잔상이 안 생겨야 되는데, 잔상이 안 사라지고 계속 남아있네요.
OnTimer 함수에서 메모리 DC에 그림을 그리고 Invalidate라는 함수로 인수 FALSE로 해주면 초기화 안된상태에서
DrawBitmap으로 다시 그려주면 더블버퍼링이 되서 화면이 깜빡이지 않고 빨리 그려지면서 잔상도 안남아야 되는데;;;
뭐가 문제인지 모르겠습니다. 지적 좀 부탁드립니다.

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
08/09/28 01:39
수정 아이콘
저도 겉만 익힌거라 정확한지는 모르겠습니다만, 잔상이 남는다니 혹시 의심되는 부분이 있어 글을 씁니다.
기본적으로 윈도우에서 그리기란 덮어쓰기 입니다. 이전 캐릭터가 뿌려진 그림위에 새로운 캐릭터를 덮어쓰면 이전 캐릭터가 잔상처럼 남을 것입니다. 즉, 더블버퍼링 하실때 캐릭터를 옮기려하니 캐릭터만 움직여서 다시그리는게 아니라, 다른 모든 오브젝트(배경, 캐릭터, 기타등등)을 전부 버퍼에 뿌려주셔야합니다. 이부분 유의하시고 한번 해보세요.
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
42753 pgr에 그림 그리시는 분에게 질문좀 드리겠습니다. [3] Jess:D1764 08/09/28 1764
42750 MOTD 볼수 있는곳? [1] 신예ⓣerran2102 08/09/28 2102
42749 사무자동화 산업기사 실기 채점 기준 질문입니다.~ [1] 사랑님3225 08/09/28 3225
42748 세계 10대 더비 [24] 허두7638 08/09/28 7638
42747 응씨배 준결승에서 이세돌 선수가 돌을 던진 이유 [7] happyend5203 08/09/28 5203
42745 축구 교체 방식 [14] TheGame1932 08/09/28 1932
42744 이 영화 제목 아시는분 [1] 배려1932 08/09/28 1932
42743 핸드폰을 잃어버렸는데요.. [3] 이삭토스트1870 08/09/28 1870
42742 만화책을 사려고 하는데요~ [2] 껀후이2303 08/09/28 2303
42741 C프로그래밍 배열 질문입니다. [13] DeathMage2094 08/09/28 2094
42740 컴퓨터 동영상재생이 안됩니다..(인터넷에서) 에프마린1622 08/09/28 1622
42739 컴퓨터 소음 줄이려면 어떻게 하는게 좋죠? [4] Helsinki1935 08/09/28 1935
42738 서울시립대 가는 길에 대해서 알려주세요.. [3] Lord4229 08/09/27 4229
42737 남자 옷 쇼핑몰 추천 부탁드립니다 [3] 녕수짱짱2993 08/09/27 2993
42735 전력 과부하(?)가 자주 일어나나요??? [1] 신난다니깐1661 08/09/27 1661
42733 API 캐릭터 이동할려고 하는데 화면이 계속 말썽이네요. 고수님들 부탁~~ [1] Haru3951 08/09/27 3951
42732 스타오류인데요..; 박수흠1624 08/09/27 1624
42731 viva la vida 뜻이 정확히 뭔가요?? [4] 냥냥냥15001 08/09/27 15001
42729 익스플로러 상에서 동영상 재생이 끔찍하게 느려집니다. [1] EZrock2137 08/09/27 2137
42728 데이터 통신 비트의 길이 구하는 문제 질문입니다. [2] 루시리스6316 08/09/27 6316
42727 나이키바지 인터넷에서 사보신분? [5] Juan1821 08/09/27 1821
42726 지금 mbc espn.. [10] top[of]zerg=홍Yello2121 08/09/27 2121
42725 컴퓨터 관련 질문입니다 ㅠ [1] 달빛요정굳히1652 08/09/27 1652
목록 이전 다음
댓글

+ : 최근 6시간내에 달린 댓글
+ : 최근 12시간내에 달린 댓글
맨 위로