PyGame: Suche Hilfe und Tips

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Erwin
User
Beiträge: 141
Registriert: Donnerstag 9. Juni 2005, 08:51

Hoffe es gehört (zumindest vorerst) hierher.

Folgendes:
Mein Interssen sind eher Spiele zu proggramieren.
Und für solche soll eben PyGame am besten geeignet sein, wenn meine Informationen nicht täuschen.

Das Problem:
Fehlende Seiten, Fehlendes Wissen darüber und ... schlechte Englischkenntnisse.

Das suche ich:
- Deutsche Seiten, wo einiges darüber erklärt wird.
- Sonstige Infos? Z.B. sind die Grundaufrufen gleich, wie bei Tkinter, nur eben andere Bezeichnungen?
- weiter Fragen ect., welche sich aber erst später ergeben werden. Zur Zeit ... will ich überhaupt mal was machen können.

Installation habe ich inzwischen dank Hilfe, schon hinbekommen.

Danke für Eure Hilfe im vorraus.
Ich mache nie einen Fehler Zweimal.
Schließlich ist die Auswahl ja groß genug.
antimicro
User
Beiträge: 151
Registriert: Sonntag 29. Februar 2004, 16:24

Hi,
auch wenn du das vielleicht nicht hören möchtest, aber ohne Englisch hast du wenig’ Chancen. Mein Vorschlag: Einfach mal die Englische Doku ausprobieren! Langenscheidt daneben legen und Stück für Stück übersetzen. Du wirst sehen, dass die ersten Programme mühsam sind, aber es wird auch immer einfacher. Außerdem hat niemand behauptet programmieren sei einfach…

und sollten trotzdem mal Probleme auftauchen, dann kannst du hier ja Fragen.
greetings
sebi
BlackJack

Erwin hat geschrieben:Das suche ich:
- Deutsche Seiten, wo einiges darüber erklärt wird.
- Sonstige Infos? Z.B. sind die Grundaufrufen gleich, wie bei Tkinter, nur eben andere Bezeichnungen?
Wenn Du damit meinst, ob Funktions-/Methodenaufrufe auch aus dem Namen mit folgenden Klammern und eventuell Parametern dazwischen bestehen, dann ja. :wink:

PyGame ist kein GUI Toolkit sondern eher auf niedrigerer Ebene angesiedelt. Du bekommst im Grunde eine Zeichenfläche zur Vefügung auf der Du beliebige Grafiken platzieren kannst und Funktionen an die Hand, um Maus, Joystick und Tastatur auszuwerten und Töne/Musik in mehreren Kanälen abzuspielen. Und ein paar nützliche Funktionen um Grafiken zu manipulieren und Rechtecke auf Überlappungen oder "enthalten sein" zu überprüfen. Ausserdem ein paar Basisklassen um so etwas wie Sprites umzusetzen. Dazu ist Objektorientierung ein wichtiger Punkt.
Erwin
User
Beiträge: 141
Registriert: Donnerstag 9. Juni 2005, 08:51

Also ein paar Seiten hatte ich teilweise inzwischen schon verstanden.
Zumindest ist mir es gelungen, mit PyGame ein Fenster (640x480) zu erstellen. Aber das war es dann schon, bzw. als ich das Fenster schließen wollte, teilte mir das BS (Windows XP) mit, daß das Programm nicht reagiert und fragte, ob es sofort beenden soll.
Ich mache nie einen Fehler Zweimal.
Schließlich ist die Auswahl ja groß genug.
ProgChild
User
Beiträge: 210
Registriert: Samstag 9. April 2005, 10:58
Kontaktdaten:

Wie wärs mit ner kleinen Starthilfe? Für jemanden der noch nie mit der SDL gearbeitet hat, finde ich die Doku, die ich gefunden hab nämlich nicht so toll.

Code: Alles auswählen

#!/usr/bin/env python
import pygame

def main():
	print "Los gehts"

	pygame.init()
	pygame.display.init()
	
	screen = pygame.display.set_mode( (640,480) )
	pygame.display.set_caption( "Fenster Titel" )

	running = 1
	while running:
		events = pygame.event.get()
		for event in events:
			#print event
			if event.type == pygame.QUIT: 
				running = 0

			if event.type == pygame.KEYDOWN:
				print "Taste wurde gedrückt"
			
		pygame.display.flip()

	pygame.display.quit()

	print "Bye"

if __name__ == "__main__":
	main()

Erwin
User
Beiträge: 141
Registriert: Donnerstag 9. Juni 2005, 08:51

Danke, ProgChild.
Dein Beispiel hat funktioniert.
Aber es gab beim Abspeichern eine Meldung und nach bestätigung hat er mir folgende Zeile reingeschrieben:

Code: Alles auswählen

