Spiele-Programmierung
-
Hi!
Wie der Titel schon aussagt ich möchte gerne erlernen wie man Spiele Programmiert.
Ich habe Grundkenntnisse in C++ Konsolen-Anwendungen und kenn' mich ein bisschen in der WinApi aus. Nun habe ich mich ein bisschen umgeschaut was man so brauch außer einem Compieler und bin auf die DirectX und OpenGL gestoßen. Also um mal auf den Punkt zu kommen: Ich habe mir das DirectX SDK herruntergeladen und versuche gerade irgendwie das in MS Visul C++ 2008 Express einzubinden. Doch irgendwie kapier ich nicht wie das geht. Habe auch schon gegooglet aber nichts gefunden...
Also mein Code ist:[code]// DirectX.cpp : Definiert den Einstiegspunkt für die Anwendung. // #include "stdafx.h" #include "DirectX.h" #define MAX_LOADSTRING 100 // Globale Variablen: HINSTANCE hInst; // Aktuelle Instanz TCHAR szTitle[MAX_LOADSTRING]; // Titelleistentext TCHAR szWindowClass[MAX_LOADSTRING]; // Klassenname des Hauptfensters // Vorwärtsdeklarationen der in diesem Codemodul enthaltenen Funktionen: ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: Hier Code einfügen. MSG msg; HACCEL hAccelTable; // Globale Zeichenfolgen initialisieren LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_DIRECTX, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); // Anwendungsinitialisierung ausführen: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_DIRECTX)); // Hauptnachrichtenschleife: while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int) msg.wParam; } // // FUNKTION: MyRegisterClass() // // ZWECK: Registriert die Fensterklasse. // // KOMMENTARE: // // Sie müssen die Funktion verwenden, wenn Sie möchten, dass der Code // mit Win32-Systemen kompatibel ist, bevor die RegisterClassEx-Funktion // zu Windows 95 hinzugefügt wurde. Der Aufruf der Funktion ist wichtig, // damit die kleinen Symbole, die mit der Anwendung verknüpft sind, // richtig formatiert werden. // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_DIRECTX)); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = MAKEINTRESOURCE(IDC_DIRECTX); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassEx(&wcex); } // // FUNKTION: InitInstance(HINSTANCE, int) // // ZWECK: Speichert das Instanzenhandle und erstellt das Hauptfenster. // // KOMMENTARE: // // In dieser Funktion wird das Instanzenhandle in einer globalen Variablen gespeichert, und das // Hauptprogrammfenster wird erstellt und angezeigt. // BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; hInst = hInstance; // Instanzenhandle in der globalen Variablen speichern hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } // // FUNKTION: WndProc(HWND, UINT, WPARAM, LPARAM) // // ZWECK: Verarbeitet Meldungen vom Hauptfenster. // // WM_COMMAND - Verarbeiten des Anwendungsmenüs // WM_PAINT - Zeichnen des Hauptfensters // WM_DESTROY - Beenden-Meldung anzeigen und zurückgeben // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; switch (message) { case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Menüauswahl bearbeiten: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // TODO: Hier den Zeichnungscode hinzufügen. EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // Meldungshandler für Infofeld. INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE; }[/code]
Also noch gar nichts was irgendwas mit DirectX zu tuen hat(Allerdings habe ich irgendwie mit dem Pfad der lib's den Linker Error weggemacht)
Das ergab bei dem Quelltext das:>------ Erstellen gestartet: Projekt: DirectX, Konfiguration: Debug Win32 ------ 1>Verknüpfen... 1>LINK : fatal error LNK1104: Datei "C:\Programme\Microsoft.obj" kann nicht geöffnet werden. 1>Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\***********\Eigene Dateien\Visual Studio 2008\Projects\DirectX\DirectX\Debug\BuildLog.htm" gespeichert. 1>DirectX - 1 Fehler, 0 Warnung(en) ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========Meine Frage ist nun wie binde ich das richtig in MSVC++ 2008 ein und wie ich das dann erlernen soll...(Ich habe ein paar Tutorials gefunden kan ich die nehmen?)
[code]
-
also theoretisch musst du einfach nur eine win32 anwendung unter visual c++ 2008 erstellen und die dateien dem projekt hinzufügen (wobei die datei sehr stark nach einer automatisch generierten datei aussieht)
und alles andere sollte an sich automatisch klappen
könnte sein dass du noch probleme wegen unicode bekommst
aber das kannst du unter projekteigenschaften irgendwo abschalten...
-
cobra11freak schrieb:
1>LINK : fatal error LNK1104: Datei "C:\Programme\Microsoft.obj" kann nicht geöffnet werden.
Da muss wohl irgendein Pfad, der ein Leerzeichen enthält, in Anführungszeichen gesetzt werden.
-
wenn du vista nutzt hast du ggf. das Problem, dass der programme ordner eigentlich "program files" heißt und nur gemapt wird. Das perfide daran ist, dass selbst die Vista-Boardmittel(notepad, explorer) damit nicht klar kommen..
-
Ja mir ist klar das ich ne Win32 Anwendung erstellen muss

Ich weiß nur nicht wie ich die lib's Linke mit Visual C++ 2008 ,da ich voher mit Dev-C++ gearbeitet habe.
Da ging das wenn die .lib im Standard-Libary Verzeichniss ist so:
Projekt-->Projekt Eigenschaften -->Parermeter -->und bei Linker dann -l und dann den Dateinamen von der Libary.Aber danke für die Antworten...
PS:Bitte sagt mir noch wie ich DirectX erlernen soll. C++ kann ich bereits(Also ich weiß was Arrays, Pointer und Objektorientierte Programmierung ist)
Aber von "Matritzen" habe ich zB noch nie was gehört...
(Vieleicht liegt das daran das ich nicht besonders gut in Mathe bin
)MfG cobra11freak
-
DocJunioR schrieb:
wenn du vista nutzt hast du ggf. das Problem, dass der programme ordner eigentlich "program files" heißt und nur gemapt wird. Das perfide daran ist, dass selbst die Vista-Boardmittel(notepad, explorer) damit nicht klar kommen..
AFAIK heisst der unter Vista "Programs"
-
allgemeiner rat: bevor man einfach anfängt grafik programmierung im trial & error zu erlernen sollte man sich mal die grundlegenden technologien anschauen. das erspart einem extrem viel ärger, da die directx-api definitiv für leute geschrieben ist, die diese technologien beherrschen.
will man also z.b. 2d programmieren (was sich für den anfang anbietet - 3d ist ungemein komplexer und aufwändiger... man will ja sicher erstmal ein schnelles ergebnis), so sollte man sich erstmal die konzepte multi buffering und page flipping anschauen. wenn man da durchsteigt dann hat man schonmal ne idee wo es langgeht.
des weiteren empfiehlt sich, für eine reine 2d anwendung NICHT c++ und directX zu verwenden, da diese technologien stark veraltet und äußerst umständlich und aufwändig zu verwenden sind.
in java z.b. hättest du maximal die hälfte an code zu schreiben (directx fehlerbehandlung = ganzganz schrecklich) und moderne computer sind schnell genug, 2d animationen die eine vm erzeugt flüssig darzustellen. auch python und c# sollen wohl ganz gute bibliotheken für grafik haben.hier mal ein paar extrem nützliche links für java:
http://java.sun.com/docs/books/tutorial/extra/fullscreen/doublebuf.html
http://java.sun.com/docs/books/tutorial/extra/fullscreen/exclusivemode.html
http://www.javalobby.org/articles/ultimate-image/ (ein bischen runterscrollen)darin hat man alles, was man braucht um direkt mit 2d grafik loszulegen
2d sollte man beherrschen, bevor man an 3d geht, sonst muss man doppelt lernen und hat viel frust

ich hoffe, ich konnte ein wenig helfen

-
He *lol*!
Du bist ja wie mein Kumpel, der erzählt auch immer wie "Toll" java ist.
Ich will aber nicht Java lernen sondern mit C++ und DirectX meine Spiele Programmieren und übriegens hatte ich auch nicht vor gleich 3D Spiele zu Programmieren.:)
Warum: Weil ich C++ bereits kann!MfG cobra11freak
-
Mit C++ kann man sehr wohl einfache, performante und auch noch gute kleine Spiele entwickeln. Für die 2D-Grafikprogrammierung rate ich dir unbedingt zu der Grafikbibliothek SFML, die relativ neu ist. Ich habe vor einigen Monaten damit angefangen und habe sehr gute Erfahrungen gemacht. Sie ist wirklich relativ einfach zu handhaben, bietet sehr viele Funktionen und ist auch noch ziemlich schnell. Auf der Seite http://www.sfml-dev.org/ kannst du die Bibliothek downloaden, und dort gibt es auch Tutorials für den Einstieg und ein Forum.
-
Tag nochmal!
SFML klingt ganz gut für 2D spiele aber ist der Eistieg in DirectX dann einfacher?
Also ich kann mir das nicht vorstellen!(Aber es kann ja sein)
Aber es muss doch trotzdem machbar sein DirectX in MSVC++ 2008 einzubinden.
Es muss doch irgendjemanden geben der das schon mal gemacht hat.
Und dann wüsste ich immer noch gerne wie ich das erlernen soll.
Auf jeden fall downloade ich mir mal dieses SFML.MfG cobra11freak
-
cobra11freak schrieb:
Und dann wüsste ich immer noch gerne wie ich das erlernen soll.
parallel Dokumentation lesen, Artikel über DirectX, ein Buch und nebenbei Testprojekte schreiben. Artikel z.B. auch wie der Weg von 3D zu 2D funktioniert. Dann die ganze Reihe der bekannten Clone nachbauen: Pong, Snake, Tetris, Asteroids. Es kann auch nicht schaden immer wieder die entsprechenden dazu benötigten Techniken genauer durchleuchten (z.B. Wikipedia-Artikel)
Man lernt durch Wiederholung.
-
cobra11freak schrieb:
SFML klingt ganz gut für 2D spiele aber ist der Eistieg in DirectX dann einfacher?
Also ich kann mir das nicht vorstellen!(Aber es kann ja sein)Ganz bestimmt. Nur schon, weil du dann besser verstehst, wie überhaupt etwas auf dem Bildschirm gezeichnet wird. DirectX baut allerdings nicht direkt auf SFML auf, du wirst also nicht darum herum kommen, vieles neu zu lernen und dich umzugewöhnen. Trotzdem finde ich es ratsam, am Anfang kleine 2D-Spiele selber zu programmieren. Dann repetierst du auch gleich die Grundlagen von C++ und lernst immer dazu. Aber auch Grundlagen der Grafikprogrammierung sind sicher von Nutzen. Als krönenden Abschluss kannst du ja ein eigenes kleines Jump'n'Run implementieren, dann fühlst du dich auch gleich viel sicherer

