3D-Games über C/C++ und DirectX9
lima-city → Forum → Programmiersprachen → C/C++ und D
beispiel
borland
break
buffer
builder
compiler
eins
erfahrung
fenster
komponente
message
null
owner
personal
pragma
release
right
sample
sender
tutorial
-
Was haltet ihr von der programmierung von 3D-Spielen in Visual C++ und DirectX9. Habt ihr eventuell schon erfahrungen damit gesammelt, oder kann man sich diese irgendwo im Netz als Open-Source mal anschauen?
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Was man davon halten soll ja hmmm ... schwere Frage. Ja Toll! Gute Idee! Aber mal ehrlich was soll man davon halten? Es is mittlerweile ein Standart, VC++ und DirectX.(unter Win)
Ich hab schon bissel Erfahrung gesammelt zwar nicht mit DX in Verbindung mit VC++ aber mit BCB und ich sag dir es ist ne Heidenarbeit. Nur die Visuellen Aspekte hinzubekommen dauert und dann noch Bewegung, Kollisionsabfrage, etc. das ist echt ne harte Nuss. Wenn man aber Zeit und Lust hat kann man sich dran versuchen oder man benutzt einfach eine Freeware Engine oder bestimmte Komponenten z.B.: Engine - Genesis3D oder bei Komponente (F?r Delphi z.B. lassen sich aber auch bei BCB einbinden) DelphiX. Und ach ja B?cher! Zu dem Thema sollte man sich 2 oder 3 B?cher besorgen und gr?ndlich durcharbeiten dann wird?s vielleicht was.
Beispiele und Erkl?rung bekommt man auch wenn man sich das DirectX- SDK holt und im Inet gibt es genug Beispiele und Infos dazu.
Hier mal ein kleines Beispiel f?r DirectDraw unter BCB sprich das einfachste was man so damit Zaubern kann:
/*Fenster wird erzeugt und auf diesem Fenster soll ein Kreis von links nach rechts bewegt werden und umgekehrt. Die Animation wird mit F3 gestartet und mit ESC/F12 beendet.*/
#include <vcl.h>
#include <ddraw.h>
#pragma hdrstop
#include "Main.h"
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
lpDD = NULL;
FPhase = 0;
FActive = False;
FrontMsg = "Front buffer (F12 or Esc to quit)";
BackMsg = "Back buffer (F12 or Esc to quit)";
FShapeRect = Rect(25, 25, 50, 50);
FValueAdd = 2;
}
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
if(lpDD != NULL)
{
if(lpDDSPrimary != NULL)
{
lpDDSPrimary->Release();
lpDDSPrimary = NULL;
}
lpDD->Release();
lpDD = NULL;
}
}
void __fastcall TForm1::Start()
{
HRESULT ddrval;
DDSURFACEDESC ddsd;
DDSCAPS ddscaps;
HDC DC;
char buf[256];
ddrval = DirectDrawCreate(NULL, &lpDD, NULL);
if(ddrval == DD_OK)
{
ddrval = lpDD->SetCooperativeLevel(Handle,
DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
if(ddrval == DD_OK)
{
ddrval = lpDD->SetDisplayMode(640, 480, 8);
if(ddrval == DD_OK)
{
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |
DDSCAPS_FLIP |
DDSCAPS_COMPLEX;
ddsd.dwBackBufferCount = 1;
ddrval = lpDD->CreateSurface(&ddsd, &lpDDSPrimary, NULL);
if(ddrval == DD_OK)
{
ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
ddrval = lpDDSPrimary->GetAttachedSurface(&ddscaps,
&lpDDSBack);
if(ddrval == DD_OK)
{
if (lpDDSPrimary->GetDC(&DC) == DD_OK)
{
SetBkColor(DC, RGB(0, 0, 255));
SetTextColor(DC, RGB(255, 255, 0));
TextOut(DC, 0, 0, FrontMsg.c_str(), FrontMsg.Length());
lpDDSPrimary->ReleaseDC(DC);
}
if (lpDDSBack->GetDC(&DC) == DD_OK)
{
SetBkColor(DC, RGB(0, 0, 255));
SetTextColor(DC, RGB(255, 255, 0));
TextOut(DC, 0, 0, BackMsg.c_str(), BackMsg.Length());
lpDDSBack->ReleaseDC(DC);
}
PostMessage(Handle, WM_RUNAPP, 0, 0);
return;
}
}
}
}
}
wsprintf(buf, "Direct Draw Init Failed (%08lx)\n", ddrval);
MessageBox(Handle, buf, "ERROR", MB_OK);
Close();
}
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
switch (Key)
{
case VK_F3:
FActive = True;
Start();
break;
case VK_ESCAPE:
case VK_F12:
FActive = False;
Close();
break;
}
}
void __fastcall TForm1::FormPaint(TObject *Sender)
{
RECT rc;
SIZE size;
char szMsg[] = "Page Flipping Test: Press F3 to start, F12 or Esc to exit";
if (!FActive)
{
HDC DC = GetDC(Handle);
rc = GetClientRect();
GetTextExtentPoint(DC, szMsg, lstrlen(szMsg), &size);
SetBkColor(DC, RGB(0, 0, 0));
SetTextColor(DC, RGB(255, 255, 0));
TextOut(DC, (rc.right - size.cx)/2, (rc.bottom - size.cy)/2,
szMsg, sizeof(szMsg)-1);
ReleaseDC(Handle, DC);
}
}
void TForm1::Run(TMessage &Message)
{
do
{
Timer1Timer(NULL);
Application->ProcessMessages();
}
while (FActive);
}
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
HDC DC;
if (lpDDSBack->GetDC(&DC) == DD_OK)
{
DrawShape(DC);
lpDDSBack->ReleaseDC(DC);
}
while(1)
{
HRESULT ddrval;
ddrval = lpDDSPrimary->Flip(NULL, 0);
if(ddrval == DD_OK)
break;
if(ddrval == DDERR_SURFACELOST)
{
ddrval = lpDDSPrimary->Restore();
if(ddrval != DD_OK)
break;
}
if(ddrval != DDERR_WASSTILLDRAWING)
{
FActive = False;
Close();
}
}
}
void TForm1::DrawShape(HDC &DC)
{
HBRUSH Brush, OldBrush;
Brush = CreateSolidBrush(RGB(0, 0, 0));
OldBrush = (HBRUSH)SelectObject(DC, Brush);
Ellipse(DC, FShapeRect.left - FValueAdd, FShapeRect.top,
FShapeRect.right - FValueAdd, FShapeRect.bottom);
SelectObject(DC, OldBrush);
DeleteObject(Brush);
FShapeRect.left += FValueAdd;
FShapeRect.right += FValueAdd;
if (FShapeRect.right > 637)
{
FValueAdd = -2;
}
if (FShapeRect.left < 3)
{
FValueAdd = 2;
}
Brush = CreateSolidBrush(RGB(0, 255, 0));
OldBrush = (HBRUSH)SelectObject(DC, Brush);
Ellipse(DC, FShapeRect.left, FShapeRect.top, FShapeRect.right, FShapeRect.bottom);
SelectObject(DC, OldBrush);
DeleteObject(Brush);
}
Aso noch der Header:
#ifndef MainH
#define MainH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Menus.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
#define WM_RUNAPP WM_USER
class TForm1 : public TForm
{
__published:
void __fastcall FormDestroy(TObject *Sender);
void __fastcall FormKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift);
void __fastcall FormPaint(TObject *Sender);
void __fastcall Timer1Timer(TObject *Sender);
private:
LPDIRECTDRAW lpDD; // DirectDraw object
LPDIRECTDRAWSURFACE lpDDSPrimary; // DirectDraw primary surface
LPDIRECTDRAWSURFACE lpDDSBack; // DirectDraw back surface
BOOL FActive; // is application active?
BYTE FPhase;
RECT FShapeRect;
int FValueAdd;
AnsiString FrontMsg;
AnsiString BackMsg;
void __fastcall Start();
MESSAGE void Run(TMessage &Message);
void DrawShape(HDC &DC);
public:
__fastcall TForm1(TComponent* Owner);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_RUNAPP, TMessage, Run);
END_MESSAGE_MAP(TForm);
};
//---------------------------------------------------------------------------
extern TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Beitrag ge?ndert am 17.08.2005 23:31 von funkdoobiest -
Nur mal so nebenbei:
Gibtes eigentlich ein Buch ?ber C++ und DirectX 9, das nicht Visual C++ als Compiler verwendet? -
Nur mal so nebenbei:
Gibtes eigentlich ein Buch ?ber C++ und DirectX 9, das nicht Visual C++ als Compiler verwendet?
Ja Es gibt auch B?cher ?ber Delphi und ich glaub DirectX 8 war das dann wird es f?r 9 bestimmt auch irgendwann eins geben :). -
Wow, hier gibt's Leute die von DirectX in Verbindung mit Borland C++ Builder Erfahrung haben. Genau das was ich suche!
Ich versuche gerade das AMCap-Example (Beispiel f?r eine DirectShow-Anwendung) aus dem DirectX 9.0 - SDK mit dem "Borland C++ Builder Personal 6.0" zu compilieren. Bisher leider ohne Erfolg.
Ich habe einige Links im I-Net gefunden, die auf das Tool vctobpr.exe verweisen. Leider ist das nicht in meiner Version vom Builder zu finden und h?ndisch habe ich es noch nicht geschafft die Sourcen und den Builder so einzustellen, dass ich das AMCap-Sample compilieren kann. Das Problem hat seinen Ursprung in der Kompilierung Baseclasses, soweit ich das Erkennen kann. Die Baseclasses sind eine Art Hilfsmodule um die Filter aus DirectShow komfortabler zu steuern. Diese Hilfsmodule(Baseclasses) werden von dem AMCap-Sample verwendet und m?ssen deshalb vor der Kompilierung des AMCap-Samples schon zu einer Bibliothek (*.lib-Datei) kompiliert sein. Das klappt bei mir leider nicht.
Ich habe schon andere simplere Beispiele f?r DirectX im Builder erstellt, aber das Baseclasses-Beispiel verlangt wohl gr??ere Kenntnisse bei der Konvertierung eines MSVC-Projekts in ein BCB-Projekt... Vielleicht kann mir ein Download-Link zum vctobpr.exe-Tool schon weiterhelfen...bzw. weiss jemand in welcher Version des BCB diese Konvertierungs-Tool vorhanden ist? In der Personal-Edition von BCB 6.0 ist es leider nicht mehr vorhanden, obwohl es noch in den Hilfedateien erw?hnt wird...
Wenn jemand irgendwelche Tipps/Links hat w?re ich sehr dankbar.
Gr??e
Talpa
-
Die meisten B?cher lehnen sich an C/C++ an, nicht aber direkt an einen Compiler. Ich habe schon Codes aus B?chern erfolgreich unter DevCpp kompiliert. C/C++ ist die Beste wahl f?r 3D-Spiele, man braucht aber l?ngere Zeit um selbst?ndig etwas in 3D entwicklen zu k?nnen und f?r ein komplettes Spiel braucht man mehrere Jahre, vor allem alleine. (aus diesem Grund habe ich damit aufgeh?rt).
Es gibt zwar auch Engines, die man mithilfe von Tutorials f?r C/C++, Java, Delphi nutzen lernen kann, aber ein Buch ist allemal besser zum lernen. C/C++ ist im Gegensatz zu Delphi zwar etwas schneller, habe aber auch mal unter Delphi mit DirectX in 3D programmiert. Ein gutes Buch ist glaub von Martin Pykar (oder so) und hei?t "3D Programming mit DirectX unter Delphi" oder so ?hnlich (finds grad nicht, sonst k?nnte cih naschauen). -
nuja is nett grad das einfachste aber macht echt spa? an sowas zu arbeiten aber habs aufgegeben wurde dann irgentwann zu langweilig jetzt arbeitet en Kumpel an meiner arbeit weiter wir machen das so als Hobby
-
Also ich finde DirectX gut, aber am Besten ist OPENGL!!! Ihr findet unter Tutorials hier bei Lima-City unter C++ meine 2 Tutorials zu OpenGL. DirectX ist viel zu un?bersichtlich, um damit zu programmieren...
-
Also ich finde DirectX gut, aber am Besten ist OPENGL!!! Ihr findet unter Tutorials hier bei Lima-City unter C++ meine 2 Tutorials zu OpenGL. DirectX ist viel zu un?bersichtlich, um damit zu programmieren...
Find ich nicht ich benutze zB: Delphi + DelphiX Komponente ist sehr einfach ?ber initaliesirung etc. muss man sich kein Kopf machen. Unter C++ Builder kann man diese auch benutzen. Und mit Direct X direckt hab ich auch schon gearbeitet und find es sehr ?bersichtlich. Deine Tuts sind echt toll aber ich bevorzuge doch eher ein gutese Buch gerade wenn es um sowas geht. -
Find ich nicht ich benutze zB: Delphi + DelphiX Komponente ist sehr einfach ?ber initaliesirung etc. muss man sich kein Kopf machen. Unter C++ Builder kann man diese auch benutzen. Und mit Direct X direckt hab ich auch schon gearbeitet und find es sehr ?bersichtlich. Deine Tuts sind echt toll aber ich bevorzuge doch eher ein gutese Buch gerade wenn es um sowas geht.
Danke, danke.
Ich schreibe gerade ein Buch ?ber "Spieleprogrammierung in C/C++ mit OpenGL" und das Tutorial wird ja immernoch fortgesetzt. Bei OpenGL gibt es keine XSCREEN und tausende andere Classen dazu. Da gibt es nur ein paar Variablen und das wars auch. OpenGL kann man auch besser einstellen und es wird nicht so oft aktualisiert, wie DirectX. Also wenn ihr mich fragt, OpenGL!! -
Ich bin auch f?r OpenGL, weil es einfach besser ist, nicht zu schweeeeeeeerrr
manchmal kommen ja auch bei DirectX Variablen dazu
OpenGL ist f?r den Einsteiger auch gut.
THX
LINUX-HACKER -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage