Pygame Spiel

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
mhfu
User
Beiträge: 7
Registriert: Dienstag 20. September 2011, 17:34
Kontaktdaten:

Moin, habe vor kurzem begonnen Python und Pygame gelernt und habe ein kleines Problem mit Pygame.
Will dass wenn 1 Zielscheibe abgeschossen wird eine neue kommt geht aber nicht hoffe auf hilfe!!!!!
Verzeiht mir wenn es eine unsinnige Frage ist Programmiere noch net so lang.

Code: Alles auswählen

import pygame, sys, random                                                      
           
        
class MyObjectClass(pygame.sprite.Sprite):  
    def __init__(self, location):                                        
        pygame.sprite.Sprite.__init__(self)          
        image_surface = pygame.surface.Surface([5, 5], 8)                
        image_surface.fill([0,0,0])                                      
        self.image = image_surface.convert()
        self.rect = self.image.get_rect()                          
        self.rect.left, self.rect.top = location                        
 
size = width, height = 640, 640                                        
screen = pygame.display.set_mode(size)
screen.fill([255, 255, 255])                                    
gegner = pygame.image.load("zielscheibe.jpg") 
gegner1 = pygame.image.load("zielscheibe.jpg")
object = MyObjectClass([320, 320])                                          
group = pygame.sprite.Group()
gedrueckt = False 
ort = random.randint(50, 590)
ort1 = random.randint(50, 590)
ort2 = random.randint(50, 590)
ort3 = random.randint(50, 590)
screen.blit(gegner, [ort, ort1])
pygame.display.flip()

while 1:   
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
            
        elif event.type == pygame.MOUSEMOTION:                   
            object.rect.centery = event.pos[1]
            object.rect.centerx = event.pos[0]
        screen.fill([255, 255, 255])
        if event.type == gedrueckt and pygame.sprite.spritecollide(object, gegner, 1):
            gegner.kill()
            pygame.time.delay()
            screen.blit(gegner1, [ort2, ort3])
            pygame.display.flip()
        elif event.type == pygame.MOUSEBUTTONUP:
            gedrueckt = False                       
            pass
            if not gedrueckt: 
             screen.blit(object.image, object.rect)
             pygame.display.flip()





danke schonmal im Voraus :mrgreen:
Entschuldige mich im voraus für: Rechtschreibfehler, dumme Fragen, dumme Antworten

http://mhfu.cwsurf.de
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hallo und Willkommen im Forum!

Also zunächst einmal ist es wenig sinnvoll, so "schnell" bereits auf pygame zu setzen. Threads dazu finden sich genügend im Forum; evtl. sogar in den angepinnten Threads im "Allgemeinen Fragen"-Forum.

Nun zu Deinem Problem: Du musst das ganze wesentlich besser beschreiben! "Geht aber nicht" ist nun mal keine gehaltvolle Fehlerbeschreibung, gel ;-)

Schildere einfach, was passieren soll und dann, was bisher passiert. Ggf. bebilderst Du das noch mit Screenshots und / oder einer Skizze mit ASCII-Zeichen. Dein Code sieht zwar prinzipiell lauffähig aus, aber ohne ein passendes Bild können wir das auch nicht wirklich nachvollziehen.

Dein Code sieht insgesamt auch wenig strukturiert aus; `gegner` und `gegner1` sowie die div. `ortx` lassen darauf schließen, dass Dir noch Grundlagen von Python fehlen (Stichwort Listen und andere Datenstrukturen) ebenso wie die Verwendung von `object`, welches ein Built-in überschreibt.

Generell wäre mein Ratschlag, pygame erst einmal links liegen zu lassen und Dir die Grundlagen mittels Konsolen-Apps anzueignen.

Zum Problem wäre es toll, wenn Du den geplanten und den tatsächlichen Ablauf genauer beschreibst, so dass man sich dann anhand dieser Beschreibungen und dem Code an die Fehlersuche machen kann.

