Kollisionszeugs, Buffer etc

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Benutzeravatar
Don Polettone
User
Beiträge: 115
Registriert: Dienstag 23. November 2010, 20:26
Wohnort: Schweiz

Abend allerseits!

Gestern hatte ich in diesem Forum diverse Tipps bekommen bzgl. Physik und dass ich evtl doch besser auf Plugins setzen sollte wie py2box oder pymunk etc, auch pyOpenGL wurde erwähnt.

Nun habe ich mich da etwas eingelesen und ja, das sieht interessant aus !

Kann mir nun einiges vorstellen, was ich für mein Game gebrauchen könnte und arbeite mich da rein (z.Bsp. Sweeping resp. Bullet Collision Detection). Ich habe mich in pyBox2d eingelesen und natürlich habe ich mich dabei auf mein konkretes Problem in Bezug konzentriert, welches da wäre:

Ich will ja eine Art Worms / Lemmings - Symbiose programmieren. Die Spielwelt ist ein einzelnes Sprite mit per Pixel - Alpha aus sagen wir 320 x 200 Pixeln. Die transparenten Pixel sind der "Leerraum". Wenn nun ein Projektil auf der Welt auftrifft, soll es ein Loch geben. Soweit habe ich dies sehr simpel gelöst - mit pygame.draw.circle: Ich male einen transparenten Kreis auf die Surface und es gibt ein Loch. Auch meine Lemminge wissen so, wie sie sich zu verhalten haben, das passt und es können viele sein, ohne Ruckeln.

Nun habe ich mich gefragt: "Was in pyBox2d brauche ich, damit ich (wohl mit einem Ray) errechnen kann, welches Pixel der Welt getroffen wird?" Ich kann mir darauf einfach keinen Reim machen - ich bin noch nicht so der Guru was programmieren betrifft und vor allem die technischen Details bereiten mir Schwierigkeiten. Meine Welt ist ka kein physikalischer Körper, hat keine Polygone, nix? Muss ich all die nicht-transparenten Pixel als Körper in einem Raum erstellen??

Es war auch noch die Rede von Buffern bzw. OpenGL und ich solle meine Grafik in einen Buffer schreiben. Ich habe wirklich gegoogelt und gelesen und Zeugs und Sachen, aber inwiefern hilft mir ein Buffer? Das verstehe ich nicht. Kann ich am Buffer Operationen vornehmen mit Tools wie OpenGL oder pybox2D? Habe da einen grossen Knoten im Moment - ich sehe Puzzleteile, aber die ergeben kein Bild. Es hat geheissen, dass ich, wenn ich Grafiken in einen Buffer schreibe, diese beliebig skalieren kann, ohne die Grafik in einem Grafikprogramm zu öffnen und deren Grösse manuell zu ändern - pygame kann dies ja auch, nicht?

Hat jemand einen Denkstoss oder etwas, dass mich weiterbringt?

vielen Dank und schönen Abend noch,


Henry
Ich code, also bin ich.
deets

Mit Buffer meinte ich einfach nur ein beliebiges pygame.Surface in das du malst - statt direkt in den Screen. Und mit pygame.transform dann hochskalierst auf die gewuenschte Aufloesung, um es dann in den Screen zu kopieren.

Und um Box2D sinnvoll zu benutzen, muss man seine Welt schon als Polygone begreifen. Wenn du das nicht kannst/willst, musst du selbst ran, um zB mittels eines Bresenham Algorithmus von der Startposition einer Kugel bis zum Bildschirmrand die Koordinaten zu berechnen - und wenn du dann auf ein Hindernis triffst, musst du entsprechend reagieren.
Benutzeravatar
Don Polettone
User
Beiträge: 115
Registriert: Dienstag 23. November 2010, 20:26
Wohnort: Schweiz

Hi deets,

