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.
BlackJack

Donnerstag 16. Juni 2005, 21:21

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

Freitag 17. Juni 2005, 22:58

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 17. Juni 2005, 23:38

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 Modvoice
Erwin
User
Beiträge: 141
Registriert: Donnerstag 9. Juni 2005, 08:51

Samstag 18. Juni 2005, 19:58

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 18. Juni 2005, 20:29

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 Modvoice
Erwin
User
Beiträge: 141
Registriert: Donnerstag 9. Juni 2005, 08:51

Samstag 18. Juni 2005, 23:06

init() ist also nichts anderes, als ein Befehl, mit dem also sich das Ganze vorbereitet und zugleich überprüft, ob es durchgeführt werden kann?
Leonidas hat geschrieben:

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.
Also wenn ich die Localen Befehle nicht lade, muß ich es direkt, hier mit 12, das Ganze ansprechen?
Während mit den Locals kann ich die dafür vorgesehene Bezeichnung hernehmen?
Demzufolge ist es auch vermutlich praktischer, das ganez Local-Zeug zu verwenden?
Ich mache nie einen Fehler Zweimal.
Schließlich ist die Auswahl ja groß genug.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 19. Juni 2005, 12:34

Erwin hat geschrieben:init() ist also nichts anderes, als ein Befehl, mit dem also sich das Ganze vorbereitet und zugleich überprüft, ob es durchgeführt werden kann?
Ja, genau.
Erwin hat geschrieben:Also wenn ich die Localen Befehle nicht lade, muß ich es direkt, hier mit 12, das Ganze ansprechen?
Während mit den Locals kann ich die dafür vorgesehene Bezeichnung hernehmen?
Demzufolge ist es auch vermutlich praktischer, das ganez Local-Zeug zu verwenden?
Es sind nicht "Locale Befehle", sondern einfach Konstanten aus dem pygame.locals Namensraum. Das die pygame-Entwickler den Namensraum "locals" genannt haben, war einfach deren Entscheidung.
Ja, ohne die Konstanten musst du den Wert, also eben beispielsweise 12 verwenden.
Ich mache es dagegen meist so, dass ich import pygame.locals as pyl importiere und dann sowas wie pyl.QUIT nutze. (Zu dem Modul-Importen kannst du auch unter ModulImporte nachschlagen, wenn ich die Seite mal fertiggeschrieben habe).
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Erwin
User
Beiträge: 141
Registriert: Donnerstag 9. Juni 2005, 08:51

Sonntag 19. Juni 2005, 16:40

Ich habe den Eindruck, daß ich das Ganze überhaupt nicht mehr packe.

Wolte jetzt einen Hintergrund darstellen:

Code: Alles auswählen

background = pygame.Surface(screen.get_size())
background = background.convert()
background.fill((250, 250, 250))
Aber wenn ich die Zahlen ändere, ist es immer noch Schwarz.

Und die Turitorals kann man total vergessen.
Da quält man sich durch das schlechte Deutsch (weil es halt vom Translator übersetzt wurde) und muß feststellen, daß die Hälte im Turitoral fehlt, weil der *zensiert* es wohl als selbstverständlich betrachtet, daß man die Hälfte weis. :evil:
Ich mache nie einen Fehler Zweimal.
Schließlich ist die Auswahl ja groß genug.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 19. Juni 2005, 18:42

Wo ist das Problem:

Code: Alles auswählen

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

import pygame
import pygame.locals as pyl

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((0, 0, 0))

    # Display some text
    font = pygame.font.Font(None, 36)
    text = font.render("Hello There", 1, (255, 255, 255))
    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 == pyl.QUIT:
                pygame.quit()
                return

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

if __name__ == '__main__':
    main()
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Erwin
User
Beiträge: 141
Registriert: Donnerstag 9. Juni 2005, 08:51

Sonntag 19. Juni 2005, 19:58

Bei Deinem Code geht es.
Das kann ja heiter werden. Dann habe ich irgendwo eine Kleinigkeit ausgelassen.
Es ist fürchterlich. Nicht mal ein richtiges englisches Turitoral gibt es ... .
Ok, erst mal zusehen, ob ich zumindest alle Teile des Codes, der für den Hintergrund zuständig ist, zusammen bekomme.
Die 3 unter dem Hintergrund scheinen allein ja nicht auszureichen, zumindest bei meinen vorherigen Tests..


Edit: Kann den 'Fehler' leider nicht mehr wiederholen. Es scheint einfach auf einmal zu klappen. Vielleicht lag dieser auch innerhalb der Schleife?

Was bewirkten eigentlich diese Beiden Zeilen?
Weis das Jemand?

Code: Alles auswählen

# Blit everything to the screen
    screen.blit(background, (0, 0))
    pygame.display.flip()
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:

Sonntag 19. Juni 2005, 21:09

Erwin hat geschrieben: Was bewirkten eigentlich diese Beiden Zeilen?
Weis das Jemand?

Code: Alles auswählen

# Blit everything to the screen
    screen.blit(background, (0, 0))
    pygame.display.flip()
Dein Bild, dass du auf dem Bildschirm haben möchtest wird nicht direkt auf den Bildschirm gezeichnet, sondern in den Arbeitsspeicher, da das Bild sonst flackern und flimmern würde. Die zwei Befehle holen dann das Bild direkt auf den Bildschirm.
Erwin
User
Beiträge: 141
Registriert: Donnerstag 9. Juni 2005, 08:51

Sonntag 19. Juni 2005, 21:36

