------

[ AD ] Port Monitor ( Try to use a Best WebSite Monitoring Tool )

------

2D Game Framework (Engine) 만들기 – tutorial with SDL

 

6. SDL Entities

Tim Jones | February 22nd, 2008 | 102 comments

In this new tutorial, as I had promised before, we are going to take our hand at creating entities.
Entities, for all gaming purposes, are anything that can be interacted with in any way, shape, or form.

이 새로운 튜토리얼에서, 내가 전에 약속한대로, 엔터티를 만드는 것을 손을 잡고 간다.

엔티티는, 모든 게임 목적을 위해, 어떤 방법, 모양 또는 형태로 교류를 할 수 있는 것이라면 무엇이든 된다.

 

Some examples might be a monster or a treasure chest that you can open.

In this sense, practically everything within the game that moves is an Entity.

몇 가지 예를 들면 열 수 있는 보물 상자 또는 괴물이 될 수 있습니다.

이러한 의미에서, 실제로 움직이는 게임 내의 모든 것이 Entity입니다.

 

A rock that is part of a map, which never moves, is not an entity.
But if you wanted that rock to move for whatever reason, then we'd make it an Entity.

바위도 지도의 일부이다, 그것은 움직이지 않아서, entity가 아니다.

그러나 당신이 어떤 이유를 위해 바위가 움직이길 원한다면, 그때 우리는 그것을 Entity로 할것이다 .


This tutorial will be split into 3 different tutorials.
The first, this one you are reading, will deal with a basic Entity class structure.
The next tutorial will veer off slightly to build a Map class via a tileset.
Then, the last tutorial, which is what a lot of people have trouble with,
will deal with Entity to Map collision, and Entity to Entity Collision.
이 자습서는 3 개의 튜토리얼로 분할됩니다.

첫 번째, 당신이 읽고있는 이것은 , 기본적인 Entity클래스 구조에 대해 다룰겁니다.

다음 학습은 tileset를 통해서 지도 클래스를 구축하기 위해 약간 벗어 날겁니다.

그런 다음 마지막으로 학습은, 많은 사람들이 문제에 봉착하는,

지도와 충돌하는 EntityEntity Entity의 충돌을 다룹니다.


Update :
- Fixed class below to have a virtual destructor. (Thanks Andras!)
가상 소멸자를 포함하도록 아래의 클래스를 수정합니다.


Let’s get started by creating two new files called CEntity.cpp and CEntity.h.
Open up the header file and add the following:

CEntity.cpp CEntity.h라는 두 개의 새로운 파일을 생성하여 시작하자.

헤더 파일을 열고 다음을 추가 :

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

#include <vector>

#include "CAnimation.h"

#include "CSurface.h"

class CEntity {

public:

static std::vector<CEntity*> EntityList;

protected:

CAnimation Anim_Control;

SDL_Surface* Surf_Entity;

public:

float X;

float Y;

int Width;

int Height;

int AnimState;

public:

CEntity();

virtual ~CEntity();

public:

virtual bool OnLoad(char* File, int Width, int Height, int MaxFrames);

virtual void OnLoop();

virtual void OnRender(SDL_Surface* Surf_Display);

virtual void OnCleanup();

};

Now, open up the cpp file and add the following:

, CPP 파일을 열고 다음을 추가 :

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

#include "CEntity.h"

std::vector<CEntity*> CEntity::EntityList;

 

CEntity::CEntity() {

Surf_Entity = NULL;

X = Y = 0.0f;

Width = Height = 0;

AnimState = 0;

}

CEntity::~CEntity() {

}

bool CEntity::OnLoad(char* File, int Width, int Height, int MaxFrames) {

if((Surf_Entity = CSurface::OnLoad(File)) == NULL) {

return false;

}

CSurface::Transparent(Surf_Entity, 255, 0, 255);

this->Width = Width;

this->Height = Height;

Anim_Control.MaxFrames = MaxFrames;

return true;

}