Das Wichtigste ist allerdings, nichts zu überstürzen. Mach die Tutorials aufmerksam durch, erstelle Fenster, zeichne Sprites, lass sie rotieren und verfärben, und lerne immer mehr dazu. Mit grösseren Projekten wirst du auch vermehrt wieder die C++-Standardbibliothek und Grundlagen der Sprache benötigen; du wirst dir auch Überlegungen zum Design und zur Strukturierung der Spiele anstellen müssen, und so wird dein Wissen wiederum erweitert. Alles Dinge, die dir bei DirectX sicherlich helfen werden.
Auf jeden Fall viel Spass beim Programmieren

-
Hi cobra11freak,
also DirectX im Selbstversuch zu lernen halte ich dann doch für extrem schwierig.

Ich kann Dir mal folgendes Buch von André Lamothe empfehlen:
Dort wird alles beschrieben was man für ein 2D-Game benötigt.
Viel Spaß
HeckyDA
-
Ich habe mal diese SFML Tutorials angeschaut. Macht einen interessanten Eindruck. Hat jemand damit ein komplexes 2D-Spiel gebaut? Links zu Bildern?
-
Beim offiziellen SFML-Forum gibt es einen Bereich für Projekte:
http://www.sfml-dev.org/forum/viewforum.php?f=10&sid=b9102e8bbfcbe58fc79311a4f312a7c8
-
Danke für alle Antworten!
Ich müsste aber trotzdem wissen wie ich DirectX in MSVC++ 2008 einbinde, da ich damit sonst gar nichts machen kann :).
Ist doch irgenwie Logisch...

