In die Spieleprogrammierung einsteigen

KROKvsKROK schrieb:
Wenn man mit der Spieleprogrammierung anfangen will, dann sollte man bereits auf jedenfall schon programmieren können und wissen wie man z.B. ein Fenster erstellt.

Ok, ich bitte um Handzeichen, wer hier schonmal ein Fenster ohne irgendeine Bibliothek, Klassenwrapper, Framework oder sonstiges, nur unter Verwendung der Win32-API auf den Bildschirm zeichnen lassen hat.
Jetzt die Hand oben behalten, wer denkt, das müsste man wissen, wenn man mit Spieleprogrammierung anfängt.

Niemand? Dachte ich mir.

Code:
/*

  WINHELLO.C
  ==========
  (c) Paul Griffiths 1999
  Email: mail@paulgriffiths.net

  "Hello, world!", Win32 style.

*/

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);


/*  WinMain(), our entry point  */

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
		   LPSTR szCmdLine, int iCmdShow) {
    static char szAppName[] = "winhello";
    HWND        hwnd;
    MSG         msg;
    WNDCLASSEX  wndclass;


    /*  Fill in WNDCLASSEX struct members  */

    wndclass.cbSize         = sizeof(wndclass);
    wndclass.style          = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc    = WndProc;
    wndclass.cbClsExtra     = 0;
    wndclass.cbWndExtra     = 0;
    wndclass.hInstance      = hInstance;
    wndclass.hIcon          = LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hIconSm        = LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground  = (HBRUSH) GetStockObject(WHITE_BRUSH);
    wndclass.lpszClassName  = szAppName;
    wndclass.lpszMenuName   = NULL;

    
    /*  Register a new window class with Windows  */

    RegisterClassEx(&wndclass);


    /*  Create a window based on our new class  */

    hwnd = CreateWindow(szAppName, TEXT("Hello, world!"),
			WS_OVERLAPPEDWINDOW,
			CW_USEDEFAULT, CW_USEDEFAULT,
			CW_USEDEFAULT, CW_USEDEFAULT,
			NULL, NULL, hInstance, NULL);


    /*  Show and update our window  */

    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);


    /*  Retrieve and process messages until we get WM_QUIT  */

    while ( GetMessage(&msg, NULL, 0, 0) ) {
	TranslateMessage(&msg);    /*  for certain keyboard messages  */
	DispatchMessage(&msg);     /*  send message to WndProc        */
    } 


    /*  Exit with status specified in WM_QUIT message  */

    return msg.wParam;
}


/*  Window procedure  */

LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) {
    PAINTSTRUCT ps;
    HDC         hdc;

    
    /*  Switch according to what type of message we have received  */

    switch ( iMsg ) {
    case WM_PAINT:

	/*  We receive WM_PAINT every time window is updated  */

	hdc = BeginPaint(hwnd, &ps);
	TextOut(hdc, 100, 100, TEXT("Hello, world!"), 13);
	EndPaint(hwnd, &ps);
	return 0;

    case WM_DESTROY:

	/*  Window has been destroyed, so exit cleanly  */

	PostQuitMessage(0);
	return 0;
    }


    /*  Send any messages we don't handle to default window procedure  */
    
    return DefWindowProc(hwnd, iMsg, wParam, lParam);
}
 
Zuletzt bearbeitet: (Unicodemakro ergänzt, für so modernen Schnickschnack wie NT)
Trotzdem musst du programmieren können. Bin da auch kein Experte, aber Editoren nehmen dir nicht alles ab.
Noch wichtiger ist Lineare Algebra und die Algorithmen dazu. Alles in allem nennt sich das Computergrafik.

http://www.amazon.de/Computergrafik...qid=1395258883&sr=8-1&keywords=computergrafik

Man muss eben wissen wie das auf der GPU abläuft um die entsprechenden Dinge anpassen zu können!
Und ich sage es mal so, das erfordert ein Studium. Vorher kann man nur oberflächlich paar Bitmaps etc. erzeugen die man per Java Code oder was auch immer über einen Frame schiebt. Wie man dann Kurven zeichnet (Splines) kommt dann im Studium.

Dann gibt es noch die Designer, aka Künstler, die arbeiten primär nur mit Editoren und klicken ihre Grafiken zusammen.
 
Zuletzt bearbeitet:
asdfman schrieb:
Ok, ich bitte um Handzeichen, wer hier schonmal ein Fenster ohne irgendeine Bibliothek, Klassenwrapper, Framework oder sonstiges, nur unter Verwendung der Win32-API auf den Bildschirm zeichnen lassen hat.
Jetzt die Hand oben behalten, wer denkt, das müsste man wissen, wenn man mit Spieleprogrammierung anfängt.

