IRiS nX
114 ARTICLES / 235 REPLIES [1:2]
=ADMIN=


NAME / EMAIL
URL
SUBJECT
MESSAGE
ATTACH
ATTACH STYLE COOKIE  
#142. 델사랑 [REPLY]
전에 3차원 원기둥관련 질문을 했었습니다. 2005/09/05 (Mon)

답변을 해주신 내용을 참조하여 테스트중인데 잘 이해가 안되서 말입니다.
원래 2D 자료로 올린것은 TFPoint가 x, y 만 존재하는데 여기에 z 값을 enable 하라는 의미인가요 ?
View Matrix 설정과 Projection 설정은 어떻게 하는 것인가요 ?
가능하면 순서를 좀 나열해 줬으면 합니다.(설정해줘야 하는 순서)
참조를 할려고 해도 델파이 관련 자료는 잘 없군요.(참조 가능한 서적이 있음 제목을 좀 알려 주시면 감사하겠습니다.)
구현할 려고 하는 것은 마우스를 드래그 하면 사면체나 원기둥이 마우스 드래그한 크기로 그려지고, 이를 원하는 각도로 회전을 시켜 보는 것입니다.
부탁합니다.

#142-1. 안영기 2005/09/05 (Mon)
음...
z값을 enable하라는 것이 아니라 z-buffer를 enable하라는 것입니다.

제 소스에서 CreateDevice()를 하기 전에 아래와 같이 present parameter를 채워주면 z-buffer를 사용할 수 있습니다.

m_d3dPP.EnableAutoDepthStencil := TRUE;
m_d3dPP.AutoDepthStencilFormat := D3DFMT_D16;

그리고 device 생성된 난 후에

m_pD3DDevice.SetRenderState(D3DRS_ZENABLE, 1);

라고 해주면 z-buffer가 enable 됩니다.


View Matrix와 projection matrix 설정은 IDirect3DDevice9.SetTransform() 함수의 역할을 찾아 보세요.


혹시나 제가 올린 2D용 library를 그대로 사용하시려 한다면 조금 무리가 따를 겁니다. Vertex 구조에 rhw를 넣고 있는데 이것을 빼셔야 view matrix 계산이 됩니다. 그리고 light를 추가하려면 vertex에 normal도 집어 넣어야겠죠.


델파이로 된 자료를 추천해달라고 하셨는데, 델파이용으로도 있는지는 잘 모르겠습니다. 하지만 Direct3D는 특정 언어에 종속적이지도 않고 3D 개념도 델파이와는 관계가 없으니 서점에서 Direct3D에 대해 나와 잇는 아무 책이나 보셔도 개념을 잡을 수 잇을 것 같습니다. 그리고 Direct9 SDK에 배포되는 문서는 필독입니다. 위에서 말씀하신 matrix 설정 순서나 그에 대한 샘플이 tutorial 형식으로 잘 되어 있습니다. (그리고 원기둥을 회전하고 조명 비추고 텍스쳐 입히는 예제가 소스까지 들어 있습니다. 물론 C++이지만...)

굳이 델파이로만 공부를 하시겠다면.. 글쎄요.. 제가 아는 자료는 없습니다.

#142-2. 안영기 2005/09/06 (Tue)
델파이 DirectX 9.0 자료와 샘플 있는 곳
http://www.clootie.ru/ 입니다. 원기둥 샘플도 찾아 보시면 있습니다..

다운로드 [1M] 이 샘플은 그 사이트에 있는 예제를 약간 수정해서 원기둥 깡통을 만들어 보았습니다. (델파이에서 바로 실행되도록 모든 소스를 다 첨부했습니다.)


#141. 프로그래밍 왕초보 [REPLY]
조금 생뚱맞지만... 2005/09/03 (Sat)

2D 슈팅이라면 화면상의 영역을 2D map 으로 잘게 잘라 놓고 현재의 오브젝트들에 의한 자신의 위험 수위를 더하는 식으로 합니다. 현재 총알이 있는 곳이라면 100 이고 그 다음에 움직이는 위치라면 90, 그 다음 타임의 위치는 80... 이런식으로 위험 수위에 대해서 그것을 수치로 측정한 후에 모든 오브젝트의 것을 다 계산하여 맵 상에 가중치로 부여합니다. 그러다 보면 당연히 수치가 가장 낮게 나오는 path가 생깁니다. 그곳이 흔히 말하는 '안전지대'입니다. 그리고 그 위치대로 이동하면 바로 회피 AI 가 됩니다.

3D라면 어떻게 되죠?