danke mal :) Dann benutze ich bereits Buffer..? Ich lade die Bilder ganz normal (image.load) und konvertiere sie dann mit oder ohne alpha und die Surfaces werden in Variablen gespeichert, ja. Dann alles upgedated und auf den screen geblittet. Aber wofür ist dann image.fromstring und image.frombuffer und wofür braucht man OpenGL? Kann ich damit auch wie mit Pygame z.Bsp. ein Display erzeugen? Was pyBox2d macht, verstehe ich, aber was genau OpenGL macht resp. ob ich dann pygame trotzdem noch brauche und wofür, das verstehe ich nicht. Welche Tools auf Python-Basis würdest Du mir empehlen, wenn ich coole Spiele machen will?

Sorry für die vielen Fragen :(
Ich code, also bin ich.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo!

Ich greife am besten gleich mal hier ein, sonst wirst du direkt mit deinem Projekt scheitern und ganz schön gefrustet sein. Für den Anfang ist das Vorhaben noch eine Nummer zu hoch für dich. Das magst du vielleicht gerade anders sehen, aber dir fehlt es noch viel zu sehr an den simpelsten Grundlagen. Momentan beherrscht du nicht die Grafik, nicht die Physik und auch noch nicht die algorithmischen Herangehensweisen. Das sind zu viele Lücken für ein Projekt.

Daher solltest du so anfangen, wie viele angefangen haben: setze erstmal Pong um. Minimale Grafik und einfachste Physik, in beides kannst du dich bei dem Projekt einarbeiten. Das nächste Projekt, was wahrscheinlich fast jeder schon implementiert hat, ist ein eigene Tetris-Version. Da kommst du dann auch ein wenig in Berührung mit Texturen, die Spiellogik ist etwas komplizierter und du kannst das Spiel im Prinzip beliebig erweitern. Zwei Spieler, Mutliplayer, Grafikeffekte, etc. Alternativ sind sicher auch Pacman oder Tanks interessant.

Um deinem Wunschprojekt etwas näher zu kommen, könntest du ein Spiel, welches meiner Erinnerung nach ebenfalls Tanks hieß, nachimplementieren. Es gab ein zufällig generiertes Terrain auf dem zwei (oder mehr) Panzer fest platziert wurden. Abwechselnd durfte jeder Spieler (Panzer) einen Schuss abfeuern. Dabei musst man natürlich zielen, die Schussstärke festlegen und den Wind einkalkulieren. Traf die Kugel auf den Boden, so wurde darunter das Terrain beschädigt. Das lässt sich alles relativ leicht berechnen und vereint schon eine Menge von dir benötiger Komponenten.

Darauf aufbauend kannst du dann dein Spiel aufbauen. Da kommen dann noch einige Sachen wie Bewegungen oder verschiedene Waffen hinzu.
Das Leben ist wie ein Tennisball.
Benutzeravatar
Don Polettone
User
Beiträge: 115
Registriert: Dienstag 23. November 2010, 20:26
Wohnort: Schweiz

Hi EyDu 8)

danke, aber jetzt im Errnst: Alles schon geschehen, und noch mehr. Guggschtu 'judelihudel' auf YouTube.

Pong hab ich nicht hoch und Tanks auch nicht, funzt aber hier auf meiner Kiste, hab ich am Start :D :D nur noch nicht fertig halt, aber spielbar. Auch z.Bsp. Level speichern auf Tastendruck passt, meinen Mario Klon kann man während des Spielens "live" erweitern - Creeps pflanzen, Tiles, PowerUps, alles kann live eingesetzt werden und ist dann da. Das Ganze kann man bis zu 4. spielen mit Controllern - läuft, und smooooth. Und alles quasi "from scratch" - nix Physik Engine, nur mein collision.py Modul. Nicht falsch verstehen - das soll jetzt nicht heissen ich wäre der OberGuru aber hey: Ich will jetzt echt einen Worms/Lemmings Hybrid! Könnt ihr mir nicht meine Fragen beantworten? Das Problem bei mir ist glaub ich, dass ich schon eigentlich weiss, was ich tue, aber ich weiss nicht, wie man dem sagt in Fachkreisen. glaub ich.
Ich code, also bin ich.
deets

Buffer == Konzept fuer das zwischenspeichern von gleichfoermigen Werten aller Arten, zB Bytes, Pixeln, Zahlen... am Ende ja fuer den Computer eh dasselbe. Ganz allgemein, und ueberhaupt nicht bezogen auf pygame.

