Hallo,
ich kann jeden nur vor diesem "Spiel" warnen, es macht beim ersten Konsum süchtig!
Ich wäre auf jeden Fall dabei, wenn wir einen Clone programmieren wollen. Dabei würde ich Tkinter/Canvas/PIL als erstes versuchen, und wenn das nicht geht eben PyGame.
Beim Canvas wird das aber leider nichts mit Vektorgrafik. Allein aufgrund der Tatsache, dass man die Items nicht drehen kann. So sind Ovale leider immer axialsymmetrisch um die x- und y-Achse. Und nur Kreise sind auch langweilig.
Deshalb würde ich vorschlagen, die Rotationszustände mit einem Set von Einzelbildern zu simulieren. Diese sollten aus Performancegründen bei Programmstart berechnet und zwischengespeichert werden.
Also, wenn es los geht, bin ich dabei!!
Grüße,
Michael
"fl0w in games" clone
- Michael Schneider
- User
- Beiträge: 569
- Registriert: Samstag 8. April 2006, 12:31
- Wohnort: Brandenburg
Diese Nachricht zersört sich in 5 Sekunden selbst ...
schönIch wäre auf jeden Fall dabei, wenn wir einen Clone programmieren wollen.
warum würdest du Tkinter/Canvas/PIL pygame vorziehen?
eine grosse hilfe dürfte die pygame-sprite-klasse mit kollisionsabfrage sein. das müsste man wenn man PIL nutzt ja alles selbst machen.
habe beides noch nie wirklich benutzt, lasse mich also gern eines besseren belehren.
ich habe das pyOde tutorial2 so abgeändert, dass ein kreis der maus folgt, solange der linke button gedrückt ist.
vor allem um zu anfang schnell zu ergebnissen zu kommen wäre ode nützlich, evtl. aber zu langsam.
pyode: http://pyode.sourceforge.net/
euclid: http://partiallydisassembled.net/euclid.html
Code: Alles auswählen
import pygame, ode, euclid
from pygame.locals import *
def get_mouse_event(events):
"""
gibt bei mouseevents die koordainaten
und den status von button1 zurueck
"""
for event in events:
if event.type == MOUSEBUTTONUP:
return {"down":0,"coord":event.dict["pos"][0:2]}
if event.type == MOUSEBUTTONDOWN:
return {"down":1,"coord":event.dict["pos"][0:2]}
if event.type == MOUSEMOTION:
return {"down":event.dict["buttons"][0],"coord":event.dict["pos"][0:2]}
# Initialize pygame
pygame.init()
# Open a display
srf = pygame.display.set_mode( (800,600) )
# Create a world object
world = ode.World()
world.setGravity( (0,0,0) )
# Create a body inside the world
body1 = ode.Body(world)
M = ode.Mass()
M.setSphere(2500.0, 0.05)
M.mass = 1.0
body1.setMass(M)
body1.setPosition( (70,70,0) )
fps = 50
dt = 1.0/fps
clk = pygame.time.Clock()
force_norm = 0 # betrag der kraft
button_down = 0 # linke maustaste gedrueckt?
force = None
cursor_pos = None
while True:
# Clear the screen
srf.fill( (255,255,255) )
body_pos = body1.getPosition()[0:2]
mouse_event = get_mouse_event( pygame.event.get() )
if mouse_event:
button_down = mouse_event["down"]
cursor_pos = [ int(c) for c in mouse_event["coord"] ]
if cursor_pos:
if button_down:
force_norm = 100 # volle kraft voraus
else:
# maustaste nicht gedrueckt: abbremsen
force_norm = force_norm * (1 - 0.0003 * force_norm)
# vektor zischen kreis und cursor
force = euclid.Vector2(cursor_pos[0], cursor_pos[1]) - euclid.Vector2(body_pos[0], body_pos[1])
# vektorbetrag anpassen
force = force_norm * force.normalize()
# eigentlich wollte ich ja setForce nutzen, aber das verhaelt sich seltsam
# die auf den kreis wirkende kraft wird immer groesser!?
# also setze ich direkt v
body1.setLinearVel( (force[0], force[1], 0) )
#body1.setForce( (force[0], force[1], 0) )
world.step(dt)
pygame.draw.circle(srf, (55,0,0), (body_pos[0],body_pos[1]), 20, 0)
pygame.display.flip()
# Next simulation step
world.step(dt)
# Try to keep the specified framerate
clk.tick(fps)
- Michael Schneider
- User
- Beiträge: 569
- Registriert: Samstag 8. April 2006, 12:31
- Wohnort: Brandenburg
Hi Dill,Dill hat geschrieben:schönIch wäre auf jeden Fall dabei, wenn wir einen Clone programmieren wollen.
warum würdest du Tkinter/Canvas/PIL pygame vorziehen?
eine grosse hilfe dürfte die pygame-sprite-klasse mit kollisionsabfrage sein. das müsste man wenn man PIL nutzt ja alles selbst machen.
das hat erstmal zwei Hauptgründe:
1. kenne ich mich in Tkinter (noch) weitaus besser aus - obwohl ich aber tiefer in PyGame einsteigen möchte, und
2. ist es eine Frage der Dependencies. Viele User lassen sich abschrecken, wenn sie für ein Spiel ein halbes Duzend Abhängigkeiten installieren müssen - in der Regel sinkt die Vorfreude proportional zur wachsenden Anzahl zusätzlicher Programmpakete. Daher ist PIL einfacher zu installieren als PyGame + pyOde, wobei man auch auf PIL verzichten kann, wenn man es doch mit Canvasgrafik allein macht.
Für die Kollisionsanalyse gibt es die Canvas.find_xxx-Methoden. In unserem Fall eignet sich wohl Canvasinstanz.find_overlapping(x1,y1,x2,y2) am besten, mit der man alle Items bekommt, die den bezeichneten Bereich berühren.
Ich habe pyOde und Dein Beispiel noch nicht getestet, sorry. Dafür habe ich mal versucht, das Vorgehen mit dem Canvas zu demonstrieren:
http://www.python-forum.de/viewtopic.php?p=61988#61988
Leider macht dieses Script aus irgendwelchen Gründen noch Probleme .
Aber PyGame bietet zweifellos bessere Möglichkeiten zur Maus-, Eingabe-, Soundsteuerung und Grafikkontrolle.
Grüße,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
ich kenne beides nicht, von daher ein punkt für tk. Oder für pygame, falls du dich hier weiterbilden möchtest.Michael Schneider hat geschrieben: 1. kenne ich mich in Tkinter (noch) weitaus besser aus - obwohl ich aber tiefer in PyGame einsteigen möchte, und
das stimmt natürlich, aber man kann ja einen installer bauen, der das in die hand nimmt. oder py2exe nutzen, da hat man dann doch keine probleme mehr mit dependencies, oder?Michael Schneider hat geschrieben: 2. ist es eine Frage der Dependencies. Viele User lassen sich abschrecken, wenn sie für ein Spiel ein halbes Duzend Abhängigkeiten installieren müssen - in der Regel sinkt die Vorfreude proportional zur wachsenden Anzahl zusätzlicher Programmpakete. Daher ist PIL einfacher zu installieren als PyGame + pyOde, wobei man auch auf PIL verzichten kann, wenn man es doch mit Canvasgrafik allein macht.
Michael Schneider hat geschrieben: Für die Kollisionsanalyse gibt es die Canvas.find_xxx-Methoden. In unserem Fall eignet sich wohl Canvasinstanz.find_overlapping(x1,y1,x2,y2) am besten, mit der man alle Items bekommt, die den bezeichneten Bereich berühren.
wie ist es mit der performance? denke pygame ist eher darauf vorbereitet mehrere sprites über den bildschrim zu bewegen - kann dazu jmd was sagen?
und die kollisionsabfrage von pygame sollte besser + schneller sein, als das was wir mit den TK-mittel auf die beine stellen können.
noch was zum thema vektor oder pixel:
vektorgrafiken wären super.
was hätte man zb für freiheiten, wenn man die segmente der kreaturen dynamisch aus beziers aufbaut.
aber da scheint es wohl nichts zu geben, nicht nur in python, sondern überhaupt. einfach zu rechenintensiv. (sieht man ja an der flash-version, flash ist wahrscheinlich recht schnell)
ich habe angefangen das beipsiel oben zu erweitern (statt einem ball bewegent sich eine schlange) ist leider vor dem wochenende nicht mehr fertig geworden, kommt dann Di oder Mi.
Wir könnten das dann mal von pygame in TK portieren und dann weitersehen.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Nein, py2exe bindet alles ein.Dill hat geschrieben:das stimmt natürlich, aber man kann ja einen installer bauen, der das in die hand nimmt. oder py2exe nutzen, da hat man dann doch keine probleme mehr mit dependencies, oder?
Vielleicht eventuell cairo nutzen, dazu gibt es auch ein Python-Binding (Cairo wird von Monos libgdiplus verwendet, ebenso von Gecko 1.8 für SVG und Gecko 1.9 für alles, von GTK+ 2.8 für die meisten Widgets).Dill hat geschrieben:noch was zum thema vektor oder pixel:
vektorgrafiken wären super.
was hätte man zb für freiheiten, wenn man die segmente der kreaturen dynamisch aus beziers aufbaut.
aber da scheint es wohl nichts zu geben, nicht nur in python, sondern überhaupt. einfach zu rechenintensiv. (sieht man ja an der flash-version, flash ist wahrscheinlich recht schnell)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
- Michael Schneider
- User
- Beiträge: 569
- Registriert: Samstag 8. April 2006, 12:31
- Wohnort: Brandenburg
Nun, Flash Media ist ja in der Regel nicht SO anspruchsvoll, und wenn es damit schon Probs gibt, dann liegt das entweder an der Grafikkarte (mein Tip) oder am Programm. Also grob gesagt an der Hardware oder der Software.Leonidas hat geschrieben:Vielleicht mal ohne Pygame probieren?Dill hat geschrieben:es ist nicht schnell genug, evtl. habe ich aber etwas falsch gemacht ...
Grüße,
Michel
Diese Nachricht zersört sich in 5 Sekunden selbst ...
- Michael Schneider
- User
- Beiträge: 569
- Registriert: Samstag 8. April 2006, 12:31
- Wohnort: Brandenburg
Da hast Du recht. Man hat aber nicht immer die Rechte - oder das Vertrauen, beliebige Dinge (Zusatzpakete oder individuelle Kompilierungen) zu installieren. Da wäre es schon nicht schlecht, wenn man alles mit Bordmitteln hinbekäme.Dill hat geschrieben:das stimmt natürlich, aber man kann ja einen installer bauen, der das in die hand nimmt. oder py2exe nutzen, da hat man dann doch keine probleme mehr mit dependencies, oder?
Wie es speziell mit Images/Sprites ist, kann ich nicht sagen. Ich denke, PyGame ist da nur eleganter, nicht aber unbedingt schneller. Schau Dir mal mein aktuelles Prove-of-Concept Programm an und sag mir, welche Auslastung Dein Rechner hat (unten rechts in der Ecke). Du findest den Code hier: http://paste.pocoo.org/show/1213/Dill hat geschrieben:wie ist es mit der performance? denke pygame ist eher darauf vorbereitet mehrere sprites über den bildschrim zu bewegen - kann dazu jmd was sagen?Michael Schneider hat geschrieben: Für die Kollisionsanalyse gibt es die Canvas.find_xxx-Methoden. In unserem Fall eignet sich wohl Canvasinstanz.find_overlapping(x1,y1,x2,y2) am besten, mit der man alle Items bekommt, die den bezeichneten Bereich berühren.
Was bewegt Dich zu dieser Aussage? Letztlich kochen beide nur mit Wasser, bzw. nutzen beide bounding boxes um zu prüfen, ob sich ein Teil überlagert oder nicht.Dill hat geschrieben:und die kollisionsabfrage von pygame sollte besser + schneller sein, als das was wir mit den TK-mittel auf die beine stellen können.
Ganz meine Meinung. Vektor in Canvas trifft sich gut. Muss man eben eine Kurve aus Kreissegmenten mit unterschiedlichen Mittelpunkten und Radien aufbauen.Dill hat geschrieben:noch was zum thema vektor oder pixel:
vektorgrafiken wären super.
was hätte man zb für freiheiten, wenn man die segmente der kreaturen dynamisch aus beziers aufbaut.
Bezierkurven sind nicht unbedingt leicht zu berechnen, es gibt aber sehr performanceschonende Annäherungen. Mit der richtigen Software kann man viele Kurven einfach und komfortabel drehen. Aber willst Du wirklich Figuren und Animationen in Bezier-Kurven beschreiben??
Wie wäre es, wenn wir mein Prove-of-Concept nach PyGame portieren?Dill hat geschrieben:Wir könnten das dann mal von pygame in TK portieren und dann weitersehen.
Grüße,
der Michel
Diese Nachricht zersört sich in 5 Sekunden selbst ...
- mkesper
- User
- Beiträge: 919
- Registriert: Montag 20. November 2006, 15:48
- Wohnort: formerly known as mkallas
- Kontaktdaten:
Wow! Dieses Skript rennt bei mir mit lediglich 10 bis max 20% CPU (Systemmonitor, Anzeige rechts unten: meist 0).Michael Schneider hat geschrieben: Schau Dir mal mein aktuelles Prove-of-Concept Programm an und sag mir, welche Auslastung Dein Rechner hat (unten rechts in der Ecke). Du findest den Code hier: http://paste.pocoo.org/show/1213/
System: Athlon Duron 1100Mhz, GNU/Linux Debian Unstable, Python 2.4.4
Sweet! Habe zu Beginn 9% Auslastung und, wenn alles Plankton verschlungen ist, 4% auf meinem Pentium M (Centrino) mit 1,5 GHz, WinXP, Py2.4 und Py2.5 (beide getestet). Abgelesen an der Anzeige rechts unten.Michael Schneider hat geschrieben:Schau Dir mal mein aktuelles Prove-of-Concept Programm an und sag mir, welche Auslastung Dein Rechner hat (unten rechts in der Ecke). Du findest den Code hier: http://paste.pocoo.org/show/1213/
- Michael Schneider
- User
- Beiträge: 569
- Registriert: Samstag 8. April 2006, 12:31
- Wohnort: Brandenburg
Hi allerseits!
Vielen Dank für eure Beiträge, das finde ich klasse!
Hat noch jemand festgestellt, dass die Zeit sehr langsam verstreicht und als Ergebnis Zeiten von ca. 1 bis 2 Sekunden auftreten? Wie hier bei Apollo13: http://www.python-forum.de/viewtopic.php?p=62301#62301?
Ich gehe davon aus, dass die Originalwerte verwendet werden - obwohl die Einstellungen in CONST keinen Einfluss auf die Zeitmessung haben sollten.
Grüße,
Michel
Vielen Dank für eure Beiträge, das finde ich klasse!
Hat noch jemand festgestellt, dass die Zeit sehr langsam verstreicht und als Ergebnis Zeiten von ca. 1 bis 2 Sekunden auftreten? Wie hier bei Apollo13: http://www.python-forum.de/viewtopic.php?p=62301#62301?
Ich gehe davon aus, dass die Originalwerte verwendet werden - obwohl die Einstellungen in CONST keinen Einfluss auf die Zeitmessung haben sollten.
Grüße,
Michel
Diese Nachricht zersört sich in 5 Sekunden selbst ...
- Michael Schneider
- User
- Beiträge: 569
- Registriert: Samstag 8. April 2006, 12:31
- Wohnort: Brandenburg
Moin,
na sowas. Unter HPUX habe ich nun dasselbe problem. Dabei ändert sich aufgrund des GRID-Managers ständig die Position der Statuszeilenelemente. Mal sehen, woran das liegen kann. Vielleicht funktioniert die time.clock-Methode unter einigen UX-Systemen anders?
Grüße,
Michel
na sowas. Unter HPUX habe ich nun dasselbe problem. Dabei ändert sich aufgrund des GRID-Managers ständig die Position der Statuszeilenelemente. Mal sehen, woran das liegen kann. Vielleicht funktioniert die time.clock-Methode unter einigen UX-Systemen anders?
Grüße,
Michel
Diese Nachricht zersört sich in 5 Sekunden selbst ...
-
- User
- Beiträge: 773
- Registriert: Mittwoch 5. November 2003, 18:06
- Wohnort: Schweiz
- Kontaktdaten:
Hi
Schau hier:
http://www.python-forum.de/topic-4268.h ... light=time
Da bin ich vor langem mal in die selbe Falle gerannt
Gruss
Schau hier:
http://www.python-forum.de/topic-4268.h ... light=time
Da bin ich vor langem mal in die selbe Falle gerannt
Gruss
- Michael Schneider
- User
- Beiträge: 569
- Registriert: Samstag 8. April 2006, 12:31
- Wohnort: Brandenburg
Hi Rayo,
ja, habe es gerade getestet und bin auf dasselbe Ergebnis gekommen.
Nachdem ich ".clock" durch ".time" ersetzte, lief es einwandfrei. Aber das kommt ja auch in dem von Dir angeführten Thread zum Ausdruck.
Ich dachte immer, dass clock genauer ist als time und da ich mit Bruchteilen von Sekunden rechne, habe ich es verwendet.
Nunja, dann sind wir wieder etwas schlauer.
Grüße,
Michel
ja, habe es gerade getestet und bin auf dasselbe Ergebnis gekommen.
Nachdem ich ".clock" durch ".time" ersetzte, lief es einwandfrei. Aber das kommt ja auch in dem von Dir angeführten Thread zum Ausdruck.
Ich dachte immer, dass clock genauer ist als time und da ich mit Bruchteilen von Sekunden rechne, habe ich es verwendet.
Nunja, dann sind wir wieder etwas schlauer.
Grüße,
Michel
Diese Nachricht zersört sich in 5 Sekunden selbst ...
- Michael Schneider
- User
- Beiträge: 569
- Registriert: Samstag 8. April 2006, 12:31
- Wohnort: Brandenburg
Moin Dill,Dill hat geschrieben:habe das grade aml getestet, sieht doch schon sehr schick aus
sobald ich etwas luft habe, mache ich was ähnliches mit pygame.
sieht aber zeitmässig grad sehr mau aus bei mir
da wir beide dasselbe vor haben, würde ich vorschlagen, dass wir am selben Strang ziehen. Und da Du offenbar darauf bestehst, mit PyGame anzufangen... warum nicht.
Ich muss aber dieses PyOde erst besorgen. Hast Du Dir schon Gedanken gemacht, wie Du die Kurven und Animationen als Vectorgrafiken hinbekommen möchtest? Habe da eine Idee, aber ich möchte Deine Kreativität nicht behindern.
Grüße,
Michel
Diese Nachricht zersört sich in 5 Sekunden selbst ...
ich bestehe nicht auf pygame.
ich würde mir nur gerne mehrere ansätze ansehen bevor es losgeht.
ich würde mir nur gerne mehrere ansätze ansehen bevor es losgeht.
wenn du eine idee hast immer her damitIch muss aber dieses PyOde erst besorgen. Hast Du Dir schon Gedanken gemacht, wie Du die Kurven und Animationen als Vectorgrafiken hinbekommen möchtest? Habe da eine Idee, aber ich möchte Deine Kreativität nicht behindern