자료출처 : 권남수님의 Game Programming을 위한 C 강의
구조체
㈜ 초보의 글이므로 잘못되거나 서투른 표현이 있을 것입니다. 그러나 읽는 분을 위해
최선을....
◆ 결론
: 도스에서의 구조체 설명은 상당히 복잡하지만, 윈도우에서의 실제 구조체 사용은 아주 간단하다.
1. 구조체란?
구조체란 배열과 비교된다. 배열은 같은 데이터형을 기억 장소에 저장시킨다면 구조체란 다른 데이터형을 저장한다.
(저장되는 방법이 일렬로 순차적으로 저장되는 것은 같다.) 구조체의 설명이 도스의 경우 책에서 매우 복잡하게 설명되는 것 같은데 윈도우에서의
실제 소스를 살펴보면 그렇게 복잡한 내용은 아닌 듯 하다. 따라서 아래의 예는 제홈의 - spr 띄우기(2)의 내용 -을 예로 들어 설명하고자
한다.
2. 구조체 선언 방식의 종류
2가지의 방법이 있는 것 같다. struct kwon {.....} 과
같은 방법과 아래에서 보듯 typedef struct {.... } 방식이 있는데 여기서는 후자
방법을 소개한다.
3. 구조체 모양
typedef struct
{
LPDIRECTDRAWSURFACE7 lpSurface;
int EachImage;
int
NowImage;
int SpriteWidth,
SpriteHeight;
POINT Direction;
int DisplayRate;
int
SpendTime;
POINT SpriteLocation;
int NowDirection;
} ;
QQQPoint
KOREASprite = NULL; // 포인터를 사용하여 연결되는 경우. 3차 표면 '캐릭터' 외부 객체
QQQ*QQQPointQQQPoint KOREASprite KOREASpriteROKSpr4. 구조체 멤버의 참조
구조체의 멤버들을 참조하기 위해 연산자가
쓰이는데 다음고 같은 2가지 연산자가 각각 사용된다.
1) 도트 연산자
(.)
사용법 : 구조체 변수.멤버명
QQQ.EachImage = 100;
(예는 위의 내용을 활용하여) QQQ라는 구조체내에 EachImage라는 멤버에 100을 배정한다.
(2)
포인터 연산자(->)
일반 변수의 경우에는 위의 도트 연산자가 사용되지만 구조체가 포인터로 사용될 경우에는 ->을
사용한다. 그 이유는 포인터를 사용하게 되면 구조체에서 도트연산자와의 우선 순위 계산으로 복잡해지기에 아예 형태를 이처럼 바꾸어 표현하는 것
같다.
사용법 : 구조체 포인터 변수 -> 멤버명
KOREASprite ->
EachImage = 100;
(예는 위의 내용을 활용하여) KOREASprite라는 포인터 구조체내에 EachImage라는 멤버에 100을 배정한다. 그 밖에 공용체라는 것도 있다.
5.
소스에서의 실제 사용 예 (제홈의 spr 띄우기(2)의 내용임.)
위의 개념만 적당히 이해한다면
결코 복잡한 내용은 아니므로 소스에서 구체적으로 살펴보시기 바람.
QQQPoint
CreateSprite(LPDIRECTDRAW7 lpDD, char* szFilename, POINT Location, POINT
SurfaceSize, POINT SpriteSize, int iImageCount, int
DisplayRate)
{
QQQPoint ONESprite = NULL;
ONESprite =
(QQQPoint)malloc(sizeof(QQQ));
ONESprite->lpSurface = DDLoadBitmap(lpDD,
szFilename, SurfaceSize.x, SurfaceSize.y);
ONESprite->DisplayRate =
DisplayRate;
ONESprite->SpriteWidth =
SpriteSize.x;
ONESprite->SpriteHeight =
SpriteSize.y;
ONESprite->EachImage =
iImageCount/4;
ONESprite->Direction.x = 0;
ONESprite->Direction.y =
0;
ONESprite->SpriteLocation = Location;
ONESprite->NowImage =
0;
ONESprite->SpendTime = 0;
ONESprite->NowDirection =
RIGHT;
return ONESprite;
}
BOOL MoveSprite(QQQPoint ROKSpr)
{
ROKSpr->SpriteLocation.x += ROKSpr->Direction.x;
ROKSpr->SpriteLocation.y += ROKSpr->Direction.y;
if(ROKSpr->SpriteLocation.x >= 640 - ROKSpr->SpriteWidth)
{
ROKSpr->SpriteLocation.x -= ROKSpr->Direction.x;
}
if(ROKSpr->SpriteLocation.x <= 0)
{
ROKSpr->SpriteLocation.x -= ROKSpr->Direction.x;
}
if(ROKSpr->SpriteLocation.y >= 480 - ROKSpr->SpriteHeight)
{
ROKSpr->SpriteLocation.y -= ROKSpr->Direction.y;
}
if(ROKSpr->SpriteLocation.y <= 0)
{
ROKSpr->SpriteLocation.y -= ROKSpr->Direction.y;
}
return TRUE;
}
BOOL DrawSprite(QQQPoint ROKSpr)
{
RECT rect;
ROKSpr->SpendTime++;
if(ROKSpr->SpendTime==ROKSpr->DisplayRate)
{
ROKSpr->NowImage++;
ROKSpr->SpendTime=0;
}
if(ROKSpr->NowImage == ROKSpr->EachImage+1)
ROKSpr->NowImage = 1;
rect.left=(ROKSpr->NowImage-1) * ROKSpr->SpriteWidth; // 그림 교체
rect.right=rect.left+ROKSpr->SpriteWidth;
rect.top=(ROKSpr->NowDirection)*ROKSpr->SpriteHeight; // 방향에 문제
rect.bottom=rect.top+ROKSpr->SpriteHeight;
lpSecondary->BltFast(ROKSpr->SpriteLocation.x,
ROKSpr->SpriteLocation.y
, ROKSpr->lpSurface, &rect, DDBLTFAST_WAIT | DDBLTFAST_SRCCOLORKEY);
return TRUE;
}
(끝)

Comments List