# -*- coding: cp1252 -*-
Was hat es damit auf sich?

Und was mich auch interessieren würde.
Warum klappt der kopierte Beispiel-Code nicht, bzw. hängt sich auf:

Code: Alles auswählen

#!/usr/bin/python

import pygame
from pygame.locals import *

def main():
	# Initialise screen
	pygame.init()
	screen = pygame.display.set_mode((150, 50))
	pygame.display.set_caption('Basic Pygame program')

	# Fill background
	background = pygame.Surface(screen.get_size())
	background = background.convert()
	background.fill((250, 250, 250))

	# Display some text
	font = pygame.font.Font(None, 36)
	text = font.render("Hello There", 1, (10, 10, 10))
	textpos = text.get_rect()
	textpos.centerx = background.get_rect().centerx
	background.blit(text, textpos)

	# Blit everything to the screen
	screen.blit(background, (0, 0))
	pygame.display.flip()

	# Event loop
	while 1:
		for event in pygame.event.get():
			if event.type == QUIT:
				return

		screen.blit(background, (0, 0))
		pygame.display.flip()


if __name__ == '__main__': main()
Ich mache nie einen Fehler Zweimal.
Schließlich ist die Auswahl ja groß genug.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Erwin hat geschrieben:Aber es gab beim Abspeichern eine Meldung und nach bestätigung hat er mir folgende Zeile reingeschrieben:

Code: Alles auswählen

# -*- coding: cp1252 -*-
Was hat es damit auf sich?
Weil es sonst Probleme mit dem ü-Umlaut in 'gedrückt' gibt, Python weiß nicht, welches Encoding das sein soll.
Erwin hat geschrieben:Und was mich auch interessieren würde.
Warum klappt der kopierte Beispiel-Code nicht, bzw. hängt sich auf:
Tut's doch nicht:

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*-

import pygame
from pygame.locals import *

def main():
    # Initialise screen
    pygame.init()
    screen = pygame.display.set_mode((150, 50))
    pygame.display.set_caption('Basic Pygame program')

    # Fill background
    background = pygame.Surface(screen.get_size())
    background = background.convert()
    background.fill((250, 250, 250))

    # Display some text
    font = pygame.font.Font(None, 36)
    text = font.render("Hello There", 1, (10, 10, 10))
    textpos = text.get_rect()
    textpos.centerx = background.get_rect().centerx
    background.blit(text, textpos)

    # Blit everything to the screen
    screen.blit(background, (0, 0))
    pygame.display.flip()

    # Event loop
    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                return

        screen.blit(background, (0, 0))
        pygame.display.flip()

if __name__ == '__main__':
    main()
Was ich gemacht habe: Einrückung nach meinem Coding-Stil (siehe Styleguide) korrgiert, Kopfzeilen umgeschreiben, 1 gegen True eingetauscht. Funktioniert beim ersten mal ohne jegliche Fehler.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Erwin
User
Beiträge: 141
Registriert: Donnerstag 9. Juni 2005, 08:51

Wegem Umlaut also ... .
Leonidas hat geschrieben:...
Was ich gemacht habe: Einrückung nach meinem Coding-Stil (siehe Styleguide) korrgiert, Kopfzeilen umgeschreiben, 1 gegen True eingetauscht. Funktioniert beim ersten mal ohne jegliche Fehler.
Sehe nur eine Veränderung: Die 2. Zeile.
Habe den ganze Code kopiert und ausprobiert:
Beim beenden heißt es immer noch, daß das Programm nicht reagiert (also BS-Mitteilung).
Ich mache nie einen Fehler Zweimal.
Schließlich ist die Auswahl ja groß genug.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Okay, dann genauer:
  • aus

    Code: Alles auswählen

    #!/usr/bin/python
    habe ich

    Code: Alles auswählen

    #!/usr/bin/env python
    # -*- encoding: latin-1 -*- 
    gemacht, damit habe ich also erstmal den Interpreter nicht mehr auf einen festen Pfad. Danach habe ich das Encoding auf latin-1 gesetzt. Das mache ich aus gewöhnung, weil man damit gleich mal einige Fehler ausmerzen kann.
  • ich habe den Quelltext komplett neu eingerückt, wobei ich gegebenfalls vorhandene Tabs gegen 4 Leerzeichen getauscht habe.
  • aus

    Code: Alles auswählen

    while 1:
    wurde bei mir

    Code: Alles auswählen

    while True:[/url] weil mir das logischer erscheint (aber zu while 1 aquivalent ist).[/list]
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Erwin
User
Beiträge: 141
Registriert: Donnerstag 9. Juni 2005, 08:51

