Pygame für Aufbaustrategie?

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Arp
User
Beiträge: 65
Registriert: Dienstag 15. März 2011, 13:21

Hi,

ich hatte neulich wieder einmal die verrückte Idee mir doch mal ein eigenes Spiel zu programmieren :)
Als genre denke ich da so an ein aufbau / strategiespiel mit der Grafik im Stil von Anno oder Fallout 1/2.

Allerdings hab ich nun noch nie sowas im entferntesten Versucht und stehe nun vor einem riesigen Berg in den der erste Nagel zum besteigen geschlagen werden muss.

Kann pygame sowas? Es sollten natürlich auch ein paar Animationen zwischendurch vorkommen.
Ich hab von einer kostenlosen Engine namens FIFE gelesen die wohl von der Grafik her sehr gut dafür geeignet ist, aber für FIFE gibts offenbar so gut wie gar keine Tutorials um einen Einstieg zu finden.

Für Pygame gibt es viel mehr, aber wäre Pygame in der Lage das überhaupt hinzukriegen? Wenn ich z.b. irgendwann in der fernen, fernen Zukunft viele Einheiten in einem Frame habe, kann das Pygame dann noch bei ca. 30 fps darstellen ohne das man dafür gleich einen Supercomputer braucht?

Falls ihr meint das Pygame das könnte, kennt ihr irgendwo ein gutes tutorial, am besten Bildern dazu? Für den Anfang würde es mir reichen eine map zu programmieren, also nur eine fläche, auf der ich mit der Maus eine Einheit bewegen kann. Von da an ist der Rest, glaube ich, nicht mehr all zu schwer.

Thx.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Schau Dir doch mal Unknown Horizons an! Die machen eine Art Anno mittels der FIVE-Engine.

Generell kann man mit Pygame viel machen. Ich würde da jetzt mal Bedenken wegen des Speeds ausklammern. Gute Tutorials für pygame sind leider rar...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Arp
User
Beiträge: 65
Registriert: Dienstag 15. März 2011, 13:21

Hab Unknown Horizons schon gesehen, und die Screenshots sehen schon sehr gut aus. So bin ich ja erst auf FIFE gekommen. Nur was mich da zurückschreckt, ist das selbst auf der Entwicklerseite von FIFE nur 2 oder 3 guides sind die sich aber nur mit installation und initialisierung oder so befassen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hm... naja, Du könntest ja erst mal gucken, wie weit Du da kommst. Zudem postet ein Entwickler hier ab und an. Insofern kann man sich sicherlich auch mal an die wenden und Fragen stellen.

Die Frage ist immer, wo Du Deinen Fokus siehst und wo Du den Spaß rausziehst. Mit einer "fertigen" Eingine kommst Du halt schneller zu etwas, was sich spielen lässt. Zudem kannst Du Dich voll und ganz auf Deine Ideen konzentrieren. Wenn Du erst die Engine baust, dann ist das alles viel umständlicher; zumal Du erst zig Versuche unternehmen wirst, die Du stark überarbeiten wirst, weil Du später erkennst, was Du anders / sinnvoller hättest machen sollen.

Ist auch die Frage, wie animiert das ganze denn sein soll. Aufbaustrategie kann ja auch eher so in Richtung SimCity1 gehen... da bewegte sich ja auch nicht so viel ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Arp
User
Beiträge: 65
Registriert: Dienstag 15. März 2011, 13:21

Hmm. Der Animationslevel ist in meiner Vorstellung auf dem Niveau von Anno 1602. Da bewegten sich ein paar sachen, Wasser, die Umgebung minimal, Einheiten hatten eine handvoll mögliche Animationsmöglichkeiten. Mehr will ich auch nicht. Es soll kein High Tech ala Command & Concquer oder Starcraft werden.

Ich glaube ich gebe Pygame mal einen versuch, zumindest gibt es mehr tutorials dafür als für FIFE.
Erkenbrand
User
Beiträge: 15
Registriert: Sonntag 12. September 2010, 17:18

Hallo,

für pygame solltest du dir auf alle fälle diese Seite ansehen http://bytemuehle.de.

Ein Rat für Größere Projekte: pygame Doku ausdrucken (zwecks Augenschonung xD)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Erkenbrand hat geschrieben: für pygame solltest du dir auf alle fälle diese Seite ansehen http://bytemuehle.de.
Für den ersten simplen Einstieg ganz nett, aber auch hier sieht man dieses große hässliche main-Loop-Konstrukt. Um eine bessere Struktur in sein pygame-Projekt zu bekommen empfehle ich diese Seite hier: Link