ProgChild hat geschrieben:
Erwin hat geschrieben: Was bewirkten eigentlich diese Beiden Zeilen?
Weis das Jemand?

Code: Alles auswählen

# Blit everything to the screen
    screen.blit(background, (0, 0))
    pygame.display.flip()
Dein Bild, dass du auf dem Bildschirm haben möchtest wird nicht direkt auf den Bildschirm gezeichnet, sondern in den Arbeitsspeicher, da das Bild sonst flackern und flimmern würde. Die zwei Befehle holen dann das Bild direkt auf den Bildschirm.
Achso ist das?
Jetzt komme ich langsam dahinter.

Und das erste zeichnet wohl in dem Fall den Hintergrund:
screen = der Name hatl, blit ? (= Befehl zum zeichnen/laden/erstellen?), dann um was es sich dabei handelt (background) und die Koordinaten, wo es eingefügt werden soll? Sehe ich das soweit alles richtig?

Während in der 2. Zeile dann das Bild dann auf dem Bildschirm erscheinen/aktualliesieren läßt?
Ich mache nie einen Fehler Zweimal.
Schließlich ist die Auswahl ja groß genug.
BlackJack

Sonntag 19. Juni 2005, 22:54

Erwin hat geschrieben:Ich habe den Eindruck, daß ich das Ganze überhaupt nicht mehr packe.
Nicht nur Du.
Und die Turitorals kann man total vergessen.
Da quält man sich durch das schlechte Deutsch (weil es halt vom Translator übersetzt wurde) und muß feststellen, daß die Hälte im Turitoral fehlt, weil der *zensiert* es wohl als selbstverständlich betrachtet, daß man die Hälfte weis. :evil:
Die PyGame-Tutorials gehen davon aus, dass man Programmierung im allgemeinen und Python im besonderen schon kann. Damit solltest Du vielleicht mal anfangen. Es kann nicht zum Umfang eines Tutorials über eine Grafikbibliothek gehören, die Grundlagen der Programmierung zu vermitteln. Die "fehlende Hälfte" musst Du Dir also schon wo anders her holen.
Erwin
User
Beiträge: 141
Registriert: Donnerstag 9. Juni 2005, 08:51

Montag 20. Juni 2005, 09:59

BlackJack hat geschrieben:...
Die PyGame-Tutorials gehen davon aus, dass man Programmierung im allgemeinen und Python im besonderen schon kann. Damit solltest Du vielleicht mal anfangen. Es kann nicht zum Umfang eines Tutorials über eine Grafikbibliothek gehören, die Grundlagen der Programmierung zu vermitteln. Die "fehlende Hälfte" musst Du Dir also schon wo anders her holen.
Was Du da schreibst, sind meiner Meinung nach nichts als Vermutungen.
Zuerst fängt er mit etwas an, was nur Zeit kostet und man auch gleich mit Bilder machen könnte.
Dann, als es ins Detail geht ... .
Hier ein/der Auschnitt:

Code: Alles auswählen

>>> background = [terrain1, terrain1, terrain2, terrain2, terrain2, terrain1]
>>> screen = create_graphics_screen()
>>> for i in range(6):
...    screen.blit(background[i], (i*10, 0))
>>> playerpos = 3
>>> screen.blit(playerimage, (playerpos*10, 0))
Bei background bzw. dem terrain1 erwartet er, daß es Bilder sind, die dort abelegt sein sollen.
Aber nirgends vorher steht dort, mit welchen Befehl das man machen kann. Der schreibt einfach, daß wir eben annehmen, wir haben geladen hübsche Bildchen ... .
Da PyGame vermutlich seinen eigenen Befehle hat, kann man wohl kaum hergehen und sagen: wer Python kann, kann dies auch.
Auch steht nirgends wie groß die Bilder sein sollen. Nicht mal das will Er einem mitteilen.
Habe es zwar inzwischen rausbekommen, was ich aber nicht dem Turitoral zu verdanken habe.
Das nächste Problem tauchte dann in Zeile 2 auf, wegem 'create_graphics_screen()'. Dies ist nämlich nicht definiert.
Ich weis weder denn Sinn von dem Ganzen, auch wird es vermutlich kein Python-Befehl sein. Und nirgendswo vorher wurde darüber geschrieben. Aber ich soll wissen, was da jetzt rein soll? Da kann alles möglich rein?
Das hat für mich nichts mehr damit zu tun, daß man von einem erwartet, er kann gut Python, sondern ist für mich einfach Faulheit und Schlamperei, laut dem Mottto: ich weis was rein soll, der User hat dies halt eben zu erraten, hautpsache ich muß nicht viel schreiben.

Überhaupt hat der eine Logik ... anstatt daß Er einfach das Bild mit dem Held über die anderen Bilder laufen/bewegen läßt, will er jedesmal alles neu Zeichnen? Komplizierter geht es gar nicht, finde ich.
Ich mache nie einen Fehler Zweimal.
Schließlich ist die Auswahl ja groß genug.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 20. Juni 2005, 13:13

Wäre auch nett, wenn ihr sagen könntet, welches Tutorial ihr meint, ich habs irgendwie nicht finden können.

Was ich gut fand, war das Sprite Tutorial.

Zu bedenken ist, dass pygame nur eine Freizeitbeschäftigung von Pete Shinners und ein paar anderen ist, und nicht irgendein Mittel Geld zu verdienen. Sie machen es alle nur zum Spaß, und sie programmieren am liebsten, statt ellenlange Texte zu schreiben, damit es auch Leute verstehen, die gar kein Python können. Das ist nicht ihr Gebiet, sie sind Programmierer.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Gesperrt