"fl0w in games" clone

Du hast eine Idee für ein Projekt?
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

Ich wäre auf jeden Fall dabei, wenn wir einen Clone programmieren wollen.
schön :)


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)
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

Dill hat geschrieben:
Ich wäre auf jeden Fall dabei, wenn wir einen Clone programmieren wollen.
schön :)


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.
Hi Dill,

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 :cry:.

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 ...
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

Michael Schneider hat geschrieben: 1. kenne ich mich in Tkinter (noch) weitaus besser aus - obwohl ich aber tiefer in PyGame einsteigen möchte, und
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: 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.
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: 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. :shock:
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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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?
Nein, py2exe bindet alles ein.
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. :shock:
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)
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).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

Cairo habe ich schon getestet. siehe posting weiter oben (seite 1).
es ist nicht schnell genug, evtl. habe ich aber etwas falsch gemacht ...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dill hat geschrieben:es ist nicht schnell genug, evtl. habe ich aber etwas falsch gemacht ...
Vielleicht mal ohne Pygame probieren?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

Leonidas hat geschrieben:
Dill hat geschrieben:es ist nicht schnell genug, evtl. habe ich aber etwas falsch gemacht ...
Vielleicht mal ohne Pygame probieren?
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. 8)

Grüße,
Michel
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

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?
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:
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?
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:und die kollisionsabfrage von pygame sollte besser + schneller sein, als das was wir mit den TK-mittel auf die beine stellen können.
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: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. :shock:
Ganz meine Meinung. Vektor in Canvas trifft sich gut. Muss man eben eine Kurve aus Kreissegmenten mit unterschiedlichen Mittelpunkten und Radien aufbauen.
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?? :shock:
Dill hat geschrieben:Wir könnten das dann mal von pygame in TK portieren und dann weitersehen.
Wie wäre es, wenn wir mein Prove-of-Concept nach PyGame portieren? ;-)

Grüße,
der Michel
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

bin bis mo abend unterwegs unter kann mir deine neue version jetzt nicht ansehehn.
melde ich Di wieder!
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

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/
Wow! Dieses Skript rennt bei mir mit lediglich 10 bis max 20% CPU (Systemmonitor, Anzeige rechts unten: meist 0).
System: Athlon Duron 1100Mhz, GNU/Linux Debian Unstable, Python 2.4.4
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

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/
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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ohne das Spiel jetzt getestet zu haben (ich habe kein Tkinter installiert... nirgendwo): ist Flash denn so dramatisch langsam?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
rayo
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
Benutzeravatar
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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

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 :(
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

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 :(
Moin Dill,

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 ...
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

ich bestehe nicht auf pygame.
ich würde mir nur gerne mehrere ansätze ansehen bevor es losgeht.
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
wenn du eine idee hast immer her damit :)
Antworten