Auch wenn dort Namenskonventionen teilweise mit Füßen getreten werden und einige Sachen zu stark abstrahiert werden, so bietet sie doch eine Idee, wie man seine Event-Loop besser strukturieren kann.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Arp
User
Beiträge: 65
Registriert: Dienstag 15. März 2011, 13:21

Ich hab jetzt mein erstes "Spiel".... ich kann einen Ball wegen und zeugs ausweichen.... wow :D

Aber nun mal zum eigentlichen Ziel. 2D Strategie....

Kann man hier irgendwer beschreiben wie die Darstellung von sowas gemacht wird? Hat Pygame da irgendwelche Methoden um eine Map zu erstellen, oder muss ich wirklich meine Map (z.b als array) anlegen, und dann auf eine 2D ebene projezieren?

Ich hab ja ne gute (oder auch grobe) idee wie die Spiellogik an sich abläuft, aber grad keine Ahnung wie die Darstellung (speziell als 2D Map) funktioniert...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Arp hat geschrieben: Kann man hier irgendwer beschreiben wie die Darstellung von sowas gemacht wird? Hat Pygame da irgendwelche Methoden um eine Map zu erstellen, oder muss ich wirklich meine Map (z.b als array) anlegen, und dann auf eine 2D ebene projezieren?
Das musst Du alles selber erledigen!

Ich habe ja weiter oben schon ein Plädoyer für die Benutzung einer Engine gehalten ;-) Es kommt hier halt viel Arbeit auf Dich zu, die im Grunde genommen nix mit Deinem eigentlichen Ziel zu tun hat. Wobei das einfache Verwalten einer Map ja nix mit pygame direkt zu tun hat. Insofern kann man da auch nur zur Abstraktion raten: Mache Deine Logik und Deine Map nicht von pygame abhängig, sondern implementiere das unabhängig und nutze das dann im pygame-Frontend nur.

Edit: Evtl. baust Du erst einmal die grundlegenden Teile des Spiels ohne pygame? Die Ausgabe kannst Du ja erst einmal mit Textzeichen in einer Shell darstellen. Natürlich fehlen dann Animationen und Du hast kein Maus-Interface, aber zum Testen der Logik und dem Implementieren der Spielmechanik sollte das ja erst einmal reichen. Vorteil: Du kommst schnell voran und bist dann motiviert, das ganze mit einer netten Grafik zu versehen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Erkenbrand
User
Beiträge: 15
Registriert: Sonntag 12. September 2010, 17:18

Hi,

du solltest dir auch überlegen, wie deine Map dargestellt werden soll,
z.b von oben oder als isometrische Ansicht.
Den davon hängt auch ab wie du deinen Code schreiben musst.

Normalerweise werden bei 2d spielen das ganze dann über Tiles gemacht.

Hier ein tut über Tiles in pygame http://www.spieleprogrammierer.de/27-t ... post94659
ich würde dir aber auch raten erst die grundlegenden Teile zu programmieren.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Erkenbrand hat geschrieben: du solltest dir auch überlegen, wie deine Map dargestellt werden soll,
z.b von oben oder als isometrische Ansicht.
Den davon hängt auch ab wie du deinen Code schreiben musst.
Für die Datenorganisation ist das vollkommen egal. Für die Darstellung natürlich nicht. Aber ersteres kommt vor dem zweiteren ;-)
Erkenbrand hat geschrieben: Hier ein tut über Tiles in pygame http://www.spieleprogrammierer.de/27-t ... post94659
Das Ding lässt sich einfach umschreiben: Grauenvoll! :evil:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Erkenbrand
User
Beiträge: 15
Registriert: Sonntag 12. September 2010, 17:18

Für die Datenorganisation ist das vollkommen egal
das kommt drauf an ob man die Position der Teiles zur Datenorganisation zählt,
da bei einer iso map die Positionen immerhin umgerechnet werden müssen.

Code: Alles auswählen

        01 
      06  02  
    11  07  03  
  16  12  08  04
 21 17   13  09  05
  22  18  14  10
    23  19  15  
      24  20  
        25
BlackJack