Niemand? Dachte ich mir.

Ich habe mich glaube ich falsch ausgedrückt :D

Zum Beispiel bei Java würde ich (vorerst) das normale SDK verwendet und erstmal keine fremden zusätzlichen Spiele Bibliotheken.
 
Ich kenne Java nicht gut genug, um einschätzen zu können, wie schnell man auf diese Art zumindest kleine Erfolge hat. Zu sehen, wie man voran kommt, ist bei allen Dingen der Motor, der einen vorantreibt. Deshalb sollte man sich auf keinen Fall künstlich beschränken, um sich einzureden, dadurch ein großer Hecht zu werden. Wenn Java einem von Haus aus eine gute Grundlage bietet, kann ich dir nur zustimmen. Nimm meine Hand und wir vertragen uns :3

Eine Behauptung wie "Du musst wissen, wie die GPU funktioniert und außerdem studiert haben" ist ja mal grober Quatsch. Ich habe zwar studiert, aber Pharmazie. Und grafische Spielereien habe ich ohne Not hinbekommen. 3D-Grafik ist jetzt nicht das Hauptgebiet meines Interesses, aber ich habe dazu (Fach-)Artikel gelesen und eine gewisse Kompetenz, was das Selbststudium angeht, bringt einen schonmal ziemlich weit. Für den hier im Thread gewünschten Einstieg allemal weit genug. Und am Ende des Tages ist auch ein Universitätsstudium ein Selbststudium. Wer da etwas anderes erwartet, wird auf die Schnauze fliegen.
 
asdfman schrieb:
Eine Behauptung wie "Du musst wissen, wie die GPU funktioniert und außerdem studiert haben" ist ja mal grober Quatsch.

Das muss man auf keinen Fall. Ich habe nur eine Empfehlung gegeben wie ich es machen würde bzw. gemacht habe, was aber auch darauf beruhte, dass micht der Hintergrund auch wirklich intressiert hat und ich sowieso generell programmiere.

Aber man kann natürlich auch genauso gut mit einer Spieleengine/Library beginnen, wenn man denn will ;)
 
Dich habe ich ja auch gar nicht gemeint, sondern Herrn black90 über deinem Post. Wir haben uns doch vertragen, also muss ich über jemand anders meckern. Würde sonst ja völlig aus der Rolle fallen :3
 
mMn muss man nur Algorithmieren können, also die Kunst eine Problemlösung in Form von geordneten Arbeitsschritten angeben zu können. Damit haben die meisten Leute Probleme. Es fällt vielen schwer zu verstehen, dass ein Computer im Wesentlichen doof wie drei Meter Feldweg ist. Und wenn sie dann versuchen, ihr hoch abstraktes Denken auf den Computer zu übertragen, knallt es regelmäßig.

@1337
Überlege dir erst mal, wie du überhaupt derartige Level generieren würdest. Das brauchst du, damit du überhaupt etwas grafisch darstellen kannst.
 
e-Laurin schrieb:
mMn muss man nur Algorithmieren können, also die Kunst eine Problemlösung in Form von geordneten Arbeitsschritten angeben zu können. Damit haben die meisten Leute Probleme. Es fällt vielen schwer zu verstehen, dass ein Computer im Wesentlichen doof wie drei Meter Feldweg ist. Und wenn sie dann versuchen, ihr hoch abstraktes Denken auf den Computer zu übertragen, knallt es regelmäßig.

@1337
Überlege dir erst mal, wie du überhaupt derartige Level generieren würdest. Das brauchst du, damit du überhaupt etwas grafisch darstellen kannst.

nett dargestellt. mMn fehlt noch der (unlogische) Mensch der vorne dran hockt :)

@topic: Vorsicht Spoiler, nicht mehr weiterlesen, wenn eigene Denk/Recherearbeit gewollt ist.

Wie wäre es fürn Anfang mit einem Tile-Set als Level-Disign. Es ist halbwegs leicht und es ist eigentlich nur Bildle auf den Framebuffer zeichnen. Effekte gehen da auch noch recht fix, z.B. "fancy" Explosionen.
 
Ich werfe jetzt einfach mal, unabhängig vom Rest hier, GameMaker in den Raum.
Da kann man ohne große Programmierkenntnise sich Spiele zusammenbauen und ist in der einfachsten Ausführung kostenlos.

https://www.yoyogames.com/studio

Dazu gibt es viele Tutorials (selbst in der IDE verfügbar) mit denen man nach 20min schon die ersten kleineren Spiele hat. Die bauen dann immer weiter aufeinander auf.