그리고 현재기술로 4D를 만들수 있을까요?

#141-1. 안영기 2005/09/03 (Sat)
재미있는 주제네요.
제가 이쪽은 잘 모르기 때문에 그냥 생각나는대로 적어 보면요...

일단 말씀하시는 것이 우주공간처럼 자유롭게 3개의 축을 다 사용해서 움직임이 가능한 곳이라 생각하겠습니다. 그리고 거기서 '안전지대'를 찾으려면 가장 쉬운 방법은 위의 2D에서 안전지대를 찾는 알고리즘에 벡터 하나를 더하고 맵 배열의 차원을 하나 더 늘이는 것입니다. 그렇게 하면 이론적으로는(메모리 상으로는 모르겠지만) 같은 알고리즘으로 3D에 적용할 수 있을 것 같습니다.

그리고 위의 방법에 메모리 문제가 있다면 관점을 조금 바꾸어서 생각해야 하는데, 공간의 관점이 아닌 오브젝트의 관점에서 보면 접근법을 찾을 수 있을 것도 같습니다. 모든 충돌 이벤트는 오브젝트와 충돌하면서 생기는 것이므로 현재 이동해야 하는 오브젝트로부터 공간상으로 가상의 빛을 쏘아서 그 빛이 지나가는 공간에 대해서만 가중치를 계산하고 그중에 가중치가 가장 낮은 곳으로 이동하면 될 것 같습니다. 아마도 공간상으로 전파되는 모든 방향을 계산하지 않더라도 현재의 오브젝트 간의 위치를 이용하면 계산해야 하는 위치를 많이 줄일 수 있을 것 같네요. 만약 현재 움직여야 하는 단위 벡터가 아니라 path를 필요로 한다면 이것보다는 좀 더 계산이 많아져야 할 것 같습니다.

그리고 4D라면 위의 맵 방식에서 프로그래밍적인 접근으로 벡터를 다시 하나 더 추가하고 맵의 차원을 한 단계 더 놓이면 됩니다. 하지만 문제는 그것을 어떻게 표시하냐는 것입니다. 아시다시피 우리가 보는 출력은 2D입니다. 그곳에 3D를 표시하기 위해서 우리는 렌더링이라는 과정을 거칩니다. 그런데 거기서 4D를 표시하려면 결코 쉽지 않을 것입니다. 1D 디스플레이에서 3D를 표시하려는 것 이상의 노력이 듭니다. (제 생각에는 불가능하리라 생각됩니다.) 결국에는 3차원 디스플레이 정도는 있어야 하는데, 3차원 디스플레이에서 4D를 표현하기 위해서는 범위 내의 3D 공간의 변위를 모션블러 형식으로 뿌려주는 방법이 있을 겁니다. 저는 4D가 (3D+시간)이라고 생각하지는 않습니다. 단지 3D 공간을 (-무한대)~(+무한대)로 적분한 공간이라고 보고 있습니다.

'막 우주론'이나 '초끈 이론'등에는 11차원까지 논하고 있지만 아무리 책을 봐도 평범한 저의 머리로는 이해가 어렵더군요. 물리학자들에 비해 게임 프로그래머는 3차원까지만 생각하면 되니 나름대로 행복한 것은 아닐런지... ^^;


#140. 델사랑 [REPLY]
3차원 원기둥을 만들어 보려고 합니다. 2005/08/24 (Wed)

2차원은 님에 써신 "Direct3D 9.0을 이용한 2D 게임 만들기"를 읽어 보고 테스트를 하고 있는데 3차원은 어떻게 표현해야 할지 감을 잡을 수가 없군요. Direct를 사용하여 어떤식으로 처리하면 되는지 좀 알려주실 수 없을까요 ?

#140-1. 안영기 2005/08/25 (Thu)
간단한 샘플을 짜서 첨부하려 했는데...
델파이에서는 D3DX류의 함수를 쓰려면 다른 dll이 필요하군요. 그래서 당장 샘플을 올리는 것은 좀 어렵습니다.

일단 제가 강좌를 썼던 2D 게임 만들기에는 3D를 하기 위한 요소 중에서 많은 것이 빠져 있습니다.

1. Z-buffer enable
-> 2D는 Z-buffer의 도움을 받을 필요가 없습니다.
2. View matrix 설정과 Projection 설정
-> 2D는 orthognal로만 설정했습니다.
3. Vertex좌표에서 z값 assign
-> 2D는 z값이 항상 동일합니다.

이 정도의 기본 설정이 필요하고 원기둥을 만드신다면 추가적으로,

1. 원기둥을 부드럽게 하기 위한 normal 설정
-> 2D는 rhw를 1.0으로 사용합니다.
2. 원기둥처럼 보이기 위한 lighting(ambient, diffuse...)
-> 2D 샘플에는 적용하지 않았습니다.

혹시나 해서 그러는데 원기둥을 만드려면, 그것이 nurbs로 표현 가능하지 않는 이상은 원이아닌 다각형으로 구성됩니다.예를들어 10각형보다는 20각형이 더 원에 가깝고 그 보다는 50각형이 원에 가까운 이치입니다. 그렇게 정n각형을 만들기 위해서는 x = r * cos(360 *i / n), y = r * sin(360 *i / n), z = (-h/2) 와 (+h/2)의 vertex 집합으로 구성됩니다. 물론 각 vertex의 normal vector의 값은 중심점에서 vertex로 향하는 것을 사용하면 됩니다.

일단 3D의 부분은 2D와는 많은 개념이 다르므로 만약 위의 내용이 생소하다면 관련된 서적을 통해 먼저 3D 프로그래밍의 이론을 배우는 것이 먼저일 것이라 생각됩니다.


#130. 전봉훈 [REPLY]
안영기님 프로그램에 버그가..?? 2005/08/10 (Wed)

안녕하세요.
OpenGL로 주사위를 굴리자 프로그램을
실행해봤습니다. 그런데 캡쳐화면하고는 틀리게..

육면체는 제대로 나오는데(텍스쳐 입혀서)
바탕화면이 까맣게 나오는군요.

버그인가요? 캡쳐화면에는 바탕화면에 b.bmp가 출력이 되는것 같은데요.

#130-1. 안영기 2005/08/10 (Wed)
저는 잘 나오는데요.
회사 컴퓨터로 확인을 했는데, 첨부된 실행파일로 하나 직접 컴파일 해서 하나 다 잘 나옵니다.

혹시 b.bmp를 수정하거나 하지 않으셨나요? 소스상으로는 24-bit BMP만 읽을 수 있습니다. 그것도 아니라면... 그냥 그려라니 하고... ^^;


#128. 델파이게임제작초보 [REPLY]
캐릭움직이는걸 만들어보려고합니다. 2005/08/06 (Sat)

방향키로 좌,우,상,하 또는 좌상,우상,좌하,우하 방향으로
움직이는 것은 쉬워서 만들긴 했는데

이번엔 마우스로 화면좌표(0,0)을 클릭하면
화면좌표(1024,768)에 위치한 캐릭터가
서서히 화면좌표(0,0)으로 이동하는것을 만들어보고 싶습니다.
- 방향키로 움직이는것을 만들고난뒤 마우스로 위치 클릭하면
해당위치까지 움직이는것도 만들긴했는데 일정하게 움직이지가 않더라구요.
캐릭터 위치와 클릭한곳의 위치... 화면상의 거리계산을 어찌해야할찌 ㅡㅡ;
고수님의 가르침좀 받고싶습니다. 그럼 좋은주말되시길 바라며...^^

#128-1. 안영기 2005/08/09 (Tue)
...
폼에 타이머 하나 올리시고 아래 소스에 나와 있는 3개의 이벤트를 연결하세요.
그리고 폼에다가 마우스 클릭을 하면 빨간점이 그 위치로 등속도 운동을 합니다.

이동 간격은 10-pixel 단위로 10ms입니다. 값은 조정하시면 됩니다.

소스 내용은 별거 아니고 고등학교 수학의 삼각함수와 벡터입니다.
삼각함수로 이동할 각도와 단위벡터를 구한 후 그 단위벡터에 이동 속도를 곱하여 정해진 시간에 맞게 백터 합을 연산하면서 이동합니다.

이것은 샘플입니다.

implementation

{$R *.DFM}

uses
math;

type
TVector = record
x, y: double;
end;
const
MOVE_STEP = 10;
QAZ = MOVE_STEP div 2;
var
g_pos: TVector = (x: 30; y:30);
g_dest: TVector;
g_vector: TVector;

procedure TForm1.FormCreate(Sender: TObject);
begin
Canvas.Brush.Color := clRed;
Timer1.Interval := 10;
Timer1.Enabled := FALSE;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
angle: double;
begin
angle := arctan2(y - g_pos.y, x - g_pos.x);
g_dest.x := x;
g_dest.y := y;
g_vector.x := MOVE_STEP * cos(angle);
g_vector.y := MOVE_STEP * sin(angle);
timer1.Enabled := TRUE;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
g_pos.x := g_pos.x + g_vector.x;
g_pos.y := g_pos.y + g_vector.y;
if (abs(g_pos.x - g_dest.x) < QAZ) and (abs(g_pos.y - g_dest.y) < QAZ) then begin
g_pos := g_dest;
Timer1.Enabled := FALSE;
end;
Canvas.FillRect(Bounds(round(g_pos.x)-1, round(g_pos.y)-1, 3, 3));
end;


