|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
marco93 Mini JLI'ler
Anmeldedatum: 03.08.2006 Beiträge: 5
Medaillen: Keine
|
Verfasst am: 03.08.2006, 08:51 Titel: Frage zu BreakOut Spiel Programmierung |
|
|
Guten Tag,
ich habe eine Frage zu der Programmierung von sogenannten "BreakOut" Spielen oder so ähnlich (Man hat einen Bat und einen Ball, der nicht nach unten verloren gehen darf und der Ball zerstört die Bricks)
Meine Frage ist: Soll ich jeden Brick (jeden Stein) als einzelnen Sprite darstellen? Dann hätte ich ja bei 10 Bricks schon einen laangen Code! Und das erst bei 50 Steinen udn mehr???
Es wäre schön wenn ihr mir ein kleines Tutorial schreiben könntet.
Marco _________________ Besitzt Buch: Jetzt lerne ich Spieleprogrammierung mit DirectX
Programmiert Spiel: BreakOut Game
Zuletzt bearbeitet von marco93 am 03.08.2006, 11:56, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 03.08.2006, 10:04 Titel: Re: Frage zu BreakOut Spiel Programmierung |
|
|
Herzlich Willkommen im JLI erstmal
marco93 hat Folgendes geschrieben: |
Meine Frage ist: Soll ich jeden Brick (jeden Stein) als einzelnen Sprite darstellen? Dann hätte ich ja bei 10 Bricks schon einen laangen Code! Und das erst bei 50 Steinen udn mehr??? |
nun ja, so lang wird der COde net, sowas stellt man dan in for-Schleifen dar. d.h., du musst net jeden Sprite einzeln erstellen. Ne andere Möglichkeit ist, dass du nur einen Block-Sprite hast, und ein Array von Daten jedes einzelnen Blocks. Dann könntest du den Sprite jedes mal an der richtigen Stelle rendern; d.h. es sieht so aus als ob jeder block ein einzelner sprite ist, in wirklichteit ist das nur eine Ansammlung von Daten, die durch ein und dieselbe Textur nur immer an anderen Plätzen gerendert wird.
marco93 hat Folgendes geschrieben: |
Es wäre schön wenn ihr mir ein kleines Tutorial schreiben könntet.
|
hmm, ich glaub da suchst du mal bei Google, da findest du bestimmt was. Oder irgendeiner hier aus der Community, der selber schon ma sowas gemacht hat, könnte dir seine Hilfe anbieten.
Gruß DXer
Zuletzt bearbeitet von DirectXer am 03.08.2006, 10:07, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 03.08.2006, 10:06 Titel: |
|
|
Ein Brick ist ein Objekt, welches unter Anderem ein Sprite-Objekt besitzen sollte, über welches gerendert wird. Die Bricks könnte man beispielsweise in ein 2D-Array packen, welches 2 Schleifen in der Main-Loop durchgehen und die einzelnen Sprites der Bricks rendern. Alles klar? ;)
Edit: Patrick hatte mal ein Tutorial über das Programmieren eines Breakout-Clones geschrieben, ist aber eventuell nicht ganz einfach zu verstehen... ;)
Unter "Funny Break" findest du die:
http://old.germangamedev.de/index.php?site=article |
|
Nach oben |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 03.08.2006, 10:26 Titel: |
|
|
Du könntest die Bricks ja auch in einer Schleife zeichnen.
Für jeden Bricktyp (Farbe und Konsistenz) machst du ein Sprite.
In einer Matrix könntest du dann den Aufbau des Spielfeldes speichern.
Code: |
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0
0 0 1 1 1 3 3 3 3 3 3 1 1 1 0 0
0 0 0 1 1 1 2 2 2 2 1 1 1 1 0 0
0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0
0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0
0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0
0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0
|
Diese Matrix enthält die Beschreibung für das Spielfeld. Angenommen dein Spielfeld kann in der Breite 16 Bricks aufnehmen.
Dann steht 0 für: kein Brick (frei)
1: Bricktyp1 (z.B Grün)
2: Bricktyp2 (z.B Gelb)
3. Brycktyp3 (z.B Rot)
Diese Matrix könntest du in ein int-Array aufnehmen.
Das sähe dann so aus:
CPP: | // Deklaration
int spielfeld[16][16] = {
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, // Reihe 0
{0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0}, // Reihe 1
{0, 0, 1, 1, 1, 3, 3, 3, 3, 3, 3, 1, 1, 1, 0, 0} // Reihe 2
/* ... usw .... */
};
|
Und zeichnen könntest du es so:
CPP: | for(i = 0; i < 16; i++)
{
for(j = 0; j <16;j++)
{
// zeichne Spritetyp spielfeld[i][j]
// an Position x = i * Brickbreite und y = j * Brickhöhe
}
}
|
Hoffe du hast das Prinzip verstanden.
Gruß KI |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 03.08.2006, 10:41 Titel: |
|
|
Ein Tutorial wird dir hier bestimmt so schnell keiner schreiben, aber ne kurze Antwort ist wie du siehst drinn. (Auch wir haben nicht unendlich viel Zeit)
Also, normalerweise sollte im JLI Buch in den hinteren Beispielen sowas in der Art sein, dass man eine beliebige Anzahl von Objekten hat.
Meistens benutzt man für soetwas ein STL-Kontainer um die Variable Anzahl von Objekten zu speichern.
Der Ansatz auf den man als erstes normalerweise kommt, nämlich eben jedne Block einzelnt einzuprogrammieren geht zwar für den allerersten Anfang, aber dann muss man versuchen, Objekte wie zum Beispeil die Steine zu gruppieren, sodass man mit realtvi wenig Code eine vollkommen beliebige Anzahl Objekte verwalten kann. Und genau dafür sind Schleifen wie oben schon erwähnt perfekt. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 03.08.2006, 11:22 Titel: |
|
|
hab grad aufm ZFX-Board (eigentlich ja unser "Konkurent" ) ein komplettes Breakout-Tutorial gefunden. Kannst du dir ja ma angucken:
http://www.zfx.info/Tutorials.php?ID=67
Gruß DXer |
|
Nach oben |
|
|
marco93 Mini JLI'ler
Anmeldedatum: 03.08.2006 Beiträge: 5
Medaillen: Keine
|
Verfasst am: 03.08.2006, 11:56 Titel: |
|
|
Hi,
erstmal danke für eure Antworten.
Zu der Idee von KI: Ich glaube so mach ichs! Das passt dann auch gleich mit dem Leveleditor (den ich zur Erstellung von Levels machen werde).
Alle Zahlen in eine Datei (am besten verschlüsselt damit keine anderen die Levels per Hand verändern, damit sie das schaffen ) und dann im Spiel einfach reinholen (BinärDatei? ist das verschlüsselt? eigentlich ja oder?)
Ich versuch mal mein bestes (erstmal mit normalen Text-Dateien) und dann schreib ich hier mal hin ob es geklappt hat.
Ich weiß nicht ob es schonmal gefragt wurde aber kann man die Schriftgröße von TextOut auch ändern? ich hab bisher nur die Schriftfarbe ändern können.
Da gibts doch bestimmt SetTextSize oder so???
Marco _________________ Besitzt Buch: Jetzt lerne ich Spieleprogrammierung mit DirectX
Programmiert Spiel: BreakOut Game |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 03.08.2006, 12:25 Titel: |
|
|
Ich galube das geht ein wenig komplizeirter, man kann im Pirnzip jede beliebige Windows Schrift, (also TrueType Schrift) die installeit ist verwenden, aber so gaanz easy ist das nicht, in meinem Windows Buch (Petzold) stehen dazu ca. 40 Seiten, die hab ich ncoh net alle durch
Binär ist nicht wirklich verschlüsselt, aber trotzdem eignetlihc besser. Der nahcteil ist, das du halt einen Editor brauchst, weil du den Texteditor nicht mehr benutzen kannst.
Der Vorteil ist, das das laden und spiechern einfacher ist, du musst nciht Zahl in Text und beim laden wieder Text in Zahl umwandeln.
Verschlüsseln kann man binär natürlich tortzdem gibt tausende Algos, von einfach bis sicher, aber wenn man erstmal den aufbau nicht kennt, und keinen Hexeditor benutzen will, sind die fast schon verschlüsselt genug.
Außerdem kommt es gut den Leveleditor mit zu veröffenltichen, dann kann jeder eigene Levels bauen, steigert den Wert des Spieles etwas. Und dann macht verschlüsselung keinen Sinn mehr, oder? _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 03.08.2006, 12:38 Titel: |
|
|
marco93 hat Folgendes geschrieben: | Zu der Idee von KI: Ich glaube so mach ichs! Das passt dann auch gleich mit dem Leveleditor (den ich zur Erstellung von Levels machen werde). |
Genau dasselbe hatte ich auch vorgeschlagen. :P
Das mit den Dateien ist so 'ne Sache. Verschlüsseln ist Quatsch, ich glaube niemand wird sich die Mühe machen und deine Levels verändern um zu cheaten, zudem hat die unverschlüsselte Variante den Vorteil, dass du eben auch mal schnell per Hand ein paar Levels schreiben kannst, zumal sich ein Editor für Breakout nicht wirklich lohnt.
Zur Frage Text- oder Binärdatei: Textdateien haben eben den Vorteil, dass du sie mit jedem x-beliebigen Textprogramm schnell und unproblematisch verändern kannst, dafür lassen die sich eventuell etwas schwieriger lesen und konvertieren, da die im Grunde ja nur aus Zeichen bestehen. Binärdateien bearbeiten sich etwas komplizierter - aber auch nicht wirklich schwierig - lassen sich dafür aber recht einfach einlesen und verarbeiten, da die einzelnen Block-IDs etc. einfach der Reihe nach als z.B. Integer gespeichert werden, du musst also lediglich wissen wie dein eigenes Format aufgebaut ist. ;)
Edit: Hrmpf, Jonathan war irgendwie schneller und hat dasselbe geschrieben. :P |
|
Nach oben |
|
|
marco93 Mini JLI'ler
Anmeldedatum: 03.08.2006 Beiträge: 5
Medaillen: Keine
|
Verfasst am: 03.08.2006, 13:19 Titel: |
|
|
Ich muss ja auch keine eigene Datei anlegen, ich kann ja einfach ein Boardset machen mit verschiedenen Levels die integriert sind. Und die selbst erstellten Levels werden irgendwo gelagert z.n. /levels/testlevel.bin .
Zum Code hab ich mir folgendes überlegt: Es werden auf jedenfall viele bunte Steine sein, also sollte es ungefähr so aussehen:
CPP: | ....
// Schleife (i=Spalte, j=Reihe)
for(int i = 0; i < 10; i++) {
for(int j = 0; j < 20; j++) {
if(brick == 0) { } // nichts zeichnen
elseif(brick >= 1) { .... } // Sprite (Brick) zeichnen
}
}
....
|
Und dann muss ich noch ein wenig lesen und dann gibts wahrscheinlich die normalen bricks (ball lässt sie verschwinden prallt dann wieder ab) und PowerUps oder so (ball trifft gegen, das power-up bewegt sich nach unten und wird aufgefangen (irgend nen bonus) oder verschwindet im unteren Bildschirmrand (weg)).
Aber erstmal reichen die normalen Bricks, ich guck mir das mal an.
Marco
PS: Achja, @GreveN: Ich weiß. Nur KI hat es etwas genauer geschrieben. Hehe. _________________ Besitzt Buch: Jetzt lerne ich Spieleprogrammierung mit DirectX
Programmiert Spiel: BreakOut Game |
|
Nach oben |
|
|
manu Super JLI'ler
Alter: 35 Anmeldedatum: 09.03.2006 Beiträge: 327 Wohnort: allgäu (DE) Medaillen: Keine
|
Verfasst am: 03.08.2006, 14:06 Titel: |
|
|
Hi,
zu der unterschiedlichen Schriftgröße mit TextOut.
Ich hatte mich das auch mal gefragt und darauf hin mal google benutzt und wurde fündig. Leider hab ich die seite nicht mehr... Ich habe aber gerade mal die Methode, die ich mir daraus zusammengebastelt hatte, rausgesucht und ich hoffe du kannst damit was anfangen
Die ersten 3 Parameter beschreiben die Textfarbe, LPCSTR den text (Wenn du es mit unicode willst musst du halt den Parameter dementsprechend abändern).
x und y beschreiben die Text Position auf dem Bildschirm.
width und height beschreiben die Textgröße und rotate die Rotation des textes....
CPP: | bool DrawGDITextEx(int r, int g, int b, LPCSTR text, int x, int y, int width, int height, int rotate)
{
HDC m_hDC;
if(m_lpBack->GetDC(&m_hDC) == DD_OK)
{
HFONT m_font;
//Font erstellen
m_font = CreateFont(width, height, rotate, 0,
FW_NORMAL, FALSE, FALSE, FALSE,
ANSI_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH | FF_ROMAN,
"Times New Roman");
SelectObject(m_hDC, m_font);
SetBkMode(m_hDC, TRANSPARENT);
SetTextColor(m_hDC, RGB(r,g,b));
TextOut(m_hDC, x, y, text, strlen(text));
m_lpBack->ReleaseDC(m_hDC);
DeleteObject(m_font); // Font löschen
return true; // alles OK
}
else
return false; //Fehler
}
|
PS: Die Funktion hatte ich als Methode zusammen mit den benötigten Variablen in ner Klasse gekapselt und hab se grad für dich im phpbb texteditor zu ner "normalen" funktion ungeschrieben etc... Ich hoffe ich hab dabei kein Fehler gemacht
wichtiges edit: m_lpBack ist der Backbuffer und die Fehlerüberprüfung mit DD_OK kommt noch von DirectDraw. das ganze musst du halt an dein Programm anpassen
Zuletzt bearbeitet von manu am 03.08.2006, 14:20, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 03.08.2006, 14:11 Titel: |
|
|
Also entweder machst du das ganz einfach, dafür statisch, in dem du einfach anhand der IDs im Array unterscheidest was getan werden soll (z.B.: 1 = nichts, nur zerstören; 2 = neues Leben; 3 = 2. Ball; ... ), oder du löst das über die Vererbungsschiene. Beispielsweise könntest du eine Zusatzklasse 'Extra' mit einer virtuellen Methode 'give' machen, von der du verschiedene konkrete Boni ableitest und jeder 'Brick' bekommt einen Pointer auf ein oder mehrere solche Extras und bei einer Kollision wird dann dieses Array/ diese Liste durchgegangen und alle Methoden 'give' werden aufgerufen (ob in diesem Fall eine "ist"- oder "besitzt"-Beziehung vorliegt ist streitbar, ich denke das die "besitzt"-Beziehung vorteilhafter ist, da sie ermöglicht einem Brick Kombinationen aus mehreren Boni zu zuweisen). Generisch könnte man das auch über Templates lösen, aber das dürfte für deine Zwecke schon fast zu weit gehen. |
|
Nach oben |
|
|
marco93 Mini JLI'ler
Anmeldedatum: 03.08.2006 Beiträge: 5
Medaillen: Keine
|
Verfasst am: 06.08.2006, 08:57 Titel: |
|
|
ahh! jetzt hab ich es auch verstanden: z.B. 1 = roter Brick, 2 = blauer Brick usw., 3 = Extra Leben (PowerUp) usw.
Zur Programmierung: Man kann jetzt den Paddle nach links und rechts bewegen (mit Bildschirmbegrenzungen)
Marco _________________ Besitzt Buch: Jetzt lerne ich Spieleprogrammierung mit DirectX
Programmiert Spiel: BreakOut Game |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 07.08.2006, 12:30 Titel: |
|
|
Naja, Grenzen sind sehr leicht. Wenn die Position kleiner 0 ist, wird sie auf 0 gesetzt, ist sie größer als der rechte Dildschirmrand wird sie darauf gesetzt. Aslo zum Beispiel von 1200 auf 1024.
Bewegen geht mit DirectInput oder Windwosfunktionnen, nimm DI, das ist im Buch beschreiben. Wie man Sprites bewegt ist auch beschrieben, lies also am besten nochmal die entsprechenden Kapitel, das sollte die meisten Fragen beantworten. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
marco93 Mini JLI'ler
Anmeldedatum: 03.08.2006 Beiträge: 5
Medaillen: Keine
|
Verfasst am: 08.08.2006, 11:42 Titel: |
|
|
Hi,
ich habe noch eine Frage:
Wie bekomme ich so Ränder an die Seiten, also dass der Ball und der Paddle nicht auf dem ganzen Bildschirm sein können? Ich möchte nämlich rechts und links eine grenze haben, z.b. von 25 Pixel o.ä.
Zur Programmierung: Hab jetzt statt der Bricks (Sprites) schon 0 (no brick) und 1 (brick) auf den bildschirm bekommen, leider geht der Ball noch durch ... Superball ^^ (ich versuch aber erstmal die bricks herzubekommen)
Marco _________________ Besitzt Buch: Jetzt lerne ich Spieleprogrammierung mit DirectX
Programmiert Spiel: BreakOut Game
Zuletzt bearbeitet von marco93 am 08.08.2006, 11:46, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|