Ausreichend für nette Spielereien ohne sich groß mit Programmiersprachen oder Mathe auseinandersetzen zu müssen.
 
Lieber TE.
Wenn du eh schon "Vorahnung" in Bezug auf einige Programmiersprachen hast, dann:

1. Mach ein 2D Game
2. Erweitere die Logik auf 3D
Ohne fancy frameworks.

Wenn du das nicht schaffst, dann wirst du - speziell mit DirectX - nicht zurecht kommen.

mfg,
Max
 
asdfman schrieb:
Ich kenne Java nicht gut genug, um einschätzen zu können, wie schnell man auf diese Art zumindest kleine Erfolge hat. Zu sehen, wie man voran kommt, ist bei allen Dingen der Motor, der einen vorantreibt. Deshalb sollte man sich auf keinen Fall künstlich beschränken, um sich einzureden, dadurch ein großer Hecht zu werden. Wenn Java einem von Haus aus eine gute Grundlage bietet, kann ich dir nur zustimmen. Nimm meine Hand und wir vertragen uns :3

Eine Behauptung wie "Du musst wissen, wie die GPU funktioniert und außerdem studiert haben" ist ja mal grober Quatsch. Ich habe zwar studiert, aber Pharmazie. Und grafische Spielereien habe ich ohne Not hinbekommen. 3D-Grafik ist jetzt nicht das Hauptgebiet meines Interesses, aber ich habe dazu (Fach-)Artikel gelesen und eine gewisse Kompetenz, was das Selbststudium angeht, bringt einen schonmal ziemlich weit. Für den hier im Thread gewünschten Einstieg allemal weit genug. Und am Ende des Tages ist auch ein Universitätsstudium ein Selbststudium. Wer da etwas anderes erwartet, wird auf die Schnauze fliegen.

Wie du meinst. Ich jedenfalls weiß wie man sowas in OpenGL erledigt, da wird als Studienprojekt Sachen erstellen und animieren sollten.
Und da brauchst du zwangsläufig Vektoren um Bewegung darzustellen, Splines für Kurven und Matrizen für jegliche Art von Transformation wie Drehung etc. Selbst außerhalb von OpenGL, wenn du in Java z.B. in 2D ein Objekt um einen Punkt drehen willst, da macht man das am gescheitesten mit simulierten Matrizen Arrays oder Bibliotheken die das übernehmen. Der Code dazu ist dann 20 Zeilen lang, statt 2000 - was du wieder direkt an den FPS sehen wirst.

Du musst wissen dass man das Objekt in den (relativen) Ursprung schieben muss, dann eine Drehmatrix anzuwenden hat, dann zurück schieben etc. Ohne dieses Wissen (was so auch 1:1 auf GPUs abläuft!) bist du verloren.

Selbst wenn es Bilbliotheken gibt die dir die Matrizen Programmierung abnehmen, musst du dennoch wissen dass es sowas gibt und wie man es benutzt. Diesen Überblick gibt es im Studium oder in den Computergrafik Büchern.
Aber sei gewarnt, dieser Kram war mitunter eines der heftigsten Module im Studium.
 
Zuletzt bearbeitet:
Ich hatte jetzt eigentlich vor, mir das DirectX Tutorial der MDA anzugucken ..
 
Ganz schön sportlicher Einstieg. Ich würde ja erstmal versuchen einen vernünftigen, fps-unabhängigen game loop zu implementieren. Das muss man nämlich erstmal ordentlich hinbekommen und verstehen. Dann User-Eingaben zur Laufzeit verwerten, Kollision, Wegfindung, Spiel-UI/Menü und ein gewisses game state management (pausieren, speichern, laden,…), flüssige Animationen mit sprite sheets. Das ist alles recht unabhängig von der Darstellung.
Mit DirectX fängst du meines Erachtens am falschen Ende an und mit 3D sowieso. Sieh erstmal mit Vektoren durch, bevor du dich in Matrizen stürzt.

Java eignet sich fürs Erlernen dieser Dinge tatsächlich gut, weil man ohne zusätzliche libs mit Java2D alles hat, was man braucht. In anderen Sprachen wie z.B. Python mit tkinter natürlich auch.
Aber wegen der zusätzlichen Hürde des Sprachenwechsels und weil es mit C++ und SDL (und anderen) auch nicht schwerer ist, muss das nicht sein.
 
black90 schrieb:
Wie du meinst. Ich jedenfalls weiß wie man sowas in OpenGL erledigt, da wird als Studienprojekt Sachen erstellen und animieren sollten.
Und da brauchst du zwangsläufig Vektoren um Bewegung darzustellen, Splines für Kurven und Matrizen für jegliche Art von Transformation wie Drehung etc. Selbst außerhalb von OpenGL, wenn du in Java z.B. in 2D ein Objekt um einen Punkt drehen willst, da macht man das am gescheitesten mit simulierten Matrizen Arrays oder Bibliotheken die das übernehmen. Der Code dazu ist dann 20 Zeilen lang, statt 2000 - was du wieder direkt an den FPS sehen wirst.