#126. 그네고치기 [REPLY]
클래스의 메소드를 동적 DLL로 호출할 수는 없을까요? 2005/08/03 (Wed)

~ 너무 대충 질문하여 송구합니다! ~

어떤 클래스가 있습니다. 대강 A라고 하겠습니다.
이녀석의 선언이...

ManType=class
public
X, Y :Smallint;
K, B :Smallint;
myIndex :Smallint;

procedure NaturalVelocity(myLR:integer);
constructor Create(Index2:integer);
procedure Init(Fields:FieldType; TimeUS:Smallint);

function MoveManGutly:boolean;
end;

대강 이렇게 되어 있습니다.



여기서, 저는 MoveManGutly라는 저 메소드를, 실행 시간에 동적으로 외부 DLL 파일에서 가져오게 하고 싶습니다. 방법이 없을까요?

#126-1. 안영기 2005/08/03 (Wed)
COM을 사용하세요.
대표적으로 DirectX가 class(실제로는 interface)로 되어있지만 특정한 언어와 관련없이 export 가능합니다. 그 이유는, 그것이 COM으로 만들어져 있기 때문입니다. Linux의 shared object의 경우에는 class에 대한 export를 지원하지만 Windows에서는 COM이외에는 별다른 대안이 없는 것 같습니다.

그리고 COM을 사용하지 않는다면 wrapper class를 만들어 주는 방법과 GetInstance() 함수를 DLL 쪽에 만들어 주는 방법이 있습니다. 단, class 생성용 함수를 DLL 쪽에 만들어주는 방식은 같은 언어에서만 가능합니다.


#121. 전봉훈 [REPLY]
TBitmap 에 대한 질문이 있습니다. 2005/07/20 (Wed)

델마당에 질문을 두번이나 했지만 아무도 답변해 주는 사람이 없어서.. 이렇게 이곳을 찾게 되었습니다.

TBitmap을 래핑하는 클래스를 제작중입니다. 클래스 이름은 TDIB 인데요

Page, BmpFile : TDIB; 라고 선언하면

BmpFile.Draw(Page, 0, 0); 이런식으로
드로잉 할 수 있습니다.

그런데 생성자에서 안에 있는 TBitmap 객체를 Create 함에도 불구하고 ScanLine을 이용한 Draw 함수에서 억세스 바이올레이션이 납니다. 둘다 BMP 파일을 로드하면 괜찮구요. 아마 ScanLine이 세팅이 안되거나 메모리가 할당이 안된 것 같은데요..

TBitmap.Create 한 다음에 어떤 작업을 해 주어야 포인터를 사용할 수 있을까요?

#121-1. 전봉훈 2005/07/20 (Wed)
추가사항
참고로 Image 컴포넌트 위에 그리는 Draw함수도 있는데 똑같은 구조임에도 그것은 잘 됩니다.

#121-2. 안영기 2005/07/21 (Thu)

var
    bitmap: TDIB;
    pDest32: ^DWORD;
    i, j: integer;
begin
    bitmap := TDIB.Create();
    bitmap.Width := 100;
    bitmap.Height := 100;
    bitmap.PixelFormat := pf32bit;
    bitmap.Canvas.FillRect(bitmap.Canvas.ClipRect);

    for j := 0 to pred(bitmap.Height) do begin
        pDest32 := bitmap.ScanLine[j];
        for i := 0 to pred(bitmap.Width) do begin
            pDest32^ := $FF0000;
            inc(pDest32);
        end;
    end;

    Canvas.Draw(0, 0, bitmap);

    bitmap.Free();
end;


이런 식으로 출력하려했을 때 문제가 생긴다면 뭔가 TDIB에 문제가 있는 것입니다. 그리고 TDIB의 구현에 문제가 있는 경우에는 구현한 소스가 없으면 원인을 알지 못합니다.
(위의 결과로는 window의 (0,0)부터 (100,100)까지 빨간 사각형이 나타납니다.)

일단 TDIB를 구현할 때 inherited를 빼먹은 부분이 있는지 확인하고 그 부분에 문제가 없을 때는 소스를 직접 올려 주세요.


