PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 2D Spiele mit C++



Daepilin
18.02.2007, 16:31
Jo, ich beschäftige mich seit einiger Zeit mit C++ und wollte mal fragen, was ich so an Wissen und Software brauche um 2D Spiele zu programmieren? Grafikprogramm und C++ Compiler ist denke ich mal klar, aber was sonst noch? Wie spreche ich Direct X/ Open GL an, und brauch ich das dafür? Wenn ja fände ich es nett, wenn ihr mir irgendwelche Tutorials nennen könntet.

Nax
18.02.2007, 17:00
Ein paar mathematische und physikalische Grundkentnisse über Vektoren, Collission Detection & Response wären vielleicht nicht schlecht, falls du etwas Aufwändigeres machen willst. Aber für zum Beispiel einen Weltraumshooter würde gesunder Menschenverstand schon ausreichen =). Für Spieleprogrammierung empfiehlt sich SDL (http://www.libsdl.org/). Die Library ist zwar in C geschrieben, aber dennoch ähnlich objektorientiert aufgebaut wie zum Beispiel GTK, wenn auch nicht so aufwändig mit den ganzen gobject-Zeugs, was aber sowieso für jemanden der einfach nur ein kleines Spielchen schreiben will uninteressant sein dürfte.

DirectX und OpenGL könntest du auch lernen, wäre aber im Vergleich zu SDL recht schwierig, da beide Libraries recht low level sind. Falls du mit einem der beiden Libraries arbeitest, würde es sich u.U schon bei kleineren Sachen auszahlen 'ne eigene Library die darauf aufbaut zu programmieren. Allerdings wird dir eben genau das schon bei SDL abgenommen, also don't reinvent the wheel, und benutz einfach SDL :p.
Falls du dir dennoch DirectX und OpenGL anschauen willst, kann ich dir für OpenGL Nehe (http://nehe.gamedev.net/) empfehlen. Aber aus eigener Erfahrung hab' ich gelernt, dass es sich kaum auszahlt OpenGL (und auch DirectX) zu lernen, außer man will mal schauen wie so Dinge wie Shader usw. wirklich funktionieren. Ansonsten sollte man, wenn man einfach ein Spiel o.Ä. schreiben will, zu höheren Libraries wie, SDL (2D), Ogre/Crystal Space/Irrlicht/Panda3D/... (3D) greifen.

Daepilin
18.02.2007, 17:02
Erstmal nur 2D. Später solls allerdings auch 3D werden. Und dann wenn möglich mit Shader. Aber erstmal nur 2D. Aja, ist SDL kostenlos? Brauch nämlich was kostenloses.

Darf ich sachen die ich damit mache auch Verkaufen, oder muss ich die kostenlos anbieten? Und was muss ich alles Downloaden? Gibts auch Deutsche Tutorials?

Thoronador
18.02.2007, 17:22
Aja, ist SDL kostenlos? Brauch nämlich was kostenloses.

Darf ich sachen die ich damit mache auch Verkaufen, oder muss ich die kostenlos anbieten?
SDL ist kostenlos (da unter LGPL lizenziert) und SDL darf auch genutzt werden, um damit kommerzielle Programme zu erstellen. Du dürftest die Sachen also auch verkaufen.

Daepilin
18.02.2007, 17:24
SDL ist kostenlos (da unter LGPL lizenziert) und SDL darf auch genutzt werden, um damit kommerzielle Programme zu erstellen. Du dürftest die Sachen also auch verkaufen.
THX. Und was ist mit deutschen Tutorials? Ich kann zwar Englisch( bin in der 9.) aber sowas lernt man doch besser mit deutschen Tutorials.

Nax
18.02.2007, 17:28
Deutsche Tutorials? Naja, es empfiehlt sich wenn man programmieren will, der englischen Sprache mächtig zu sein, weil eben die meiste Fachliteratur nur in Englisch verfügbar ist. Deutsche Tutorials wirst du denke ich schon zu SDL finden, aber an englischen Tutorials wird es sicher mehr und umfangreichere geben.
Auf der Seite, die ich oben gepostet hab' gibt es unter anderem ein deutsches Tutorial, wenn du mehr willst, such einfach mal bei google.

Daepilin
18.02.2007, 17:29
Wie gesagt, ich kann Englisch, aber für den Anfang sind mir deutsche Tutorials lieber. Was muss ich eigentlich genau runterladen?

Nax
18.02.2007, 17:31
Wenn du dev-cpp verwendest, sollte es dort im Package-Manager eh die entsprechenden Libraries geben. Ansonsten wirst du hier ganz unten (http://www.libsdl.org/download-1.2.php) fündig.

Daepilin
18.02.2007, 17:37
Ich verwende DevC++ 4.9. Ich hab da im Package Manager folgendes:
-binutils
-gcc-core
-gcc-g++
-gcc-objc
-GNU Debugger
-GNU Make
-MinGw runtime
-Windows32 Api

Ist da das richtige bei?

EDIT: Ich hab mir das mal angeschaut, und da ist sehr viel mit Linux gemacht. Geht das Überhaupt mit WinXP?

Nax
18.02.2007, 18:33
Aus der Beschreibung:

Simple DirectMedia Layer is a cross-platform multimedia library designed to provide low level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL, and 2D video framebuffer. It is used by MPEG playback software, emulators, and many popular games, including the award winning Linux port of "Civilization: Call To Power."

SDL supports Linux, Windows, Windows CE, BeOS, MacOS, Mac OS X, FreeBSD, NetBSD, OpenBSD, BSD/OS, Solaris, IRIX, and QNX. The code contains support for AmigaOS, Dreamcast, Atari, AIX, OSF/Tru64, RISC OS, SymbianOS, and OS/2, but these are not officially supported.

[...]


Zu den Devpaks: Schau dir mal <das> (http://devpaks.org/) und <das> (http://molhanec.net/devcpphelp/packages.php) an =).

Daepilin
18.02.2007, 18:37
Ich habs jetzt schon runtergeladen, und es scheint zu funzen. Mal sehen, ob ich das verstehe°_°

Daepilin
19.02.2007, 06:52
aja, eins hab ich nicht ganz rausfinden können. Wie gutes C++ wissen brauche ich zum lernen von SDL?

Nax
19.02.2007, 07:16
Wie gesagt, SDL ist eigentlich eine C Library, ergo brauchst du eigentlich auch gar keine C++ Kenntnisse, sondern "nur" C Kenntnisse.

Anyway, auf jeden Fall ist ist sie imho sehr einfach zu benutzen, aber warum schaust du dir nicht einfach mal ein paar Beispiele selbst an? Dann wirst du eh selbst sehen ob du damit klarkommst oder nicht.

Daepilin
20.02.2007, 13:31
So, ich bau jetzt nach nem tut, ein kleines Weltraumspiel. doch es gibt ein Problem. Das Spiel startet, bricht aber ab, bevor ich irgendwas sehen kann. Es blitzt sozusagen auf. das prob liegt wohl nicht am Quellcode, da ich auch schon den vom Tutschreiber rausgegebenen Quellcode getestet hab. Außerdem tauch es nicht nur bei diesem spiel, sondern bei vielen sachen auf, die ich nach verschiedenen tuts gemacht hab. Aja, dass das fenster da bleibt, ist per while schleife gelöst, die auf einen Tastendruch auf ESC wartet.

Daepilin
21.02.2007, 13:23
Push

Nax
22.02.2007, 07:16
Schon probiert das Programm in der Command Line auszuführen, um dir mal eventuelle Fehlermeldungen anzusehen?
Zeig' mal den Code her, den du versucht hast zum Laufen zu bringen.

Daepilin
22.02.2007, 14:40
Gibt keine Fehlermeldung. Weder beim compilen oder linken, noch in der Eingabeaufforderung. hier der Code:

#include<stdlib.h>
#include<stdio.h>
#include<time.h>

#include<SDL.h>

SDL_Surface *g_pSurfScreen;//Der Bildschirminhalt
SDL_Surface *g_pSurfGalaxies;//galaxien.bmp

Uint32 g_Black;//Farbwert schwarz

#define NUM_GALAXIES 50

struct galaxy
{
int x, y;//Koordinaten der Galaxie
int type;//Welches Bild wird für die Galaxien verwendet
};

struct galaxy g_Galaxies[NUM_GALAXIES];

void RandBackground()
{
int i;
int num_types;

num_types=g_pSurfGalaxies->w / 16;

for(i = 0; i < NUM_GALAXIES; i++)
{
g_Galaxies[i].x = rand() % 1024;
g_Galaxies[i].y = rand() % 512;
g_Galaxies[i].type = rand() % num_types;
}
}

void DrawBackground(int scrollx, int scrolly)
{
int i;

for(i = 0; i < NUM_GALAXIES; i++)
{
SDL_Rect src;
SDL_Rect dest;

src.x = g_Galaxies[1].type * 16;
src.y = 0;
src.w = 16;
src.h = 16;

dest.x = ((unsigned int)(g_Galaxies[i].x - scrollx) % 1024) - 16;
dest.y = ((unsigned int)(g_Galaxies[i].y - scrolly) % 512) - 16;

SDL_BlitSurface(g_pSurfGalaxies, &src, g_pSurfScreen, &dest);
}
}

#ifdef _WIN32
#undef main
#endif

int main()
{
int running;
int scrollx, scrolly;
Uint32 lastframe, curframe, frametime;

srand(time(0));

/* SDL initialisieren */
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
fprintf(stderr, "SDL konnte nicht initialisiert werden: %s\n",
SDL_GetError());
exit(1);
}
atexit(SDL_Quit);

/* Bildschirmmodus setzen */
g_pSurfScreen = SDL_SetVideoMode(640, 480, 0, SDL_DOUBLEBUF);
if (!g_pSurfScreen) {
fprintf(stderr, "Konnte Bildschirmmodus nicht setzen: %s\n",
SDL_GetError());
exit(1);
}

SDL_WM_GrabInput(SDL_GRAB_ON);

g_pSurfGalaxies = SDL_LoadBMP("galaxien.bmp");
if(!g_pSurfGalaxies)
{
fprintf(stderr, "galaxien.bmp konnte nicht geladen werden: %s\n",
SDL_GetError());
exit(1);
}

RandBackground();

g_Black = SDL_MapRGB(g_pSurfScreen->format, 0, 0, 0);

curframe = SDL_GetTicks();

running = 1;
scrollx = scrolly = 0;
while(running)
{
SDL_Event event;
Uint8 *keystate;
int mousex, mousey;

while(SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
case SDLK_ESCAPE:
running = 0;
break;



default:
break;
}

case SDL_MOUSEMOTION:
if (event.motion.state & SDL_BUTTON(SDL_BUTTON_RIGHT))
{
scrollx -= event.motion.xrel;
scrolly -= event.motion.yrel;
}
break;

case SDL_MOUSEBUTTONDOWN:
if (event.button.button == SDL_BUTTON_LEFT) {
scrollx += event.button.x - 320;
scrolly += event.button.y - 240;
}
break;

case SDL_QUIT:
running = 0;
break;
}

lastframe = curframe;
curframe = SDL_GetTicks();
frametime = curframe - lastframe;

keystate = SDL_GetKeyState(0);
SDL_GetMouseState(&mousex, &mousey);

if (keystate[SDLK_LEFT] || mousex < 16)
scrollx -= (400 * frametime)/1000;
if (keystate[SDLK_RIGHT] || mousex > 640-16)
scrollx += (400 * frametime)/1000;
if (keystate[SDLK_UP] || mousey < 16)
scrolly -= (400 * frametime)/1000;
if (keystate[SDLK_DOWN] || mousey > 480-16)
scrolly += (400 * frametime)/1000;

}
SDL_FillRect(g_pSurfScreen, 0, g_Black);

DrawBackground(scrollx, scrolly);

SDL_Flip(g_pSurfScreen);
}

SDL_FreeSurface(g_pSurfGalaxies);

return 0;
} Aja, ein SDL_Delay(20000); bringt auch nichts.

EDIT: Prob gelöst. die benötigte galaxien.bmp lag im png format vor...

Daepilin
22.02.2007, 16:30
Neues prob. das prog ruckelt übelst auf meinem PC. Hab nen C2D E6400, ne Connect3D X1950XT, und 2gb 667 Ram von Corsair im DC. Daran kanns wohl nicht liegen, da ich sogar G3 (fast) ruckelfrei spielen kann.