Wenn du ein Surface mit 320x200 anlegst, da rein deine Sprites kopierst (blittest), und das ganze dann hochskalierst auf die volle Bildschirmaufloesung damit's schoen pixelig ist, dann ist dieses Surface halt "ein Buffer", weil man ein solches Vorgehen nunmal so bezeichnet. Auch "Hintergrundbuffer" fuer das malen in ein unsichtbares Surface, das dann mit pygame.flip in den Vordergrund gebracht wird ist ein "Buffer".

mit frombuffer/tostring und so hat das nicht direkt was zu tun, allerdings kennt auch pygame den Begriff, bzw. Python im allgemeinen, fuer Klumpen von Daten. Eben Buffer... aber so meinte ich das nicht.

Und wenn du mit pygame soweit gluecklich bist, dann benutz es halt. OpenGL ist in dem Moment besser, wo man viel mit Skalierung/Rotation/Transparenz der Bilder arbeiten will.
Benutzeravatar
Don Polettone
User
Beiträge: 115
Registriert: Dienstag 23. November 2010, 20:26
Wohnort: Schweiz

danke deets!

Nein, eigentlich mag ich pygame nicht sonderlich resp. ich weiss es nicht - es ist einfach das einzige (nebst Ruby RGSS), dass ich kenne und etwas damit anzustellen weiss... es kombiniert halt einige sehr grundsätzliche Notwendigkeiten wenn man Games programmieren will. Aber ich möchte schon einen Schritt weiter jetzt. Dann verstehe ich ich es schon richtig, dass OpenGL bei mir pygame ablösen könnte (eben auch ein Display erzeugen etc)? Ich frage mal ganz banal: Welche libraries würdest Du benutzen, um ein hübsches Spiel zu machen, eben zum Beispiel in meinem Fall eine Art Worms? Gibt es "must Have" Libraries?
Ich code, also bin ich.
deets

Ich wuerde durchaus pygame in Erwaegung ziehen. Sonst pyglet, das abstarhiert OpenGL etwas. Aber ehrlich gesagt ist OpenGL vielleicht ein Happen zuviel bei deinem jetzigen Kenntnisstand. Vor allem, weil du auch offensichtlich Pixel-Level-Manipulationen haben willst, und das ist in OpenGL nicht so einfach zu haben, das macht pygame schon ganz gut.

Im uebrigen eine Anmerkung: dein Spiel klingt weniger nach Lemings, sondern eher nach Worms...
Benutzeravatar
Don Polettone
User
Beiträge: 115
Registriert: Dienstag 23. November 2010, 20:26
Wohnort: Schweiz

hi deets,
Im uebrigen eine Anmerkung: dein Spiel klingt weniger nach Lemings, sondern eher nach Worms...
uhm... ja genau - es soll ja eine Lemmings / Worms - Symbiose geben, hatt ich ja geschrieben vorhin.
Vor allem, weil du auch offensichtlich Pixel-Level-Manipulationen haben willst, und das ist in OpenGL nicht so einfach zu haben, das macht pygame schon ganz gut.
Da wäre ich wieder bei meinem Problem - dem Sweeping durch dieses Pixelghetto und ich muss den Aufschlagpunkt haben. Demnach bleibt mir nix, als dies selbst zu coden? Ich hätte schon eine Idee: Ich lass die Kugel (sofort und im selben Frame und nur in Zahlen) Pixel für Pixel auf der Flugbahn fliegen und checke jedes dieser Pixel auf der Surface ab bzgl. alpha, wenn alpha != 0: Bumm. Und da gibt's das Loch. Und ob Lemminge getroffen werden, da könnte man einen Ray durchschiessen mit pybox2d.

Oder mal ganz konkret: Wie würdest Du das angehen? Würd mich echt interessieren! Und noch bzgl. pyOpenGL und auch pybox2D - jetzt im Ernst: Ich fand keine Tutorials! pybox2D kann ich nicht mal installieren... ich hab noch nie was kompiliert und habe keine Ahnung was ein SVN ist, mit Python war sowas nie nötig?
Ich code, also bin ich.
deets