#120. 결이 [REPLY]
C++에서 클래스... 2005/07/05 (Tue)

안녕하세요.
여기다가 이런글 써도 될지는 모르겠지만
군제대 후 학교로 다시 복한한뒤 C++ 수업을 듣고 있는데.. 클래스 부분이 잘 이해가 안가네요. 한국말로 된 사이트도 열심히 찾아 봤건만 머리가 딸려서 이틀째 씨름중.... 학교 숙제로 클래스를 이용한 프로그래밍을 해야하는데 손도 못 대고 있습니다. 일단 내일 자정까지만 내면 되는데 클래스를 이해하지 못한 상태에서 할려니 도저히 안되겠더라고요.

클래스가 C언어의 구조체와 비슷하다는 것은 알겠는데 (물론 한단에 업그레이드된 개념이지만) private에 정의된 함수들로 접근하는 법이 잘 이해가 안가네요. 음.. 아아 이렇게 기초도 이해 못하고 있는데 과연 내 전공인 Computer Science로 졸업은 할수 있을런지....... OTL

#120-1. 안영기 2005/07/05 (Tue)

private 함수로 접근하는 법이라는 것이 무얼 말씀하시는 것인지 잘 모르겠습니다. private 함수라고 특별한 것은 없고, 단지 class 외부에서나 상속 받은 다른 class가 그 함수에 접근하지 못하게 제한한다는데 그 의미가 있습니다. 그대신 protected는 상속 받은 다른 class에서 접근이 가능하기 때문에 상속 받은 class에서 재정의를 해야 하는 함수를 virtual로 선언해서 public의 함수는 건들지 않고 기능을 재정의 하는데 사용하기도 합니다.

C에서는 기능 중심의 구현에서 C++에서는 개체 중심의 구현으로 그 개념이 바뀐 것입니다. '밥 먹는 것을 개가 한다, 밥 먹는 것을 사람이 한다' 라는 개념에서 '개가 밥을 먹는다, 사람이 밥을 먹는다'로 바뀌었습니다.

Eat(&dog); Eat(&person) 에서 dog->Eat(); person->Eat() 로 바뀐 것이죠.

void Eat(ANIMAL* pAnimal)
{
   switch (pAnimal->type)
   {
      ...
   }
}

에서

void CDog::Eat()
{
   ...
}

void CPerson::Eat()
{
   ...
}

처럼 구현이 바뀌었습니다.

#120-2. 그네고치기 2005/07/06 (Wed)
객체지향은...
객체지향은...
자바로 개념을 잡고 시작하시면 편하시지 않을까 하는 잡생각을 해 봅니다.

오브젝트 파스칼이나 VC++이나 자바나 다들 객체지향을 지원하지만, 왠지 자바가 개념적으로는 객체지향의 가장 모범교재가 아닌가 하는 생각이 듭니다.


#119. 미르 [REPLY]
음...지식의성전 시리즈 소스.. 2005/06/12 (Sun)

안녕하세요~
저는 이번에 델파이에 손좀 대볼 까 생각중에,
이 게임이 델파이로 제작되있다는 것과,
추억을 되살려보자는 생각이 들어서
지식의성전 씨리즈 소스 공개되있는것들을
찾아봤는데요~
아무리 찾아봐도 또지성과 다카 소스는 나오질
않는군요....
미스틱과, 데쟈뷰소스는 조합형으로 한글이
되있어서 순간 당황했었다는..........
그 초기 소스들 또한 어떻게 구할 수 있는
방법은 없을까욤~~~?^^

#119-1. 안영기 2005/06/12 (Sun)
공개 안되어 있습니다.
어차피 비전속으로 소스와 같기 때문에 공개할 필요가 없었습니다. 도리어 공개해서 내부 스크립트나 파라미터 계산 방식이 드러나면 게임성을 떨어트린다고 생각합니다.

소스 공개의 목적이 게임 개발을 위한 것이지 게임 개조나 스크립트 공개를 위한 것이 아니기 때문입니다.

#119-2. 미르 2005/06/13 (Mon)
웁스...
제가 오해의 소지가 있게 글을 작성했었나 봅니다.
게임 개조나 스크립트 공개를 바라는것이 아니라
제가 접해본 적 있는 델파이 프로그램으로는
안영기님의 게임들밖에 기억나는게 없어서였구요.
사실 이 게임을 다시 해보면서 델파이에 대한 관심을 갖게된것이긴 합니다.
지금은 C, C++, Java, Python정도를 유져수준으로
다룰줄 아는데 델파이에 대한 호기심이
마구 생겨서 말이지요...어쩌면 옛날 어릴적
안영기님의 게임을 하면서부터 델파이에 대한 호감이 있었던걸지도 모른다는 생각도 합니다.