Du musst wissen dass man das Objekt in den (relativen) Ursprung schieben muss, dann eine Drehmatrix anzuwenden hat, dann zurück schieben etc. Ohne dieses Wissen (was so auch 1:1 auf GPUs abläuft!) bist du verloren.

Selbst wenn es Bilbliotheken gibt die dir die Matrizen Programmierung abnehmen, musst du dennoch wissen dass es sowas gibt und wie man es benutzt. Diesen Überblick gibt es im Studium oder in den Computergrafik Büchern.
Aber sei gewarnt, dieser Kram war mitunter eines der heftigsten Module im Studium.

1. Erzähl mir etwas, das ich noch nicht weiß.
2. Erklär mir, warum man dafür studiert haben muss.
 
Fang einfach an, du wirst schon merken warum es komplette Studienrichtungen um den Bereich gibt.
 
Tolle Aussage, mit so vielen Argumenten :rolleyes:

Sicher ist ein Studium im Bereich Informatik oder GameDesign von Vorteil wenn man Games designen will :cool_alt: was noch lange nicht heißt, dass man sich ne Menge selber beibringen kann, gerade, wenn man kein ÜBER KRASSES HÄXX0r Game programmieren will, wie es der TE aber anscheinend jetzt doch vorhat :freak:

@leadhaxxor: fang mal besser mit 2D an, is gesünder für die nerven
 
xXxSiL3ntKill0rboZZxXx bitte :D :D :D
Man merkt ja, wie ernst mein Name gemeint ist :D

Also ne einfache 2D API? Kann man das auch passend in VS 13 integrieren? Eigentlich brauche ich "nur" die passende Dokumentation nehmen und dann rumprobieren, bis was klappt.
 
Zuletzt bearbeitet:
Irgendwie schaffe ich es nicht, das ganze ordentlich in VS13 einzubauen (?)
64x SDK hab ich erst probiert, funzt natürlich nicht mit nem 32 windows form projekt...
32x SDK mit 32 Windows Form projekt funzt aber auch nicht.
und 64x SDK mit "modifiziertem" 64x Projekt funzt auch nicht ....

Ich werde das ganze gleich nochmal versuchen ..

Hier die Fehlermeldung(en)

Code:
 Warnung	1	warning LNK4098: Standardbibliothek "msvcrt.lib" steht in Konflikt mit anderen Bibliotheken; /NODEFAULTLIB:Bibliothek verwenden.	c:\Users\X\documents\visual studio 2013\Projects\Win32Project7\Win32Project7\MSVCRTD.lib(cinitexe.obj)	Win32Project7
Fehler	3	error LNK2001: Nicht aufgelöstes externes Symbol ""public: static class sf::RenderStates const sf::RenderStates::Default" (?Default@RenderStates@sf@@2V12@B)".	c:\Users\X\documents\visual studio 2013\Projects\Win32Project7\Win32Project7\main.obj	Win32Project7
Fehler	2	error LNK2001: Nicht aufgelöstes externes Symbol ""public: static class sf::Color const sf::Color::Green" (?Green@Color@sf@@2V12@B)".	c:\Users\X\documents\visual studio 2013\Projects\Win32Project7\Win32Project7\main.obj	Win32Project7
Fehler	4	error LNK1120: 2 nicht aufgelöste Externe	c:\users\X\documents\visual studio 2013\Projects\Win32Project7\Debug\Win32Project7.exe	1	1	Win32Project7

Bei dem Beispielcode:

Code:
#include <SFML/Graphics.hpp>

int main()
{
	sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");
	sf::CircleShape shape(100.f);
	shape.setFillColor(sf::Color::Green);

	while (window.isOpen())
	{
		sf::Event event;
		while (window.pollEvent(event))
		{
			if (event.type == sf::Event::Closed)
				window.close();
		}

		window.clear();
		window.draw(shape);
		window.display();
	}

	return 0;
}

Weiß keiner was? ._.
 
Zuletzt bearbeitet:
Die Fehlermeldungen sind doch ziemlich eindeutig. Zum einen gibt es einen Bibliothekskonflikt und zum anderen findet er einige Funktionen und Felder nicht. Vermutlich gerade weil es einen Konflikt gibt.

Na dann mach dich mal schlau, wie du SFML richtig einbindet. ;-)
 
Zurück
Oben