Ich habe das schon geschrieben, wie ich das angehen wuerde - mittels Bresenham, also quasi dein "Pixel fuer Pixel". Allerdings immer nur pro Frame von der aktuellen Position zur Position in diesem Frame - wenn die Kugel eine endliche Geschwindigkeit haben soll, vor der man auch ausweichen kann.

Und Box2D Ray nutzt dir da gar nix, da du ja Pixel als Kollisionsgrundlage hast, das kann Box2D nicht. Das basiert wie schon erwaehnt auf Polygonen.
Benutzeravatar
Don Polettone
User
Beiträge: 115
Registriert: Dienstag 23. November 2010, 20:26
Wohnort: Schweiz

danke deets.

Eigentlich wünschte ich mir schon, dass das Projektil eben keine endliche Geschwindigkeit hat - die Kugel ist unsichtbar und es soll nur deren Auswirkung einen Effekt haben im Spiel - und dies so ziemlich sofort. Eben darum bin ich auf Sweeping hingewiesen worden in diesem Forum. Sonst so Ballerzeugs hab ich schon (etwas) umgesetzt.

Eben dies hatte ich erhofft, irgendwie mit pybox2d lösen zu können, aber eben - ich hab die Site angeschaut und das Tut und ich wollte nur wissen, ob ich das eben richtig verstanden habe, dass es in dieser Form nicht geht mit meinem Problem. Nein, ich habe keine Polygone :K

Aber eben: Wenn ich einfach weiter eintauchen möchte und durchaus OpenGL und pybox2d anschauen möchte - gibt es gute Tutorials? Da scheint echt nicht viel am Start zu sein. Hab in diesem Forum auch geschaut - hab nix gefunden?
Ich code, also bin ich.
deets

Da ich dich auf sweeping hinwies kann ich dir klar sagen: nein, deshalb nicht. Das habe ich dann missverstanden. Wenn's alles in einem einzigen Frame stattfinden soll, brauchst du kein sweeping.

Die Rays von Box2D waeren natuerlich trotzdem geeignet, wenn du zB bounding-boxes verwendest um Level-Teile und Lemminge.
Benutzeravatar
Don Polettone
User
Beiträge: 115
Registriert: Dienstag 23. November 2010, 20:26
Wohnort: Schweiz

Hi deets,

hab's nicht geschafft, pyBox2d zum Laufen zu bringen... ich hab noch nie was kompiliert (war ja mit Python auch nie nötig); und um pybox2d inhalieren zu können, muss man nur schon irgendwie 3 Tools installieren (MSYS und SWIG und so Zeugs) - Du kennst das alles denke ich :D

Egal, ich mache mal da weiter, wo ich aufhörte. Die Idee mit dem Buffer ist geniös, das reduziert natürlich massiv den Rechenaufwand, wenn ich Hitabfragen anhand des Pixel - Alphawerts einer Surface kalkulieren will.

Ich habe nun noch ein / zwei Schritte weiter überlegt und hatte eine strube Idee bzgl. der Lemming - Hitabfragen... ich könnte ja die Lemmings (alle davon) zuerst auch auf einen leeren Buffer blitten, und dann kann die Kugel in einem Frame die Pixel der Flugbahn durchgehen und jeweils sowohl auf der Level- und auf dieser Lemming-Surface anhand der Pixel-Alphas checken, ob zuerst mit einem Lemming, oder aber dem Level eine Kollision stattfindet..? Dann hätte ich schon mal die exakte Hitpos und auch wüsste ich, ob's einen Lem oder das Level trifft (oder Flaute natürlich :mrgreen: ). War nur so eine Idee, aber irgendwie interessant finde ich.

Hab mal ein Vid hochgeladen, wie's im Moment ausschaut - wen's interessiert: http://www.youtube.com/watch?v=3MTifr7zxyU

Ich erlaube mir, gleich noch einen Thread zu posten in Kürze; ein Problem verfolgt mich schon lange und es ist konkret; und für Euch Jungs (und Mädels..?) hier sicher ein Klacks !

Man sieht und hört, danke für die Tipps!


Henry
Ich code, also bin ich.
Antworten