공부를 위해 가장 오래된, 안영기님의 처녀작들을
살펴보고 싶었을 분이였지욤~^^
기분나쁘셨다면 사과드립니다 푸힛


#118. 쉐용 [REPLY]
디버깅. 2005/06/07 (Tue)

온란겜 출시하고 젤 많이 부분이
디버깅에 대해서 였는데...
내가 모르는 이런 기능도 있었구나
하는점이 많았었어욤..
아직 배울건 넘흐넘흐 많다 라는
생각도 들구...

웹서핑 하는중에 괜찮은곳이
있어서 링크하나.

http://www.dasomnetwork.com/~leedw/mywiki/moin.cgi/VisualC_2b_2b_c6_c1_c1_f6_b5_b5?action=fullsearch&value=VisualC%2B%2B%C6%C1%C1%F6%B5%B5&literal=1&case=1

이곳이랑...
의외로 괜찮은걸 배울수 있었던
사이트 한곳..

http://cocoajk.ivyro.net/

여기 강좌 게시판이 좀 흥미롭더군요.

그럼...





#118-1. 안영기 2005/06/10 (Fri)

사실 구현보다 중요한 것이 디버깅이죠. 그리고 최종적인 S/W의 질을 평가하는 기중이기도 하고요. 위의 링크 덕분에 몰랐던 것도 많이 알게 되었습니다. 그래서 제가 쓰는 디버깅 팁 중에 하나를 말하자면...... (아래에 계속...)



보통 multi-platform에서 작업하다 보면 printf()와 관련된 문제를 만납니다. 특히 linux나 기타 embedded OS에서는 printf()가 콘솔로 찍히는데 반해, windows는 그렇지 않습니다. 그렇다고 #ifdef를 넣자니 소스가 지저분해지고.. 그래서 아래와 같은 코드를 만들어 쓰고 있습니다.

Setting에서 printf=__printf 로 해주면 모든 printf는 VC+의 디버깅 창에 찍힙니다.

------------------------------------
#include <windows.h>
#include <stdarg.h>
#include <stdio.h>

int __printf(const char *format, ...)
{
char outMsg[1024];
va_list marker;
int ret;

va_start(marker, format);
ret = vsprintf(outMsg, format, marker);
va_end(marker);

OutputDebugString(outMsg);

return ret;
}
------------------------------------


#113. 바람돌이 [REPLY]
struct 의 함수 포인터가 구조체 자신의 멤버를 참조 하기 위한 2005/04/12 (Tue)

안녕하세요

typedef struct _test_struct {
int aaa;
void (*out)(int,int);
}TEST_STRUCT;

TEST_STRUCT test_struct = {
0xffff,test_out
};



이러한 구조체가 있다고 했을때
함수포인터 void (*out)(int,int) 은 아래의 함수와 연결이 됩니다.

void
test_out(int a,int b)
{
TEST_STRUCT *self = &test_struct;
printf("%d\r\n",self->aaa);
}



제가 궁금한 점은 바로

TEST_STRUCT *self = &test_struct;

이 부분 입니다.
구조체 내의 함수포인터가 자신의 구조체내의
구조체 변수를 억세스 하는 방법을 억세스 하는 방법입니다.

예를 들면 C++ 클래스의 멤버 변수를 억세스 하는것처럼 C 로 구현 하는것입니다. 그러기 위해서는 저러한 번거러운 과정이 없었으면 합니다.
구조체가 선언 될때마다 함수 포인터의 구현 함수는 자동으로
자기 자신이 구현된 의 구조체 변수를 억세스 하는 방법이 없을까요?

오직 C로 구현 했으면 하는데.. 잘 생각이 안떠오르네요.. 에공.. OTL...

#113-1. 엘지뗄레꼼 2005/04/13 (Wed)
-_-;;
C의 스트럭쳐는 '데이타모음' 그 이상도 그 이하도 아닙니다.
정 간단히 하려면, 매크로로 하세요 -,.-
함수의 인수를 추가하던가요.

#113-2. 안영기 2005/04/13 (Wed)

typedef struct _test_struct {
    int aaa;
    void (*out)(void*, int,int);
} TEST_STRUCT;

TEST_STRUCT test_struct = {
    0xffff, test_out
};

void test_out(void* __this, int a,int b)
{
    TEST_STRUCT* _this = (TEST_STRUCT*)__this;
    printf("%d\r\n", _this->aaa);
}