@Erkenbrand: Ob das am Ende als „flache” Karte oder isometrisch dargestellt wird, macht für die Datenorganisation keinen Unterschied. In beiden Fällen muss man Positionen für die Grafik berechnen.
Pyanfänger
User
Beiträge: 99
Registriert: Mittwoch 28. Dezember 2011, 12:50

@Arp hast du skype :D ?
-
BlackJack

@Pyanfänger: Das hättest Du auch per PN fragen können. Das hätte nicht das alte Thema wieder nach oben geholt und hat oft auch grössere Chancen, dass der Adressat es auch mitbekommt.
waschecht
User
Beiträge: 4
Registriert: Sonntag 3. Juni 2012, 13:55

Hyperion hat geschrieben: Für den ersten simplen Einstieg ganz nett, aber auch hier sieht man dieses große hässliche main-Loop-Konstrukt. Um eine bessere Struktur in sein pygame-Projekt zu bekommen empfehle ich diese Seite hier: Link
Hallo,
ich hab ein paar Fragen zu dem Beispiel.
Vorab, ich habe wenig Erfahrung Python und Programmierung, allerdings gutes mathematisches Wissen. Bisher hab ich so Dinge wie, Listen sortieren, XML lesen und schreiben, Iconbuttons erstellen und Events drauflegen gemacht.
Ich würde nun gerne das ganze in ein größeres Projekt einbringen. Ziel soll ein Klon eines Wirtschaftsspiels aus den 80er/90er Jahren mit vielen Menues sein. Getestet hab ich pyglet, cocos2d und jetzt pygame. Letzteres scheint mir (aus meiner Sicht) einfacher, weswegen ich mich dazu entschieden habe.

Zu der Frage:
Wie ich das sehe, dient der eventmanger zur Steuerung des gesamten Programms. Soweit okay, ich hab auch recht einfach neue events einzufügen und ansteuern können.
In einem anderen Beispiel sah ich aber, dass auch ein neuer Controller (RoomController) hinzugefügt wurde. Damit sollten andere Räume (also auch Menüs) betreten werden können. Ich bin nun etwas verwirrt, weil ich dachte, alles über den Eventmanager regeln zu können.
Wie läuft das mit diesem Ansatz genau? Was braucht man, um effizent an verschiedenen Menuescenen zu arbeiten?

Vielleicht hat jemand eine gute Antwort oder einen verständlichen Link!
Danke schon mal!

PS: Hoffe das war halbwegs verständlich.
BlackJack

@waschecht: Der Eventmanager, im ersten Diagramm ja noch Mediator genannt, vermittelt nur die Events zwischen Sendern und Empfängern. Der steuert nichts. Also brauchst Du wenn Du Räume steuern willst, einen Controller dafür. Wobei mir jetzt nicht ganz klar ist was für Dich oder das Beispiel Räume sind, und warum ein Raum auch ein Menü sein soll. Lass uns also lieber über einen MenuController reden, hinter dem ein Modell von einem Menü mit Menüpunkten und eventuell Untermenüs steht. Der sich beim Eventmanager wahrscheinlich als Listener für Tastendrücke, Mausbewegungen, und Mausklicks registrieren. Und selbst wird er Ergeignisse wie „Neues Menü”, „Menüpunkt X ist ausgewählt”, „Menüpunkt X ist aktiviert” und so weiter versenden. In dem Tutorial kommen ja solche Beispiele vor.

Da sind wir aber schon fast dabei ein eigenes Menü- oder vielleicht sogar Fenstersystem zu entwickeln. Ich glaube das würde ich nicht machen wenn ich ein Spiel implementieren wollte. Dann kommt man nämlich nicht zum Spiel selbst sondern macht einen riesigen Nebenkriegsschauplatz auf. Gerade wenn man das so entkoppelt wie möglich machen möchte wie in dem Tutorial, kann man sich da endlos in Detailfragen verzetteln und bekommt nichts Spielbares auf die Reihe.

Ich würde mir da ein fertiges Rahmenwerk suchen. Und wahrscheinlich nicht das aus dem Tutorial, denn da sind einige Sachen drin die nicht nach Python aussehen. Der macht das offenbar noch nicht lange, und da ist vielleicht mehr Java oder C# als Python drin. Mal ein Beispiel:

Code: Alles auswählen

    def Connect(self, eventDict):
        for key,event in eventDict.iteritems():
            try:
                self.__setattr__( key, event )
            except AttributeError:
                print "Couldn't connect the ", key
                pass