Edit: Wie ich jetzt gesehen habe, wird der if-Zweig `if event.type == gedrueckt` natürlich nie ausgeführt... gedrueckt ist eben kein gültiges pygame Event! Wenn Du so etwas nicht siehst, dann kannst Du einfach ein `print` Statement in den Rumpf schreiben; wenn das bei der erwarteten Konstellation nicht ausgeführt wird, siehst Du schnell, dass es da irgendwo hakt. Im zweiten Teil der Bedingung sind auch noch Bugs enthalten btw. - `gegner` ist kein Sprite!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mhfu
User
Beiträge: 7
Registriert: Dienstag 20. September 2011, 17:34
Kontaktdaten:

Wie sollte der text denn dan ungefahr aussehen? ?
Entschuldige mich im voraus für: Rechtschreibfehler, dumme Fragen, dumme Antworten

http://mhfu.cwsurf.de
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

mhfu hat geschrieben:Wie sollte der text denn dan ungefahr aussehen? ?
Hä? Welcher Text?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mhfu
User
Beiträge: 7
Registriert: Dienstag 20. September 2011, 17:34
Kontaktdaten:

ÄHHHHHHHH........
Sry der gesamte Code......
Entschuldige mich im voraus für: Rechtschreibfehler, dumme Fragen, dumme Antworten

http://mhfu.cwsurf.de
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

mhfu hat geschrieben:ÄHHHHHHHH........
Sry der gesamte Code......
Ich verstehe nur Bahnhof! Hast Du meinen (ersten) Beitrag mal gelesen? Da habe ich Dich doch darauf hingewiesen, dass Du Dir Mühe geben musst, Deine Fragen und Probleme auszuformulieren. So wird das nix...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mhfu
User
Beiträge: 7
Registriert: Dienstag 20. September 2011, 17:34
Kontaktdaten:

Also ich würde gern ein spiel indem man auf ein objekt klickt un des verschwindet Programmieren, und habe das Problem dass die nächste zielschebe nicht kommt wenn man die andere trifft .
Ich glaube dass das Problem in diesem Teil des Codes liegt.

Code: Alles auswählen

if object == gedrueckt and pygame.sprite.spritecollide(object, gegner, 1):
            gegner.kill()
            pygame.time.delay()
            screen.blit(gegner1, [ort2, ort3])
            pygame.display.flip()
Nehmt als Bild irgend ein belibiges das um die 300x300 px hatt
Habe hier schon das object statt event.type eingesetzt
Entschuldige mich im voraus für: Rechtschreibfehler, dumme Fragen, dumme Antworten

http://mhfu.cwsurf.de
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich habe Dir ja schon Tipps gegeben... was soll das `object == gedrueckt` denn bewirken? Zum einen ist der Name schlecht (schrieb ich ja auch schon), zum anderen merkst Du Dir in `gedrueckt` doch Boolesche Werte! Was soll da ein Vergleich zu einem (beliebigen) anderen Objekt bewirken?

Generell: So wird das alles nix! Lerne die Grundlagen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
deets

Das Problem ist, dass du das nicht selbst programmiert hast, sondern dir etwas aus dem Netz gezogen hast. Und dann darauf eingehaemmert, in der Hoffnung es kaeme ein Kunstwerk heraus.

Und auch wenn ich Hyperion nicht unbedingt zustimme darin, dass du die Finger von pygame zum lernen lassen solltest (weil ohne Motivation fuer etwas konkretes ist lernen schwierig IMHO), so hat er doch vollkommen recht damit, dass du erstmal ein Python-Tutorial und dann die Pygame-Tutorials durcharbeiten solltest.

Denn so laeuft das hier darauf hinaus, dass wir dir etwas programmieren sollen. Und sowas wird in unserer arbeitsteiligen Gesellschaft ueblicherweise gegen Geld geregelt.
mhfu
User
Beiträge: 7
Registriert: Dienstag 20. September 2011, 17:34
Kontaktdaten:

okay danke werde jetzt nochmal ein bisschen Googlen und werde nochmal alles von vorne lernen ....
danke
Entschuldige mich im voraus für: Rechtschreibfehler, dumme Fragen, dumme Antworten

http://mhfu.cwsurf.de
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

deets hat geschrieben: Und auch wenn ich Hyperion nicht unbedingt zustimme darin, dass du die Finger von pygame zum lernen lassen solltest (weil ohne Motivation fuer etwas konkretes ist lernen schwierig IMHO), so hat er doch vollkommen recht damit, dass du erstmal ein Python-Tutorial und dann die Pygame-Tutorials durcharbeiten solltest.
Bei vielen ist die Motivation doch ein eigenes Spiel zu programmieren. Das kann doch aber auch auf der Konsole umsetzen. Sound und Grafik muss man sich eben dann erst einmal vorstellen ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
deets

@Hyperion

Meine ersten Gehversuche in 68K-Assembler (und damit ueberhaupt programmieren) waren motiviert von einem 68tausender-Magazin-Artikel von "The Exceptions[tex]", welche einen Horizontalscroller auf dem ST vorgestellt haben (mit cleveren bit-shift-Tricks).

Ist natuerlich grandios gescheitert, aber die Triebfeder war immer, bunte Pixel auf dem Bildschirm zu haben. Textkonsole mit Fibonacci-Zahlen oder so hat mich halt nicht fasziniert.

Und insofern finde ich es schon voellig ok, die ersten Gehversuche gleich mit pygame zu machen. Hello-World geht ja auch da in 5 Zeilen oder so. Und sobald man ein bisschen mehr Sicherheit mit der Sprache hat, ist man sicher auch eher bereit, mal ein komplexeres Problem erstmal "abstrakt" zu loesen. Aber den Kontext einer konkreten Anwendung brauche ich zumindest schon immer, und ich denke das geht vielen so.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@deets: Ich habe auf dem C64 angefangen und habe da tatsächlich erst kleine Textadventures programmiert. Relativ schnell dann auch Spielchen mit Sprites und simpler ASCII-Grafik. Insofern habe ich da durchaus Verständnis für die Idee, grafische Programme möglichst früh zu kreieren. Leider ist pygame an sich imho sehr sperrig! Der Overhead ist einfach zu groß für einen Anfänger. Hier fehlt so eine Art Bottle / Flask für pygame ;-)

Vielleicht müsste man auch mal das wiki um einen Artikel ergänzen, der simple Shell-Spiele / Apps für Einsteiger präsentiert und verschiedene Ansätze und Umsetzungen zeigt. So kann man sich ggf. auch Ideen holen und sich motiviert fühlen, selber das ein oder andere in Angriff zu nehmen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
deets

Ja, das stimmt schon, da ist eine Menge Boilerplate der letztlich nach Magie aussieht. In der Java-Welt gibt es mit processing etwas, das den Einstieg in die Programmierung grafischer Anwendungen viel leichter macht. Fuer OSX gibt's sowas aehnliches in Python:

http://nodebox.net/code/index.php/Home

Wenn man sowas mal plattformuebergreifend hinbekaem, waere schon toll. Allerdings wuerde ich das eher mit Qt oder so machen, denn die Rendering-Faehigkeiten von Pygame sind doch eher... bescheiden.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

deets hat geschrieben:Ja, das stimmt schon, da ist eine Menge Boilerplate der letztlich nach Magie aussieht.
Ich fand jetzt pygame eher einfach, was den Einstieg anging. Pygame initialisieren, Bildschirm bzw. Fenster öffnen, dann in einer Schleife nach Events fragen, den Bildschirm malen, Surfaces flippen und wieder die Schleife von vorn beginnen.
In der Java-Welt gibt es mit processing etwas, das den Einstieg in die Programmierung grafischer Anwendungen viel leichter macht. Fuer OSX gibt's sowas aehnliches in Python:

http://nodebox.net/code/index.php/Home

Wenn man sowas mal plattformuebergreifend hinbekaem, waere schon toll.
Auf dieser Seite wird unten auf http://beta.nodebox.net/ hingewiesen, und das gibt es für OS/X, Windows und mit ein bisschen fummeln für Linux. Die schreiben zwar, dass Nodebox-Programme in Python erstellt werden können, doch im Git-Repo finde ich hauptsächlich (98%) Java. Offenbar ist das Tool also komplett in Java geschrieben und damit plattformübergreifend. Es wird Jython 2.5.2 benutzt.

Stefan
deets

sma hat geschrieben: Ich fand jetzt pygame eher einfach, was den Einstieg anging. Pygame initialisieren, Bildschirm bzw. Fenster öffnen, dann in einer Schleife nach Events fragen, den Bildschirm malen, Surfaces flippen und wieder die Schleife von vorn beginnen.
Und jetzt versuch dir mal vorzustellen, wie jemand, der keine Ahnung vom Programmieren hat diesen Satz liest.... natuerlich ist das fuer unsereins nix. Aber fuer jemanden, der keine Ahnung hat eine richtige Huerde. Processing/NodBox haben dann halt ihren frame-call, und darin kannst du erstmal einfach was malen. Bumsfallera. Dann noch den setup-call dazu, und so weiter...

Auch Projekte wie der Arduino leben davon, dass die erste Huerde so niedrig ist, dass *jeder* ein Erfolgserlebnis haben kann. Und damit die Motivation etwas zu machen erhalten bleibt.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Was ich (glaub' ich) sagen wollte: Ich hoffe, doch das jedes bessere Tutorial den notwendigen Rahmen liefern kann, dass man ähnlich wie bei Processing nur noch die eine draw-Methode selbst schreiben muss, wenn man etwas malen will. Mehr als die folgenden Zeilen (aus dem Gedächnis) ist das doch in der Regel nicht:

Code: Alles auswählen

import pygame
def run():
    pygame.init()
    screen = pygame.display.set_mode(...)
    while True:
        event = pygame.event.poll()
        if event.type == pygame.QUIT: break
        if event.type == pygame.KEYDOWN: onkeydown(event)
        screen.fill((0,0,0))
        draw(screen)
        pygame.display.flip()

def onkeydown(event):
    "wenn was auf tastendruck gehen soll überschreiben"

def draw(surface):
    "Hier code einfügen"

run()
Und wenn das keine Interaktion mit dem Anwender braucht, wird es noch mal einfacher, wenn man braucht die Schleife nicht.

Stefan

PS: Wer nur ein bisschen mit Computergraphik spielen will, dem würde ich http://processingjs.org/ empfehlen - das funktioniert direkt im Browser und braucht sonst gar nichts weiter.
deets

Und das ganze dann noch integriert in einen Editor der es auf Druck von F5 einfach startet, ausserdem eine Projektverwaltung fuer Resourcen, um das ganze als Stand-Alone-Projekt laufen lassen zu koennen... usw ;)

Und ganz ehrlich: du als guter Programmierer hast da jetzt so mal eben ein Prograemmchen hingezaubert, dass schon mehr Qualitaet und Abstraktion hat als so ziemlich *alles*, was ich hier jemals gesehen habe wenn es um unsere teilweise etwas... "notorischen" Pygame-Anfaenger geht. Also ist es offensichtlich fuer viele Einsteiger irgendwie nicht moeglich, so ein Template zu finden (und seinen Wert zu erkennen!) - sondern irgendwie wird irgendwas zusammengezimmert, aus Versatzstuecken aus schlechten Tutorials.
Newcomer
User
Beiträge: 131
Registriert: Sonntag 15. Mai 2011, 20:41

@sma
Die Schleife brauchste immer weil sonst alles nur ein einziges mal auf den bildschirm geblittet wird (-:
Antworten