이런 식으로 하는 방법 밖에는 없습니다.
this가 자동으로 들어가게 하려면 매크로를 써야 하고 상속을 받아서 확장하려면 역시 매크로를 써야 합니다. (virtual table이 붙으면 위와는 구현이 달라집니다) 혹시 구할 수있으시다면 microwin이란 것의 소스를 구해보세요. 거기에 보면 C로 C++의 거의 모든 것을 구현해 놓았습니다.

#113-3. 바람돌이 2005/04/13 (Wed)
캄솨합니다
^0^


#112. 그네고치기 [REPLY]
Interactive-Deeping A Star 알고리즘에 대하여... 2005/04/04 (Mon)

Interactive-Deeping A Star 알고리즘...
이것이 무슨 20년가까이 논의되었던 길찾기 알고리즘의 하나로서...
게임 프로그래밍에서 획기적 혁신을 불러일으킬 것이라는... -ㅅ-;

그런 수준까지의 기사만 발견하고, 정작 중요한 본문이나 그런 것을 찾을 수가 없더군요. "한국인 작품이라던데" 말입니다... -ㅅ-;;;

혹시 안영기님께서 이와 관련하여 뭔가... 들어보신 역사가 있으신지요?


추신. 다이렉트X9를 이용한 전략 게임 프로그래밍... 재미있더군요 :)

#112-1. 안영기 2005/04/05 (Tue)
그냥
A*아닐까요? 앞에 붙은 Interactive-Deeping은 마치 논문 쓸 때 자신이 개발한 알고리즘 앞에 붙이는 설명문(공식 명칭이 되기를 바라는)같은 느낌입니다. 20년 가까이 논의된 길찾기 알고리즘이라고 한 걸로 봐서도 A*인 것 같습니다.

아마 대부분의 게임 프로그래머라면 자신만의 A*에대한 변경 알고리즘을 가지고 있을 겁니다. 저의 경우에도 '그녀의 기사단'등에 쓰인 제너릭 A* 알고리즘 이후에 속도가 더 빠르고 효율이 좋은 알고리즘을 가지고 있습니다. 저는 이미 머리가 굳어 버려서 창조적인 생각을 못하는 것인지는 모르겠으나, A*는 어디까지나 A*일 뿐이라고 생각합니다. 이미 프로그래머들은 자신만의 A* 변형 알고리즘을 가지고 있을 것이므로 혁신과는 별로 상관없을 것 같아 보입니다. 전통적인 A*는 이론에만 충실한 것이기 때문에 실제 게임에서 속도를 내기 위해서는 변형이 불가피합니다. 그 변형 중의 하나가 위에 말한 그것이 아닐까요?

#112-2. 그네고치기 2005/04/07 (Thu)
아...
옙... 감사합니다.


#111. 전봉훈 [REPLY]
감사합니다.. 2005/03/15 (Tue)

글을 읽어보면 매일같은 야근에 잠까지 줄여가시면서 AVEJ를 제작하시는걸로 알고 있습니다만, 귀찮은 질문에 친절하게 답변해주셔서 몸둘바를 모르겠습니다. 늦었지만 결혼 축하드리고 행복하세요.^^


#110. 전봉훈 [REPLY]
죄송합니다만 한가지만 더 질문할게요. 2005/03/15 (Tue)

귀찮게 해드려서 죄송합니다만, 영기님의 소스중에 GetGlyph라는 함수가 있습니다. 보니까 글자 하나의 초중종성을 분리해 그것의 위치를 얻을때 쓰는데요.. 굳이 이 함수가 필요할까 하는 생각을 합니다. 이미 GetGlyphIndex에서 분리를 했는데, Rect를 얻기 위해서 한번 더 할 필요가 있을까요.

#110-1. 안영기 2005/03/15 (Tue)

GlyphIndex()는 순수하게 초,중,종성 분리만 하는 것입니다. 그런데 글자를 분리했으면 실제로 조합될 글자를 찾아야 합니다. 같은 'ㄱ'이라고 해도 '가거고구과궈각걱곡국곽궉'의 모든 글자의 'ㄱ'의 모양은 다릅니다. 그 모양은 중성의 종류에 따라 5개 이상으로 나누어 지고 종성의 여부에 따라 그 수의 2배로 늘어나게 됩니다. 이때의 정확한 글자를 찾는 과정이 GetGlyph()입니다.


#109. 전봉훈 [REPLY]
아아.. 글쓴김에 질문하나 해도 될까요. 2005/03/15 (Tue)