(SFML bekomme ich schon hin)
-
cobra11freak schrieb:
Aber von "Matritzen" habe ich zB noch nie was gehört...
(Vieleicht liegt das daran das ich nicht besonders gut in Mathe bin
)Dann fang erst mal damit an, dass du in mathe gut wirsd. Ohne ausreichende Mathematikkentnisse wirsd du nie auch nur ansatzweise Spiele programmieren können. Egal ob 2D oder 3D, Mathe ist überall NOTWENDIG.
-
Learning by doing... lasst ihn doch.
-
ceplusplus@loggedoff schrieb:
Learning by doing... lasst ihn doch.
bin auch der meinung. jeder soll es probieren, irgendwann wird man beim programmieren doch bei mathe landen und weil es keine trockene theorie ist, merkt man es vielleicht garnicht und hat spass

-
So ich habe mir jezt dieses SFML runtergeladen...
Ich habe es wieder in Visual C++ 2008 eingebunden, das klappt aber nicht...
(Natürlich habe ich die Libary's eingebunden und die Include Verzeichnisse von SFML)
Mein einfacher Quelltext:#include "stdafx.h" #include "SFML.h" #include <SFML/Window.hpp> int main() { sf::Window App(sf::VideoMode(800, 600, 32), "SFML Window"); bool Running = true; while (Running) { App.Display(); } return EXIT_SUCCESS; }Das Erbgebnis:
1>------ Erstellen gestartet: Projekt: SFML, Konfiguration: Debug Win32 ------ 1>Kompilieren... 1>SFML.cpp 1>Ressourcen werden kompiliert... 1>Microsoft (R) Windows (R) Resource Compiler Version 6.0.5724.0 1>Copyright (C) Microsoft Corporation. All rights reserved. 1>Manifest in Ressourcen wird kompiliert... 1>Microsoft (R) Windows (R) Resource Compiler Version 6.0.5724.0 1>Copyright (C) Microsoft Corporation. All rights reserved. 1>Verknüpfen... 1>SFML.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: virtual __thiscall sf::Window::~Window(void)" (??1Window@sf@@UAE@XZ)" in Funktion "_main". 1>SFML.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: void __thiscall sf::Window::Display(void)" (?Display@Window@sf@@QAEXXZ)" in Funktion "_main". 1>SFML.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall sf::Window::Window(class sf::VideoMode,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,unsigned long,struct sf::WindowSettings const &)" (??0Window@sf@@QAE@VVideoMode@1@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KABUWindowSettings@1@@Z)" in Funktion "_main". 1>SFML.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall sf::VideoMode::VideoMode(unsigned int,unsigned int,unsigned int)" (??0VideoMode@sf@@QAE@III@Z)" in Funktion "_main". 1>MSVCRTD.lib(crtexew.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_WinMain@16" in Funktion "___tmainCRTStartup". 1>C:\Dokumente und Einstellungen\Vincent-Silver\Eigene Dateien\Visual Studio 2008\Projects\SFML\Debug\SFML.exe : fatal error LNK1120: 5 nicht aufgelöste externe Verweise. 1>Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\Vincent-Silver\Eigene Dateien\Visual Studio 2008\Projects\SFML\SFML\Debug\BuildLog.htm" gespeichert. 1>SFML - 6 Fehler, 0 Warnung(en) ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========Bitte helft mir mal, ich scheck das nicht mit Visual C++ 2008

-
omg, das forum :o
gibt's bei dir auch eine
WinMain()?
