Archiv verlassen und diese Seite im Standarddesign anzeigen : spieleprogrammierung - wenn keine felder wie dann?
amida maru
2007-03-04, 18:26:15
Hallo Community. Ihr habt bestimmt gedacht wo ich war weil ich solang nichtmehr gepostet habe. Ich war Skilager mit Schule. Naja eigentlich zum Hauptthema. Wenn man sowas wie zum beispiel space invaders oder sowas macht. Wie kann man dann machen das sich jetzt zum beispiel das flugzeug weiter nach rechts oder nach links bewegt. Bei RPGs geht das ja mit Feldern aber bei "normalen" spielen geht das ja irgendwie anders. Ich will jetzt hier nur das prinzip davon wissen wie sowas funzt kein code oder sonstiges.
danke
bye
Fruli-Tier
2007-03-04, 18:45:41
Soweit ich das überblicke, werden schlicht Bitmaps pixelweise verschoben.
rotalever
2007-03-04, 18:46:08
Ich war Skilager mit Schule.
Und hats Spaß gemacht?
Naja eigentlich zum Hauptthema. Wenn man sowas wie zum beispiel space invaders oder sowas macht. Wie kann man dann machen das sich jetzt zum beispiel das flugzeug weiter nach rechts oder nach links bewegt. Bei RPGs geht das ja mit Feldern aber bei "normalen" spielen geht das ja irgendwie anders.
Du willst also dass sich das Flugzeug nach recht und links bewegen kann? Nun, das Flugzeug hat zu jeder Zeit eine feste Position (x,y) auf dem Bildschirm. Bei 2D würdest Du das in der Regel in Pixeln angeben. Bei einem Bildschirm mit 640x480px wär das Flugzeug also bei (x=319.0,y=239.0) ca. in der Mitte. Nach links und rechts bewegen bedeutet die X-Koordinate verändern. Möchtest du das Flugzeug also z.B. mit einer Geschwindigkeit von 0.01px/millisecunde bewegen, dann geht das so, dass du bei jedem Frame prüfst, wie viel Zeit verstrichen ist und daraus die neue Position berechnest. Am besten du nimmst sehr feine Zeiteinheiten wie Millisekunden und als Positionsangaben floats, die Du dann nur zur Ausgabe rundest. Nicht verstanden? Dann schau in den Code^^
oldtime = time(); // z.B. in millisekunden
v = 0.01; // Geschwindigkeit
x = 20.0; // Position des Raumschiffs
y = 40.0; // ...
while (1) { // Main-Loop
timediff = time() - oldtime; //
oldtime += timediff;
// Jede Menge CODE von Dir...
x = x + timediff*v; // Alte Koordinate plus Änderung
// Jede Menge CODE von Dir...
zeichneRaumschiffAn((int)x, (int)y);
// Noch mehr CODE...
}
amida maru
2007-03-04, 19:29:07
ok ist klar mit x und y koordinaten. Aber in ein pixel passt das flugzeug doch garnet rein?also dann sieht man es nimmer. oder wird die x und y koordinaten an den rändern vom flugzeug hingemalt?
und übrigens im skilager wars geil aber mit lehrern wirds halt dann ma wieder kacke. das skifahren und mit freunden sein war hammer der rest ist scheisse. Wir haben zum beispiel an den nachbarn ihre fensterscheibe gefurzt oder der eine hat den andern als er geschlafen hat ins gesicht gefurzt^^
Markus89
2007-03-04, 19:48:02
Die X, Y Koordinate sind am oberen linken Bildrand, das heißt nicht, dass das Bild selbst nur 1 Pixel groß ist. Du änderst nur die Position des Bildes.
rotalever
2007-03-04, 19:58:09
Das Flugzeug ist ja ein Bild, z.B. in einem Array gespeichert. Das Bild hat z.B. die Breite 128px und die Höhe 40px. Die von mir angegebene X,Y-Koordinate soll z.B. die linke obere Ecke des Bildes markieren. Also erreichnen sich die anderen Ecken mit X2 = (int)X+128px und Y2 = (int)Y+40px. Du hast also jetzt Vier Ecken (X,Y) (X,Y2) (X2,Y2) (X2,Y) (gegen den Uhrzeigersinn...) und ein Bild, das Zeichnen sollte dann ja wohl kein Problem sein. Hierbei ist immer zu beachten, dass ich dabei ausgegangen bin, dass das Koordinaten System so ist, dass (0,0) oben links am Bildschirm ist.
Wir haben zum beispiel an den nachbarn ihre fensterscheibe gefurzt oder der eine hat den andern als er geschlafen hat ins gesicht gefurzt^^
:biggrin:
amida maru
2007-03-04, 20:28:02
ah gut rotalever danke ihr habt alle gut erklärt. @ rotalever also deine rechnung kapier ich ja nich^^.
@skilager.
ein anderer hat schlagsahne auf den andern seine eier getan....;D
rotalever
2007-03-04, 21:25:02
ah gut rotalever danke ihr habt alle gut erklärt. @ rotalever also deine rechnung kapier ich ja nich^^.
Welche Rechnung? Bzw. Was verstehst du davon nicht?
Wenn du dich weniger mit Darmgasen und Testikeldekoration mittels Milchprodukten und mehr mit der Schule beschäftigen würdest, hättest du a) kein Verständnisproblem mit den Space Invaders und b) eine Rechtschreibung, die wo dem anderens auch besserer lesen könnens.
rotalever
2007-03-05, 12:47:38
Wenn du dich weniger mit Darmgasen und Testikeldekoration mittels Milchprodukten und mehr mit der Schule beschäftigen würdest, hättest du a) kein Verständnisproblem mit den Space Invaders und b) eine Rechtschreibung, die wo dem anderens auch besserer lesen könnens.
Da könnte was dran sein :smile:
Allerdings sollte man anmerken, dass es durchaus normal ist, dass man wenig Ahnung hat, wenn man mit Programmieren anfängt... Mit der Zeit kommt eben die Erfahrung und wie wir alle Wissen Übung macht den Meister, da hilft einfach nur probieren denn das geht über studieren.
Guck mal hier (http://cone3d.gamedev.net/cgi-bin/index.pl?page=tutorials/gfxsdl/index). Das könnte dir helfen, auch wenn du kein SDL benutzt. Das Prinzip ist ja immer das gleiche.
amida maru
2007-03-05, 14:33:47
ah gast hast du in der siebten klasse irgendwas über computer technik gelernt?ausserdem ist doch egal ob man hier was groß oder klein schreibt....
Sagen wir mal ich schreib ab jetzt groß. Was bringts der Community?
Du solltest dich mal registrieren lassen statt hier große Töne zu spucken. Ausserdem für Kritik kannste einen eigenen Thread eröffnen. Hier schreibt der rein der mir helfen will.
rotalever
2007-03-05, 14:35:22
Aber hast du inzwischen alle meine Rechnungen verstanden? Ich erklärs sonst noch mal gerne.
Wenn Du Dir helfen lassen willst, solltest Du auch versuchen Probleme genauer zu formulieren statt einfach zu sagen "Ich habs nicht verstanden".
amida maru
2007-03-05, 15:26:11
k sorry aber ich muss jetzt zum zahnarzt mein kettenpanzer im mund kontrollieren zu lassen :P
ich erläutere dir später was ich net kapier.
amida maru
2007-03-05, 17:05:36
sry erstmal für doppelposting^^.
Also ein sprite ist also in einem array(feld) gespeichert. aber woher weiss er das das andere ausserhalb des flugzeuges transparent sein soll, zb^^.
Markus89
2007-03-05, 17:26:06
Irgendwie verstehe ich dein problem nicht. Versuche doch mal bitte dein Problem nicht nur mit ein paar Worten zu beschreiben. Schreibe doch einfach mal wo du nicht weiterkommst. Fehlt dir nur ein Ansatz oder gibt es andere Probleme?
rotalever
2007-03-05, 17:30:32
aber woher weiss er das das andere ausserhalb des flugzeuges transparent sein soll, zb^^.
Wer ist "er"? Benutzt du eine bestimmte Bibliothek? Möglicherweise unterstützt diese Bilder mit Transparenzkanal/Alpha, da musst du das im Graphikprogramm entsprechend markieren. Andernfalls, kann man häufig sagen, dass alles schwarze durchsichtig sein soll.
amida maru
2007-03-05, 19:58:26
naja mit er mein ich das array. also wenn ichn flugzeug hab das nicht das ganze feld belegt sondern zum beispiel nur die hälfte(obwohl ein Flugzeug ja ne andere form hat als die hälfte des feldes)wie kann ich dann machen das die andere "hälfte" nichts mit dem flugzeug zu tun hat und transparent ist?
meinst du das alles schwarze durchsichtig ist?
rotalever
2007-03-05, 20:08:19
Nochmal: Womit zeichnest Du deine Flugzeuge, etc. Irgendeine Bibliothek?
Außerdem: Allgemein speicherst Du so ein Flugzeug usw. im Array, so wie Du es im Graphikprogramm siehst. Also als eine Rastergraphik. Jede Zelle des 2D-Arrays stellt einen Pixel dar. In ihr ist ein Farbwert gespeichert. Da häufig RGB-Farbwerte verwendet werden, benötigt es idr. 3D-Array zum Speichern des Bilders. Also
bild[höhe][breite][3]
In der letzten Dimension wird also die Farbe gespeichert. bild[y][x][0] = rotwert, bild[y][x][1] = grünwert, bild[y][x][2] = blauwert, des Pixels x,y. Wobei darauf zu achten ist, ob die Bibliothek zum Zeichnen die Bilder in der Reihenfolge RGB erwartet. Manchmal ist auch z.B. BGR beliebt.
Zurückkommend also zur Frage, wie man Tranzparenz malt. Entweder man teilt der Bibliothek mit, dass eine bestimmte Farbe Durchsichtigkeit darstellen soll. Oftmals ist dies Schwarz (R=0,B=0,G=0). Das kann aber ausgefranste Kannten des Objekts zur Folge haben! Um dies zu vermeiden unterstützen viele Graphikbibliotheken auch einen sogenannten Alpha-Kanal, in ihm ist ein Transparenz-Wert gespeichert, häufig ebenfalls 8bit wie die Farbwerte also [0,255]. Dieser Alpha-Kanal gibt für jeden Pixel an, wie durchsichtig er gezeichnet werden soll. Unterstützt Deine Bibliothek das, solltest Du es auch verwenden! Bildformate, die einen Alpha-Kanal speichern sind zum Beispiel das PNG-Format. Dies kannst Du in einem Graphikprogramm z.B. GIMP erstellen.
@amida maru: Ich würde sagen du versuchst erst einmal ein Bild von deinem Flugzeug auf den Bildschirm gemalt zu bekommen. Wenn du das geschafft hast dann kann dir jemand hier erklären wie du es bewegst. Diese Vorgehensweise hätte den immensen Vorteil dass du direkt den Code posten kannst mit dem du dein Flugzeug/Auto/wasauchimmer renderst. Ohne Code haben solche fragen nämlich IMHO genau garkeinen Sinn, es gibt einfach zuviele Unklarheiten. (Sprache/Compiler/Libs/etcetcpp, ganz zu schweigen davon wie denn deine Gameloop aufgebaut ist...)
amida maru
2007-03-06, 16:01:56
ich hab keine ahnung noch wie man sowas aufn bildschirm rendert. aber ich will halt das prinzip kennen. am anfang als ich mit c++ angefangen hab war mir ein rätsel wie man überhaupt ein spiel machen kann jetzt weiss ich wenigstens schon paar sachen wie kollisionserkennung und sowas.
Also ich hab gelesen das ein flugzeug wie zb space invader in einer bounding box gespeichert wird. also heisst das das eine bounding box sowas wie ein array ist?
rotalever
2007-03-06, 16:45:41
jetzt weiss ich wenigstens schon paar sachen wie kollisionserkennung und sowas.
Sorry, wenn das hart kling, aber Du weißt es leider nicht...
also heisst das das eine bounding box sowas wie ein array ist?
Nein nicht unbedingt, eine Bounding Box lernt man üblicherweise kennen, wenn man sich mit Kollisionserkennung beschäftigt. Sowohl in 3D als auch in 2D ist es vom Zeitaufwand nicht sinnvoll, jedes Polygon/Dreieck (3D) bzw. jeden Pixel (2D) bzw. eine genaue Umrandung zu testen. Oftmals reicht es aus, eine grobe Kollisionserkennung zu nehmen um den gewünschten visuellen Effekt (um den es ja letztendlich geht) zu erreichen. Häufig führt man dazu eine Bounding box ein. Es ist wie der Name schon sagt eine Box, also ein Quader oder Rechteck, welches das Objekt vollständig beinhaltet. Jetzt muss man nur noch solche Bounding-Boxes auf Kollision testen, was Zeit erspart. Teilweise nimmt man auch andere Körper wie Spheres/Ellipsoide/etc. Die Bounding Box in 2D würde man beispielsweise als eine Menge von 4 Punkten, also 8 Koordinaten speichern. Wahlweise reicht auch ein Punkt und eine Breite+Höhe. Das sind dann nur die Hälfte der Daten, die anderen Punkte müssen allerdings errechnet werden. Man speichert diese Daten wohl in einem Array, aber dieses ist natürlich nicht so groß wie die Bounding-Box!
Ach und noch was, schau Dir mal SDL an. Damit kannst Du leicht Bilder laden und auf den Bildschirm zeichnen. Auch Tastatur/Maus IO. Zudem gibt es noch Schrift-Pakete, OpenGL Modul, etc.
Baalzamon
2007-03-06, 16:51:24
ich hab keine ahnung noch wie man sowas aufn bildschirm rendert. aber ich will halt das prinzip kennen. am anfang als ich mit c++ angefangen hab war mir ein rätsel wie man überhaupt ein spiel machen kann jetzt weiss ich wenigstens schon paar sachen wie kollisionserkennung und sowas.
Also ich hab gelesen das ein flugzeug wie zb space invader in einer bounding box gespeichert wird. also heisst das das eine bounding box sowas wie ein array ist?
Wenn du möchtest, kannst du dir den sichtbaren Bildschirmbereich als Array vorstellen, mit screen[x][y] = color.
Allerdings halte ich das nicht für besonders sinnvoll. Löse dich von der Vorstellung den Bildschirm in Kästchen einteilen zu wollen und diese dann in einem Array zu speichern.
Für ein 2d-Spiel sieht es doch folgendermassen aus:
Du hast ein Bitmap von deienm Raumschiff.
Dieses Bitmap hat eine Ausdehnung, zB 128x128 Pixel.
Ausserdem hat das Bitmap eine Position auf dem Schirm (x- und y-Koordinaten).
Da das Raumschiff kaum Quadratisch sein wird, sondern es einige Bereiche gibt, an denen kein 'Material' ist, muss das bei der Kollisionsabfrage berücksichtigt werden. Man kann also nicht einfach testen, ob eine Kollision mit dem Bitmap stattgefunden hat (also mit den 128x128 die das Bild belegt) sondern man muss testen, ob das eingebettete Raumschiff getroffen wurde.
Jetzt kann man natürlich einfach jedes Pixel des Bitmap prüfen, ob eine Kollision stattgefunden hat. Ist sehr aufwendig und wird deswegen (meist) über Bounding Boxes gelöst.
Eine Bounding-Box abstrahiert die Form deines Raumschiffes in leicht berechnbare geometrische Gebilde. Ein typisches 'Zigarren-Raumschiff' würde (wahrscheinlich) einfach eine Rechteckige Bounding-Box bekommen, auch wenn das Schiff eher Zigarrenförmig aussieht (vorne und hinten spitz zulaufend, evtl. Heckflossen usw.). Die Bounding Box beinhaltet das Raumschiff sozusagen, ist aber nur eine Teilmenge des orginalen Bitmaps, gegen die dann die Kollisionsabfrage durchgeführt wird.
Geht einfach schneller und die Genauigkeit ist für Spiele oft ausreichend, gerade dann wenn man die Bounding-Box geschickt wählt (z.B. aus verschiedenen einfachen geometrischen Formen zusammengesetzt). Somit hat man zwar keine pixelgenaue Kollisionsabfrage, aber das ist meist auch garnicht notwendig.
Zurück zum Problem:
Du brauchst eine Klasse Raumschiff (oder Spieler oder was auch immer) in der du mindestens die Grafik für das Raumschiff und die Position auf dem Schirm speicherst. Drückst du nun die Taste 'rechts' wird in dem instanzierten Objekt der Klasse Raumschiff (dein eigentliches Raumschiff, das was du siehst sozusagen) der Positionswert x += speed gesetzt, wobei speed die Geschwindigkeit ist, mit der sich dein Raumschiff bewegen soll.
Beim nächsten mal wenn der Bildschirm neu gezeichnet wird, werden die aktuellen Positionsdaten ausgelesen und an entsprechender Stelle dein Raumschiff gezeichnet.
Wenn ich dich richtig verstanden habe, bist du aber immer noch auf dem Holzweg. Nach deiner Vorstellung würdest du gerne den kompletten Bildschirm in Blöcke unterteilen und dann nur mit diesen rechnen. Das kannst du auch tun, zB ein Array in Bildschirmgrösse erstellen (zB 800x600 => screen[800][600]) und dort dann an der Stelle wo dein Raumschiff ist (respektive der Mittelpunkt deines Bitmaps) einfach ein true setzen. Dann weisst du wo dein Raumschiff ist. Ist aber, entschuldige den Ausdruck, total dämlich, ewige Sucherei wäre die Folge, das Ganze wäre ineffizent³.
Hoffe dich nicht zu sehr verwirrt und nicht zuviel Scheiss geschrieben zu haben. ;)
rotalever
2007-03-06, 17:07:18
Auf den Punkt gebracht.:smile:
amida maru
2007-03-06, 17:21:06
also danke leute ihr habt echt gut erklärt. aber wieso ist eine bounding box kein array?ein array ein zweidimensionales kann doch auch viereckig sein wie eine bounding box. und dann kann man sagen
if(meteroit == raumschiff)
destroy raumschiff();
oder irgendwie so oder wie?
Baalzamon
2007-03-06, 17:48:19
also danke leute ihr habt echt gut erklärt. aber wieso ist eine bounding box kein array?ein array ein zweidimensionales kann doch auch viereckig sein wie eine bounding box. und dann kann man sagen
if(meteroit == raumschiff)
destroy raumschiff();
oder irgendwie so oder wie?
Und genau an dem 'irgendwie so oder wie' scheitert es dann.
Überlege doch mal was du mit dem Ausdruck da oben bezwecken möchtest. Was sind das überhaupt für Dinger die da gegeneinander vergleichst? Lassen die sich überhaupt vergleichen, oder musst du erst den Vergelichsoperator überladen?
Also von Anfang an. Deine Klasse Raumschiff (nehmen wir mal die, die ich da oben auch genannt habe) braucht also zusätzlich noch irgendwas mit dem man die Kollision testen kann. Es scheint vernünftig eine Methode boolean collide(), oder so ähnlich zu implementieren, welche dir zurückgibt ob eine Kollision stattgefunden hat oder nicht (also das was du oben so leichtfertig mit == gemacht hast).
Wenn du jetzt also 'rechts' drückst musst du, bevor du einen neuen x-Wert zuweist, erstmal schauen, ob der Bereich in den du dich bewegen willst frei ist. Dazu rufst du die Methode collide mit den neuen Werten auf (du musst also quasi in die Zukunft schauen, um die Kollision, bevor sie passiert ist, behandeln zu können).
Liefert dir collide ein false ist alles in Ordnung, du kannst die Position ändern und alles wird gut. Ist collide true, musst du überlegen was passieren soll (Schaden, Explosion, Garnichts...). Dazu musst wissen womit dein Raumschiff zusammengestossen ist (Bildschirmrand => passiert wohl garnichts, Meteor => Explosion).
Das heisst im collide könnte dir also auch einfach das Object zurückgeben mit dem es zusammengestossen ist, oder eben null, bei keinem Zusammenstoss . Du bräuchtest dann sowas in der Form Gameobject collide(position).
Ob man das wirklich so macht, weiss ich jetzt nicht, kann aber bestimmt jemand anders beantworten, scheint mir aber sinnvoll zu sein. Habe das Ganze aber nicht bis zu Ende gedacht, ist eher ein Bauchgefühl.
Im Endeffekt benutzt du innerhalb der collide Methode die Boundig-Box um zu schauen ob du irgendwo aneckst. Die Bounding-Box kannst du in einem Array speichern, aber ich ahne schon das du jetzt wieder alles in Blöcke unterteilen willst. Tu es nicht. ;) Du kannst die Punkte Bounding Box zB einfach als x/y Tupel speichern (zb bb[0]=(0.0,0.0), bb[1]=(0.0,1.0), bb[2]=(1.0,1.0), bb[3]=(1.0,0.0)) und annehmen das diese Punkte die Box definieren (in diesem Falle ein Quadrat mit der Ausdehnung 1.0x1.0, Nullpunkt ist die linke untere Ecke). Wichtige Erkentniss an dieser Stelle: Es gibt absolute und relative Postionsangaben, die an so mancher Stelle gerne umgerechnet werden möchten.
Wenn du jetzt die Kollision testen willst musst du überprüfen ob sich die Bounding-Boxen der beiden Kollisionspartner überschneiden. Dafür scheint die Datenstruktur die ich gerade angegeben habe äussert ungeeignet. Also denk dir eine Bessere aus. ;)
Oder schau einfach mal auf www.gamedev.net vorbei, wenn du des Englischen in geschriebener Form mächtig bist. Die haben eigentlich zu allen gängigen Fragen effiziente Antworten.
amida maru
2007-03-06, 17:53:46
also ich fasse nochmal in eigenen worten zusammen was ich jetzt verstanden hab :P. also man muss ein flugzeug in ein array speichern. und eine bounding box über das flugzeug machen. und dann prüf ich ob die bounding box von einer anderen bounding box(hier der meteroit) getroffen wird oder?
rotalever
2007-03-06, 17:55:03
Beim Kollisionstest von bewegten Objekten auch immer drauf achten, dass sich BEIDE bewegen. Das heißt, du musst berechnen, wie viel die einzelnen Objekte fliegen, dann hast Flugvektoren, bzw. Kanäle, dort wo sich was schneidet, können Berührungen auftreten. Die erste Berührung jeweils zuerst behandeln, dann die weiteren usw. Ist vll. für ein Space Invaders etwas übertrieben gedacht aber so nebenbei auch ganz nett..
rotalever
2007-03-06, 17:56:22
also ich fasse nochmal in eigenen worten zusammen was ich jetzt verstanden hab :P. also man muss ein flugzeug in ein array speichern. und eine bounding box über das flugzeug machen. und dann prüf ich ob die bounding box von einer anderen bounding box(hier der meteroit) getroffen wird oder?
Genau, wobei Du natürlich den Bounding-Box-Test noch implementieren musst. Das sollte aber recht einfach sein, wenn man sich das kurz mit einem Blatt und Stift überlegt.
sry wegen doppelpost...
Kolission ist nie einfach wenn man es richtig machen will. Bei einer trivialen Methode fliegen Objekte nämlich durch andere durch, wenn delta t zu groß wird.
Baalzamon
2007-03-06, 18:04:39
also ich fasse nochmal in eigenen worten zusammen was ich jetzt verstanden hab :P. also man muss ein flugzeug in ein array speichern. und eine bounding box über das flugzeug machen. und dann prüf ich ob die bounding box von einer anderen bounding box(hier der meteroit) getroffen wird oder?
Nö, las die Arrays weg. Oder lass mich fragen: Was willst in dem 'Flugzeug'-Array den speichern?
Speicher die Koordinaten einfach im Spielobjekt (hier wohl ein Raumschiff). Dazu reichen zwei floats x und y. Ausserdem beinhaltet dein Spielobjekt (mindestens) noch die zu zeichnende Grafik, und die Boundig Box (in geeigneten Format um schnell 'intersections' festzustellen).
Aber du hast damit Recht, dass man nur die Bounding-Boxen gegeneinander prüft.
rotalever
2007-03-06, 18:19:19
Bei einer trivialen Methode fliegen Objekte nämlich durch andere durch, wenn delta t zu groß wird.
Meine Rede... Man muss halt entsprechend die Flugbahnen vorrausrechnen etc.
amida maru
2007-03-06, 19:05:44
hmm baalzman in einem array speichert man doch das space invader flugzeug oder?
Markus89
2007-03-06, 19:06:51
Willst du in einem Array die einzelen Farbwerte speichern, oder was?
amida maru
2007-03-06, 19:21:20
warte wenn man ein flugzeug hat. dann ist das flugzeug doch in einem sagen wir mal 16*16 pixel "feld" gespeichert. oder warte wie soll ich das erklären.
guckmal
http://developer.apple.com/documentation/QuickTime/IQ_InteractiveMovies/art/qts08.gif
sagen wir das wäre mein flugzeug dann ist das in einem rechteck gemalt worden das flugzeug. und was nicht zum flugzeug gehört wird halt transparent.
wie speicher ich denn dann mein flugzeug wenn nicht in einem array?
rotalever
2007-03-06, 19:34:11
Nein, du schneidest den Pinguin mit einem Graphikprogramm aus und dieses eingezeichnete Rechteck ist dann das Bild, was Du im Programm, z.B. in Deinem Feld speicherst. Den Rand dadrum brauchste nicht, er verbraucht nur Speicher und kann zu gar nichts verwendet werden.
amida maru
2007-03-06, 20:10:37
wie schneid ich jetzt was weg? hä?
rotalever
2007-03-06, 20:13:06
Mit Paint...
Mal ne Frage: Meinst Du Deine Fragen teilweise wirklich ernst?
amida maru
2007-03-06, 20:14:34
ja wieso sind die dumm?=)
ich hab jetzt immernoch keine ahnung was du meinst mit wegschneiden.
man erstellt erstmal sagen wir ein 16*16 pixel rechteck und dann malt man ein flugzeug rein und macht das was ausserhalb des flugzeuges ist transparent oder?
rotalever
2007-03-06, 20:21:04
Genau, nur bei dem Bild, was Du gezeigt hast, schneidet man natürlich alles außerhalb weg, weil es nicht gebraucht wird. Ansonsten stimmt das natürlich.
Markus89
2007-03-06, 20:36:37
ja wieso sind die dumm?=)
ich hab jetzt immernoch keine ahnung was du meinst mit wegschneiden.
man erstellt erstmal sagen wir ein 16*16 pixel rechteck und dann malt man ein flugzeug rein und macht das was ausserhalb des flugzeuges ist transparent oder?
Du kannst/musst halt noch die transparente Farbe einstellen. Zb weiß oder schwarz.
Gnafoo
2007-03-06, 22:50:44
Schnapp dir bitte einfach mal die SDL-Bibliotheken, nen C++-Compiler und gehe ein paar leichte Tutorials durch (findest du auf der SDL-Seite). Das hilft dir am ehesten, in die Grundlagen reinzukommen, denn diese ziellose Fragerei hier bringt dich nicht wirklich weiter.
Darauf gehe ich trotzdem noch ein: das Bild deines Raumschiffes (oder was auch immer) wird eigentlich nicht als Array gespeichert. Meist sagt man der Grafikbibliothek, die man benutzt einfach: lade mir das Bild aus der Datei xyz.png. Daraufhin bekommt man meist einen Pointer auf ein Objekt, oder eine Datenstruktur, welches die Daten über das Bild speichert von der Bibliothek zurück (was die Bibliothek da genau macht, kann dir erstmal relativ egal sein). Jedes mal, wenn nun ein Frame gerendert wird, kannst du das Bild unter Angabe obigen Pointers an der gewünschten Stelle (meinetwegen noch mit Transparenz, gedreht o.ä.) auf den Bildschirm klatschen.
Aber wie gesagt. Probier es selber aus, alles andere bringt nichts.
Baalzamon
2007-03-07, 10:44:16
hmm baalzman in einem array speichert man doch das space invader flugzeug oder?
Hmm, Missverständis, wenn du wirklich die Grafik meintest. Nichts für ungut.
Ansonsten kann ich mich dem Tod nur anschliessen, genau das hätte ich auch gesagt. Besorg dir eine Grafik-Bibliothek, um den ganzen Grafik-Kram willst du dich bestimmt nicht selber kümmern müssen.
@amida maru: Ich würde sagen du versuchst erst einmal ein Bild von deinem Flugzeug auf den Bildschirm gemalt zu bekommen. Wenn du das geschafft hast dann kann dir jemand hier erklären wie du es bewegst. Diese Vorgehensweise hätte den immensen Vorteil dass du direkt den Code posten kannst mit dem du dein Flugzeug/Auto/wasauchimmer renderst. Ohne Code haben solche fragen nämlich IMHO genau garkeinen Sinn, es gibt einfach zuviele Unklarheiten. (Sprache/Compiler/Libs/etcetcpp, ganz zu schweigen davon wie denn deine Gameloop aufgebaut ist...)
das war kein schmäh...wenn du den code hast der dir dein flugzeug auf den bildschirm zeichnet reden wir weiter.
du hast es vielleicht selber schon bemerkt, und wenn nicht sag ichs dir hiermit: solange du das alles nur als nebuloses halbwissen hast kommst du nicht weiter. setz dich hin und fang an zu programmieren. wenn du nicht mehr weiterkommst kannst du hier konkrete fragen stellen. oder noch besser, du versuchst selber eine lösung zu finden. google hilft.
amida maru
2007-03-07, 14:23:59
ok danke leute^^
vBulletin®, Copyright ©2000-2025, Jelsoft Enterprises Ltd.