Das ``pass`` ist unsinnig. Die Fehlerbehandlung ist keine, denn wenn man ein Event nicht verbinden konnte, sollte man das vielleicht nicht einfach nur ausgeben, aber ansonsten „verschlucken”. Ausserdem frage ich mich wann dieser `AttributeError` eigentlich überhaupt auftreten kann‽ Dann sollte man die „magischen” Attribute vermeiden wenn man das gleiche ohne erreichen kann. In diesem Fall also die `setattr()`-Funktion. Oder man macht es wissentlich und absichtlich magisch, dann würde man aber direkt das `__dict__`-Attribut aktualisieren. Was mir dabei semantisch nicht gefällt, ist das man aufpassen muss keine Attribute von der Klasse oder ihren Basisklassen damit zu verdecken. Da ist nicht nur eigener Code bei, sondern das ganze erbt von der `Sprite`-Klasse aus `pygame`. Man hat also nicht mal sicher unter Kontrolle welche Attribute es da geben könnte, sondern hängt von einer Bibliothek von jemand anderem ab.

Ansonsten wird auf Wörterbüchern öfter die `keys()`-Methode aufgerufen wo das gar nicht nötig ist. Statt Wahrheitswerten wird 0 und 1 verwendet. Irgendwo gibt es `__text` als Attributnamen…
waschecht
User
Beiträge: 4
Registriert: Sonntag 3. Juni 2012, 13:55

An welches Framework denkst du?
Ich hab natürlich auch schon fertige Software ausprobiert, also sowas wie Game Develop und co. Blender und Panda hab ich auch angeschaut. Letztere sind etwas zu überdimensioniert, weil ich eigentlich nur Bilder, Tabellen, Buttons und Slider benötige. Game Develop ist einfach zu unflexibel, war zumindest mein erster Eindruck.

Für pyglet gibt es kein geeignetes GUI. Bei pygame gibt es zumindest 2 die in Frage kommen.

Also die Rooms sind wohl Räume in einem RPG, die man durchgehen kann, darunter auch Menues. Mich erinnert das eher an eine State Engine, ähnlich wie bei Cocos die Scenes. Beispiel hier
BlackJack

@waschecht: Ich dachte an kein konkretes Rahmenwerk. Kenne keines für `pygame`. Wie wichtig ist denn überhaupt Grafik bei Dir? Ein Wirtschaftsspiel aus den 80/90ern könnte man vielleicht ja auch mit einem normalen GUI-Toolkit umsetzen. Bilder, Tabellen, Buttons, und Slider gibt es da einfacher als bei `pygame`.
waschecht
User
Beiträge: 4
Registriert: Sonntag 3. Juni 2012, 13:55

Graphik ist eher nebensächlich, zB Animationen hab ich erstmal gar nicht auf dem Plan, zeichnen werde ich wohl bei Graphen wie zB GuV über Zeit. Nach meiner Vorstellung sollte es momentan mausgesteuert sein und daher würde ich - wenn man es in Anlehnung an HTML so nennen will - auch lieber "Graphik-Links" statt "Text-Links" haben.
Paar Bilder sollten schon vorhanden sein, für einen gewissen Flair. Aber alles statische Bilder.

Bevor ich pygame ins Visier nahm, hab ich auch wxwidgets und tkinter angesehen. Da kam aber nicht so der Flair auf. Bei pygame würde ich ocempgui nutzen, die lief bei mir gut, wobei ich zugegeben nur die Beispiele angesehen habe und passendes auf meine Bedürfnisse zugschnitten habe. Also Vorauswahl.

Das Entscheidende wäre für mich, dass ich ein halbwegs brauchbares Grundgerüst habe, dass einfach erweiterbar ist. Also funktionierndes Gerüst, an das einfach neue Menues und Funktionen drangepappt werden können. Idealerweise neuen Event anmelden, View programmieren und dann das Modell dazu.
Ein "Menüsystem" hab ich textbasiert mit Python gemacht, da gerät aber der Code insgesamt ziemlich aus den Fugen und wird unübersichtlich (trotz Splittung in verschiedene Dateien). Weil ich eben auch eher prozedural programmiert habe.

Ich denke, ich werde das mit der State-Engine nochmal genauer anschauen. Im Moment fehlt mir glaube ich noch der Gesamtüberblick.


Kann man denn mit vorhandenen PythonGUIs einfach imagebuttons erzeugen? Das wäre eine echte Alternative.
Antworten