Ok. jetzt weiß ich die Änderungen genau. Danke.
Aber es funktioniert immer noch nicht richtig. Das Fenster hängt sich ständig auf.
:(
Ich mache nie einen Fehler Zweimal.
Schließlich ist die Auswahl ja groß genug.
BlackJack

Das Skript hat den Fehler, das nirgends `pygame.quit()` aufgerufen wird und somit auch PyGame nicht ordentlich beendet wird. Das macht nichts wenn man das Skript wirklich als eigenständiges Programm startet, weil dann das Interpreterende auch PyGame beendet. Wenn man das Skript aber aus IDLE oder IPython oder einer ähnlichen Umgebung heraus startet, dann bleibt der Interpreter "am Leben" und der PyGame Teil hängt. In der Python-Shell manuell `pygame.quit()` eintippen sollte helfen.
Erwin
User
Beiträge: 141
Registriert: Donnerstag 9. Juni 2005, 08:51

BlackJack hat geschrieben:Das Skript hat den Fehler, das nirgends `pygame.quit()` aufgerufen wird und somit auch PyGame nicht ordentlich beendet wird. Das macht nichts wenn man das Skript wirklich als eigenständiges Programm startet, weil dann das Interpreterende auch PyGame beendet. Wenn man das Skript aber aus IDLE oder IPython oder einer ähnlichen Umgebung heraus startet, dann bleibt der Interpreter "am Leben" und der PyGame Teil hängt. In der Python-Shell manuell `pygame.quit()` eintippen sollte helfen.
Genau das war der Fehler.
Danke.
Als eigenständiges Programm?
Also als Exe.Datei?
Aber für ein Turitoral ist dies ein unverzeichlicher Fehler, finde ich (es sei denn, es wird wo in Englisch erwähnt ... ?).

Jedenfalls habe ich jetzt wieder etwas Hoffnung.
Ich mache nie einen Fehler Zweimal.
Schließlich ist die Auswahl ja groß genug.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Erwin hat geschrieben:Als eigenständiges Programm?
Also als Exe.Datei?
Ich denke BlackJack meint, dass das Programm vom Pythoninterpreter direkt ausgeführt wird (also ohne IDLE oder IPython oder so), so wie bei einem Doppelklick auf das Programm oder einem Start mit 'python programm.py'.

BlackJack: Toll, darauf wäre ich nicht gekommen, Respekt!
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Erwin
User
Beiträge: 141
Registriert: Donnerstag 9. Juni 2005, 08:51

Leonidas hat geschrieben:...
Ich denke BlackJack meint, dass das Programm vom Pythoninterpreter direkt ausgeführt wird (also ohne IDLE oder IPython oder so),...
Achja, die Möglichkeit gibt es ja auch noch; stimmt.
Habe es getestet.
Ohne dem Idle funktioniert es dann auch ohne der Beendenzeile (pygame.quit()).
Also braucht man es nur, wenn man mit der Idle arbeitet?

Wieder eine, aber nur kleine, Hürde genommen.
Es werden vermutlich noch mehre Fragen auftauchen.
Zwar habe ich eine Möglichkeit gefunden, die vielen englischen Texte übersetzen zu lassen, aber zum einen ist die Gramatik fürchterlich, zum anderem werden auch die Befehle leider gleich mit übersetzt.
Ich mache nie einen Fehler Zweimal.
Schließlich ist die Auswahl ja groß genug.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Erwin hat geschrieben:Achja, die Möglichkeit gibt es ja auch noch; stimmt.
Habe es getestet.
Ohne dem Idle funktioniert es dann auch ohne der Beendenzeile (pygame.quit()).
Also braucht man es nur, wenn man mit der Idle arbeitet?
Es hinzuzufügen ist sowieso ratsam, egal ob man nun mit IDLE arbeitet oder nicht, schaden tuts nicht.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Leonidas hat geschrieben:BlackJack: Toll, darauf wäre ich nicht gekommen, Respekt!
Nur durch lesen der Doku bin ich nicht darauf gekommen -- ich hatte das Problem selbst mal mit einem Program. Das hatte zwar einen Aufruf von `pygame.quit()`, der wurde aber nicht immer ausgeführt (if-Abfragen etwas blöd verschachtelt).
Erwin
User
Beiträge: 141
Registriert: Donnerstag 9. Juni 2005, 08:51

Weis Jemand, was der eigentliche Sinn von:

Code: Alles auswählen

pygame.init()
und

Code: Alles auswählen

from pygame.locals import *
ist?

Danke im vorraus.
Ich mache nie einen Fehler Zweimal.
Schließlich ist die Auswahl ja groß genug.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Erwin hat geschrieben:Weis Jemand, was der eigentliche Sinn von:

Code: Alles auswählen

pygame.init()
pygame-doc | leonidas-übersetzung hat geschrieben:pygame.init() -> gelungen, mißlungen

Initialisiere alle importierten pygame Module. Einschließlich pygame Modulen, die nicht zeil der Basismodule sein (wie Schrift und Bilder).

Es wirft keine Ausnahmen, sondern zählt stattdessen still die Module auf, die nicht initialisiert werden konnten. Der Rückgabewert enthält die nicht initialisieren Module und ihre Anzahl.

Du kannst immer Module die dur brauchst per-Hand initialisieren. Die Module die Initialisierung benötigen haben immer eine init() und quit() Methode eingebaut, die du direkt aufrufen kannst. Sie haben auch eine get_init() Funktion, die du zum doppelten Prüfen der Initialisierung nutzen kannst. Angemerkt sei, dass die manuellen init() Methoden bei Fehlern eine Ausnahme werfen. Auf den meisten Platformen muss das Display-Modul vor den anderem Modulen initialisiert werden. Dieses init() wird es für dich erledigen, jedoch wenn du es per Hand machen willst solltest du dir dieser Beschränkung bewusst sein.

Wie auch mit den Manuellen init() Funktionen ist es auch problemlos möglich dieses init() so oft wie du willst aufzurufen.
Der letzte Absatz in der Doku ist Schrott, deswegen habe ich ihn umgebaut. Für die Übersetzung lege ich keine Hand und auch keine Füße ins Feuer, es ist fast schon ein Uhr, da darf mein Englisch sich schon eine Auszeit genehmigen.
Erwin hat geschrieben:und

Code: Alles auswählen

from pygame.locals import *
ist?
Das importiert aus pygame.locals alle Konstanten, wie QUIT oder K_SPACE, insgesammt 224 Namen (pygame 1.6 unter Windows auf Python 2.4).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Erwin
User
Beiträge: 141
Registriert: Donnerstag 9. Juni 2005, 08:51

Also so ganz komme ich mit dem init() immer noch nicht mit.
Soll das etwa heißen, das manche Dinge eben extra aufgerufen werden müssen, wie zb. bei Tkinter das erstellen eines Buttons mittels '.place', was bei PyGame aber halt 'init()' heißt, und ich mit dem allgemeinen Befehl mir das jeweilige xx.init() ersparen kann?

Und was dem Local betrifft ... Konstanten?
In wie fern sind die den wichtig?
Braucht man die überhaupt?
Ich mache nie einen Fehler Zweimal.
Schließlich ist die Auswahl ja groß genug.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Erwin hat geschrieben:Also so ganz komme ich mit dem init() immer noch nicht mit.
Soll das etwa heißen, das manche Dinge eben extra aufgerufen werden müssen, wie zb. bei Tkinter das erstellen eines Buttons mittels '.place', was bei PyGame aber halt 'init()' heißt, und ich mit dem allgemeinen Befehl mir das jeweilige xx.init() ersparen kann?
Der Vergleich mit Tkinter hinkt.. gewaltig. Muss man bei einem Segelschiff die Kupplung betätigen, wenn man den Gang wechseln will? Nein, denn eine Jacht hat weder eine Kupplung noch eine Gangschaltung. Es ist einfach so: bevor due Pygame startest, muss es sich sozusagen.. vorbereiten. Und init() sagt pygame: "bereite dich vor". Danach macht pygame sozusagen einen Systemcheck, prüft ob Flügel dran sind, genügend Sprit und sagt dann: "Ja, alles ok", oder aber "Ja, aber der Autpilot ist ausgefallen" (letzteres ist mir noch nie passiert, dass pygame Probleme hatte). Und aufrufen musst du init() nur einmal, obwohl du auch von Hand alles nochmal nachprüfen kannst was du zwar kannst, aber nicht musst.
Erwin hat geschrieben:Und was dem Local betrifft ... Konstanten?
In wie fern sind die den wichtig?
Braucht man die überhaupt?
Nein, du kannst auch ohne diese Konstanten auskommen, nehmen wir doch mal einen Ausschnitt aus dem Beispielprogramm und entfernen die Konstanten (d.h. wir setzen die Werte ein):

Code: Alles auswählen

    while True:
        for event in pygame.event.get():
            if event.type == 12:
                return

        screen.blit(background, (0, 0))
        pygame.display.flip() 
Also prüfen wir, ob die Art des Events gleich 12 ist. Warum 12? Was ist 12? Zwölf entspricht pygame.locals.QUIT. Das Programm funktioniert nun genauso, nur ist es nun schwieriger zu lesen. Ein weiterer Nachteil ist, wenn jetzt plötzlich die pygame-Entwickler entscheiden, in pygame 1.7 QUIT = 20 zu stellen, funktioniert dein Code nicht mehr, weil er annimmt das QUIT = 12 ist.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Gesperrt