void CEntity::OnLoop() {

Anim_Control.OnAnimate();

}

void CEntity::OnRender(SDL_Surface* Surf_Display) {

if(Surf_Entity == NULL || Surf_Display == NULL) return;

CSurface::OnDraw(Surf_Display, Surf_Entity, X, Y, AnimState * Width, Anim_Control.GetCurrentFrame() * Height, Width, Height);

}

void CEntity::OnCleanup() {

if(Surf_Entity) {

SDL_FreeSurface(Surf_Entity);

}

Surf_Entity = NULL;

}

 

Okay, now for some basic explanation.
What we are doing here is encapsulating the basic 5 components I mentioned within the first lesson (excluding Events, which will be handled in a later lesson).
, 이제 몇 가지 기본적인 설명.

우리가 지금 뭘하는 건지, 내가 처음 강의 안에서 언급한, 기본 5 구성 요소의 캡슐입니다.

(이벤트 제외,나중에 수업에 처리됩니다)

 

This allows us to handle Entities within the game much more easily,
rather than clumping them together with everything else in the game within the main CApp class.
이것은 훨씬 더 쉽게 , 게임 내에서 엔티티를 처리 할 수 있도록 해주고,

오히려, 메인 CApp 클래스 안에 게임의  모든 것 들을 함께 군집(clumping)시키는 것보다,

 

This will also be the way we handle other things as well.
이것은 또한 다른 것들을 처리하는 방법인 것 입니다.

 

The first thing you may notice is a static vector called EntityList.
This vector will hold all of our entities, easily accessible through CEntity::EntityList,
because it's declared as a static.
우선 발견되는 것은 EntityList라는 정적 벡터이다.

이 벡터는 CEntity: EntityList를 통해 쉽게 접근하고, 모든 Entity를 보관할 겁니다

왜냐하면 정적으로 선언했기 때문입니다.

 

I should make a special note here :
we declare this EntityList within CEntity because it prevents from circular dependencies later on.
나는 여기서 특별히 언급 해야하는 것은 :

우리가 CEntity안에 EntityList를 선언하는 것으로, 나중에 (재귀호출) 종속을 막기 위함이다.

 

An example of this is trying to get a Map to communicate with Entities,
and Entities to get to communicate with the Map.
Such as CMap declaring a CEntity member, and CEntity declaring a CMap member.
It would cause problems on the compile level.
이 예제는 엔티티와 통신할 수 있는 지도를 얻으려고 시도하는 것이고,

Entity는 지도와 통신할려고 한다.

이것은 CMap Centity member선언하고 CentityCMap member를 선언한다.

이것들은 컴파일 단계에서 문제를 일으킬 것입니다.


So this vector contains all of our Entities within the game.
Notice that each member of the vector is a pointer.
This is because later on we are going to inherit this CEntity class for Entity specific classes.
그래서 이 벡터는 게임 내에 엔티티의 모든 것이 포함되어 있습니다.

벡터의 각 구성원은 포인터인 것을 확인할 수 있습니다.

이는 나중에 우리는 Entity 특정 클래스에 대해서 CEntity 클래스를 상속하는 것입니다.

 

So, for example, if we were going to make a Megaman game,
we would have a CMegaMan class inheriting the CEntity class.
그래서, 예를 들어, 우리가 Megaman 게임을 만들려고 경우,

우리는 CEntity 클래스으로부터 상속받은 CMegaMan 클래스를 가질 것이다.

 

And, via polymorphism, we can store that CMegaMan class within the EntityList.
그리고, 다형성을 통해, 우리는 EntityList안에 CMegaMan 클래스를 저장할 수 있다.

 

This is the very reason why we declared the functions above as virtuals,
and certain members as protected.
이것이 우리가 virtual들 위에, 특정 memberprotected로 함수를 선언하는 바로 그 이유다.