아직 제가 그것을 만들 필요성을 절실히 느끼지 못해.. 질문하지 않았던 것인데요. 안영기님의 조합형 폰트셋으로 출력하는 소스에서 INCOMPLETE_TABLE 이란건 ㄱ,ㄴ,ㄷ,ㅏ,ㅑ,ㅓ 처럼 따로따로 띄어져있는 테이블이란건 알고있습니다. 그런데 그 밑에 CONVERT_TABLE은 무엇에 쓰는 테이블인지 알고싶습니다.

#109-1. 안영기 2005/03/15 (Tue)

제가 만든 조합형 출력 루틴은 Unicode(KSC5700)를 입력 받도록 되어 있습니다. 그런데 각각의 자모는 조합형으로 출력을 하도록 되어 있습니다. 그래서 unicode로 들어 온 입력을 초,중,종성으로 분리 한 후 그 것을 조합형의 초,중,종성으로 바꾸는 테이블이 바로 CONVERT_TABLE입니다.


#108. 전봉훈 [REPLY]
저 밑에 있는 말 중에.. 2005/03/15 (Tue)

안녕하세요. 가끔씩 와서 보고 있다가 처음 글을 쓰네요.. 저는 C++를 10년동안 했습니다. (제대로 한게 아니라 실력은 형편없습니다.. STL도 아직 안써봤구요..) 그러다가 델파이로 바꾼지 3개월정도 되었습니다. C++ 하던게 있어서 그런지 문법 적응하는데 걸린 시간만 빼고.. 예전에 C++ 쓰던것만큼 델파이를 쓰게 되었습니다. 제가 델파이로 바꾼 이유는.. C#으로 바꾸려고 하는 도중에, 선배가 델파이를 강력 추천했었고, 항상 C의 &&이나 { }, * 이런 기호들을 굉장히 싫어했었거든요. 그에 반해 Delphi의 문자들은 정말 예뻤던 것입니다.. 그런데 밑에 용맨소녀님의 글중에 '게임업계로 들어가려면 무조건 C를 해라' 라고 하신 글이 있는데, 저로선 정말 혼란스럽기 그지없습니다. 전 GW-BASIC 할때부터 오로지 게임밖에 안 만들었었거든요.....델파이는 결국 안되는건가요??? 전 현재 델파이가 너무 좋습니다.

그리고 또 하나 생각을 해봤는데.. 만약에 MS에서 Visual Pascal 같은 언어를 만들게 된다면 어떻게 될지 궁금합니다. 볼랜드는 망할까요?

두가지에 대한 영기님의 의견을 듣고 싶습니다.

#108-1. namu 2005/03/15 (Tue)
그냥 저두 게임일을하고있어서 생각을 말씀드릴게요
일단 간단하게 말씀드릴게요
델파이가 않된다기보단 델파이를 사용해서 프로젝트를 하는곳이 거의 없기때문에 델파이 사용자라고 하면 뽑지않게되는게 정상이죠. 회사입장에서는 그사람이 프로젝트를 마치고나가면
그작업물이 그회사의 재산인데 델파이를 이용한 프로젝트가되버리면 후임도 델파이 사용자가 되어야하고 이런것들이 낭비라고 생각할수밖에없는거죠 델파이로하는걸 C로 못할리도없고 왜그런지 모르지만 우리나라에선 C언어가 접하기 쉬워서인지 어떤지 C사용자가 압도적이라는거죠 마소가 그런걸 만든다고해서 볼랜드가 쉽게 망하리라볼수없는거같네요 국외엔 사용자도 그럭저럭많은거같고 대부분 아주 즐겁게 빠져있는사람들이 많아서 일종의 팬이란기분..=ㅂ = 마소는 정이않가는 타입이죠

#108-2. 안영기 2005/03/15 (Tue)
저도 namu님과 같은 의견입니다.
게임 업계에서는 대부분의 개발자가 C, C++을 사용하고 있고, 따라서 개발자 개인의 개발 취향의 문제가 아니라 공용 코드의 유지 보수나 개선 등의 문제가 생기게 됩니다.

저도 델파이를 좋아 합니다만 실제로 하는 일(밥 먹고 사는 일)은 C++ 개발자입니다. 자신이 좋아하는 것을 하는 것이 '직업'은 아니므로 델파이를 하시더라도 C++은 놓지 않으시기 바랍니다. 그리고 두 가지 언어를 동시에 할 줄 안다는 것은 다른 사람에 비해 큰 장점이 됩니다.


[PREV] [1][2][3][4][5][6][7] [NEXT]


IRiS nX by NvyU =starry scape=