Next, we have basic information about the Entity, common to all Entities, coordinates,
dimensions, and a surface for its image.
다음으로, 우리는 엔티티에 대한 기본 정보, 모든 엔티티에 공통요소, 좌표,

크기, 그 이미지에 대한 표면을 가진다.

 

Next, we have a loading function that basically takes a filename, and loads the image.
By default, we have it setting a transparent color.
다음으로, 우리는 기본적으로 파일 이름을 갖고, 이미지를 로드하는 로딩기능을 갖고 있다.

기본적으로, 우리는 그것은 투명한 색상을 설정합니다.

 

I'd like to step aside here for a moment to let you all know that certain things I do aren't set in stone.
You can, and are encouraged, to take this code and modify to your liking.

나는 잠시동안 여기서 물러나, 당신이 고정된 것이 없다는 것를 알도록 해주고 싶다.

당신은, 코드를 갖고 당신이 원하는 대로 수정하도록, 권장 해주는 것이다, 할 수 있다

You may want more parameters on your OnLoad function, or you may want less.
OnLoad
함수에 대한 더 많은 매개 변수를 원하거나,
​​또는 적게 원할 수 있습니다.

 

You may not want a default transparent color, who knows.
I encourage you to test different things.
Don't worry, my code will still be here if you mess things up.
당신이 ,알고 있는, 기본 투명 색상을 원할하지 않을 수 있습니다.

당신이 다른 것들을 테스트하는 것을 권장합니다.

당신이 ,엉망진창으로 만들어도,걱정하지 마라, 내 코드는 아직 여기 있다.


Next, we have a basic OnLoop function that handles basic calculations.
다음으로, 우리는 기본적인 계산을 처리하는 기본 OnLoop 기능이 있습니다.

 

Right now we are only calculating Animation.
지금 우리는 애니메이션(연속동작)를 계산하고 있습니다.

Also please note that we have only set the MaxFrames for the Animation,
and left the defaults in place.
또한, 우리가 주의 할것은 애니메이션에 대한 MaxFrames을 설정한 것과
위치의 기본값을 주는 것이다.

 

Next, we have the OnRender function.
다음으로, 우리는 OnRender 기능이 있습니다.

 

Instead of making it render to the display only,
I've allowed a parameter to specify where to render this entity.
단지 표시하기 위해 렌더링 만드는 것 대신에,

이 엔티티를 렌더링하는 위치를 지정하는 매개 변수를 허용했습니다.

 

This could be any surface you want.
So you could, if you wanted, render one entity onto another.
이것은 당신이 원하는 어떤 표면 일 수 있습니다.

그래서 가능한 것은, 당신이 원한다면, 다른 것에 또 다른 엔터티를 렌더링하는 것이다.


Lastly, we have an OnCleanup function that restores memory and all that stuff.
마지막으로, 우리는 메모리와 모든 것들을 복원하는 OnCleanup 기능이 있습니다.

 

Like I mentioned in the beginning, this is a basic Entity class structure,
제가 처음에 언급한 것과 마찬가지로, 이것은 기본적인 Entity클래스 구조입니다

 

it basically doesn't do much yet, but don't fret, it soon will in coming lessons.

그것은 기본적으로 아직 많이 하지 않았습니다, 하지만 걱정하지 마세요, 그게 곧 수업할 것 입니다 ​​.


 

 

So lets get it working.
이제는 작업으로 들어 갑시다.

 

Open up CApp.h and add the header file to the top, and declare two Entities:

CApp.h을 열고 상단에 헤더 파일을 추가하고, 두 개의 엔티티 선언한다 :

1

2

3

4

5

6

7

8

#include “Centity.h”

//...

private:

CEntity Entity1;

CEntity Entity2;

 

Now, lets load these two Entities.
Open up CApp_OnInit.cpp and add the following:

이제 이 두 엔티티를 로드 합니다.

CApp_OnInit.cpp를 열고 다음을 추가 :

1

2

3

4

5

6

7

8

9

10

11

12

if(Entity1.OnLoad("./entity1.bmp", 64, 64, 8) == false) {

return false;

}

if(Entity2.OnLoad("./entity2.bmp", 64, 64, 8) == false) {

return false;

}

Entity2.X = 100;

CEntity::EntityList.push_back(&Entity1);

CEntity::EntityList.push_back(&Entity2);

Now, depending on the images you use,

you need to set the values appropriately on the OnLoad function.

, 여러분이 사용하는 이미지에 따라,

당신은 OnLoad 기능에 적절하게 값을 설정해야합니다.

 

I've reused the yoshi image from the previous lesson, and if you still need it :
Now, remember how I stated we are basically encapsulating the basic functions
of a game within the Entity class?

제가 이전 강의로 부터 요시 이미지를 재사용 하고, 그리고 당신은 여전히 필요한 것은  :
, 우리가 엔티티 클래스 내에 게임의 기본적인 기능을 기본적 캡슐 이라는 것을

어떻게 묘사 하는지를 기억하는가?


We have to call those functions now in the respective CApp functions.
우리는 각 CApp 기능에서, 이제 모든 함수를 호출해야 합니다.

 

So, open up CApp_OnLoop.cpp and add the following:

그래서, CApp_OnLoop.cpp을 열고 다음을 추가 :

1

2

3

4

5

for(int i = 0;i < CEntity::EntityList.size();i++) {

if(!CEntity::EntityList[i]) continue;

CEntity::EntityList[i]->OnLoop();

}

 

We are basically running through each Entity in our vector, and calling the OnLoop function.

우리는 기본적으로 우리 벡터의 각 Entity을 통해 실행하고, OnLoop 함수를 호출한다.

Simple enough!
아주 간단!
(And we're doing an error checking so we don't call any NULL pointers).

 (그리고 우리가 어떤 NULL 포인터를 호출하지 않도록 오류검사를 한다.)

 

Now, lets do the same things in CApp_OnRender.cpp:

이제 CApp_OnRender.cpp에서 같은 일을 할 수 있습니다 :

 

1

2

3

4

5

for(int i = 0;i < CEntity::EntityList.size();i++) {

if(!CEntity::EntityList[i]) continue;

CEntity::EntityList[i]->OnRender(Surf_Display);

}

 

And the same thing in CApp_OnCleanup.cpp:

그리고 CApp_OnCleanup.cpp에서도 같은 것이다:

 

1

2

3

4

5

6

7

for(int i = 0;i < CEntity::EntityList.size();i++) {

if(!CEntity::EntityList[i]) continue;

CEntity::EntityList[i]->OnCleanup();

}

CEntity::EntityList.clear();

 

Note that I added the clear function call, which clears out the vector to nothing.

Basically a reset.
나는 벡터를 초기화하는 지우는 함수의 호출을 추가합니다.

기본적으로 재설정하십시오.


 

Great, now try getting this thing to compile.

좋네요, 지금 이것들을 순차적으로 컴파일하십시오.

You should see two yoshis running together on the screen.

당신은 화면위에 함께 실행되는 2개의yoshis를 볼 수 있을 것이다.

 

In the next lesson we're going to looking at making Maps,

and creating a basic file format for our Maps.

다음 수업에서는 지도를 만드는 것을 살펴 볼 것이고,

그리고 지도에 대한 기본 파일 형식을 만들것이다.

 

'온라인게임' 카테고리의 다른 글

Dark GDK - 이미지 로딩 예제 / 2D  (0) 2011.10.25
MS SQL Server Alter Table  (0) 2011.10.24
5. SDL Animation  (0) 2011.10.24
4. SDL Tutorial - Tic Tac Toe  (0) 2011.10.19
3. SDL Events  (0) 2011.10.19

+ Recent posts