Grundlegendes zu Pygame / Events u.a.

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Hallo!

Ich hätte een paar Fragen (bei deren Formulierung ich noch Schwierigkeiten habe) zu Pygame und hoffe jetzt einfach mal, dass jemand etwas Klarheit in die Sache bringen kann.

Was habe ich bisher?
Nun, ich schaffe es mal, ein Fenster zu erstellen und mittels dem "Try and Error"-Prinzip kämpfe ich mich nun mit den Dingen ab, dich haben will.
Wie dem Code zu entnehmen ist, kann ich die Keyboard-Events mittlerweile abfragen.
Auch bekomme ich Rückmeldungen, wenn ein Mousebutton gedrückt würde.
Aber: ich bekomme nur, dass ein Button gedrückt wurde und nicht welcher!
Gibt es, wie für die KEYS eine Kontante, die etwa MOUSEBUTTON_LEFT oder so heißt?

Weiter geht's.
Im Code habe ich mir ein Bild geladen (klar, ich könnte das auch mit Draw machen, wollte ich aber net) und nun:
Wie bewege ich das Teil??

Ich habe mich ja schon an den diversen Tutorials (Chimp, ...) versucht, aber um ehrlich zu sein, sind die teilweise ganz schön undurchsichtig für einen Lernenden.

Danke.

EDIT:
Ach ja, der bisherige Code:

Code: Alles auswählen

#! C:\python24\python.exe

#
#
#               Datum: 04-12-06
#
#               by C4S3
#
#               Name: pgNEW.py
#
#               =======================
#               Meine Odysse mit Pygame
#               =======================


import os, sys
import pygame
from pygame.locals import *

size = width, height = 640, 480

pygame.init()
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Pygame Display Test by C4S3")
pygame.display.get_surface()

bild = os.path.join("data", "bild.bmp")
bild_obj = pygame.image.load(bild)
screen.blit(bild_obj, (0,0))
pygame.display.flip()

def input(events):
    """Events abfragen
    
    Dies ist der EVENTLOOP, bzw
    die FUNKTION des EVENTLOOPS.
    HIER WERDEN ALLE EVENTS ABGEFRAGT
    Die Funktion wird im "Mainloop" abgefragt.
    Inhalte sind Mousebuttons und Keyboardeingaben,
    sowie das Schliessen des Fensters."""
    for event in events:
        if event.type == QUIT:
            sys.exit(0)
            
        elif event.type == KEYDOWN:
            """hier werden alle im Spiel verwendeten Tasten
            aufgelistet. Jede, die vorkommt, muss auch hier
            aufgeschrieben werden."""
            
            if event.key == pygame.K_DOWN:
                print "Down"
            elif event.key == pygame.K_UP:
                print "Up"

            elif event.key == pygame.K_a:
                print "a"
            elif event.key == pygame.K_ESCAPE:  # Close window, when "ESCAPE" is pressed!
                sys.exit(0)
            
        elif event.type == MOUSEBUTTONDOWN:
            print event
            # ??? --> <Event(5-MouseButtonDown {'button': 1, 'pos': (248, 204)})>
            # Evenso: wie krieg ich raus, welcher?


# Mainloop
while True:
    input(pygame.event.get())
    
Gruß!
Schildi
User
Beiträge: 30
Registriert: Freitag 19. Mai 2006, 22:23
Kontaktdaten:

Hi!

Also ich könnte dir helfen, was die Sache mit dem Drücken der Maus angeht. Und zwar würde ich an deiner Stelle

Code: Alles auswählen

pygame.mouse.get_pressed()
verwenden. Das liefert dir folgendes:

Code: Alles auswählen

(1, 0, 0) #LMT wurde gedrückt
(0, 1, 0) #mittl. MT wurde gedrückt
(0, 0, 1) #RMT wurde gedrückt
Das dürfte dich eigentlich ein Stück weiter bringen :D kannst du auch hier nochmal nachlesen:
http://www.pygame.org/docs/ref/mouse.html

Hoffe, ich hab dir wenigstens ein bisschen geholfen :wink:

MfG, Schildi
by: Schildi
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Dank dir, Schilde.
Das hilft ja schon ein wenig. Wenn ich jetzt noch rausbekomme, wie das mit den Bildern geht, kann ich mich wieder ein paar Tage weiterkämpfen. :D
Gruß!
BlackJack

C4S3 hat geschrieben:Aber: ich bekomme nur, dass ein Button gedrückt wurde und nicht welcher!
Gibt es, wie für die KEYS eine Kontante, die etwa MOUSEBUTTON_LEFT oder so heißt?
Die Ausgabe von Deinem Code enthält einen Hinweis: Das `event`-Objekt hat die Attribute `button` und `pos`.
Im Code habe ich mir ein Bild geladen (klar, ich könnte das auch mit Draw machen, wollte ich aber net) und nun:
Wie bewege ich das Teil??
Alten Hintergrund wiederherstellen, Bild an anderer Stelle neuzeichnen und das Ergebnis auf den Bildschirm bringen.
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Ok, das Mousebuttonproblem habe ich jetzt gelöst.

Code: Alles auswählen

elif event.type == MOUSEBUTTONDOWN:
            # pygame.mouse.get_pressed liefert einen Tupel mit 3 Werten zurück (0,0,0)
            # Durch Zugriff auf diesen kann man herausfinden, welcher Mousebutton gedrückt
            # wurde.
            # Beispiel: (1,0,0) --> Linker Knopf
            mousebutton = pygame.mouse.get_pressed()
            if mousebutton[0] == 1:
                print "Left"
                
            elif mousebutton[1] == 1:
                print "middle"
                
            elif mousebutton[2] == 1:
                print "right"
So, weiter geht's mit den "bewegten Bildern".
Alten Hintergrund wiederherstellen, Bild an anderer Stelle neuzeichnen und das Ergebnis auf den Bildschirm bringen.
Ja, soviel zu Theorie, danke. ;)
Das mit dem bewegen ist gar nicht soo haarig, aber das neuzeichnen des alten Hintergrundes! Das check ich net.
Denn:

Code: Alles auswählen

if event.key == pygame.K_DOWN:
                screen.blit(bild_obj, (50,50))
                pygame.display.flip()
Malt mir zwar mein Bild neu, doch das alte bleibt auch. Also Hintergrund zeichnen tut noch nicht.
Da stellt sich auch noch die Frage: muss ich bei _jeder_ Zeichenaktion den Hintergrund neu zeichnen, oder kann ich quasi "global" einmal pro Schleife neuzeichnen?

Danke schon mal.
Gruß!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

C4S3 hat geschrieben:Da stellt sich auch noch die Frage: muss ich bei _jeder_ Zeichenaktion den Hintergrund neu zeichnen, oder kann ich quasi "global" einmal pro Schleife neuzeichnen?
Nein, nur jedesmal wenn sich etwas ändert. Du kannst also mehrere Surfaces auf den Hintergrund blitten und dann erst mit flip() alles anzeigen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

0-O

Ich steig jetzt gar nicht mehr durch. Das mit dem einmal / Schleife neuzeichnen geht ganz gut.

Aber immernoch scheine ich einige ganz elementare Dinge nicht verstanden zu haben.
Mein momentaner Code zeigt mir einen schwarzen Bildschirm und ein rotes Quadrat (das ist das Bild).
Warum ist der Bildschirm schwarz? Ich habe bewusst nirgends (0,0,0) gesetzt.
Wie also könnte ich beim Starten meiner Applikation den Hintergrund z.B. Weiß zeichnen?
Und wie kann ich, nachdem ich das Quadrat neu gezeichnet habe (ich habe es verschoben) den Hintergrund dort wo das Quadrat vorher noch war, wieder weiß übermalen?
Sorry, jetzt häng ich echt.
Gruß!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

C4S3 hat geschrieben:Warum ist der Bildschirm schwarz? Ich habe bewusst nirgends (0,0,0) gesetzt.
Wie also könnte ich beim Starten meiner Applikation den Hintergrund z.B. Weiß zeichnen?
Sieh dir screensaw.py, an, dort die Funktion axe_alaska(). Dort siehst du, dass ich bei jedem Durchlauf den Hintergrund mit self.screen.fill((0, 0, 0)) mit schwarz übermale und dann erst die anderen Surfaces wieder draufkopiere - weiß wäre natürlich (255, 255, 255).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Dank dir, Leonidas.
(Wer lesen kann, ist klar im Vorteil)
Ich hatte mir das Beispiel angesehen, aber es ist einfach zu viel für mich - kein Wunder. Wow!!
Und vor lauter Bestürzung und Verwirrung hatte ich ganz übersehen, dass du mir im Post den Tip (die Lösung) ja doch schon gegeben hast. Bild

Einige Dinge sind mir zwar immer noch unklar - dies wird auch immer so sein - aber es hilft schon sehr!

Es ist, denke ich, manchmal sehr, sehr schwierig, wenn man vorher zum einen prozedural programmiert hat (weil mir das umdenken auf OOP ein wenig schwer fällt) und mit einer "Spiele"-Sprache gearbeitet hat (PureBasic), die halt eigene und andere Zeichenfunktionen, Bufferfunktionen, .. .mitbringt!

Danke.

Cheers,
Gruß!
BlackJack

C4S3 hat geschrieben:Es ist, denke ich, manchmal sehr, sehr schwierig, wenn man vorher zum einen prozedural programmiert hat (weil mir das umdenken auf OOP ein wenig schwer fällt) [...]
PyGame ist aber grundsätzlich nicht besonders "OOP", fast alles kann man relativ geradlinig auf die darunterliegenden Aufrufe der C-Bibliothek abbilden. Das ist nur eine recht dünne "Schicht" die PyGame über eine prozedurale, sehr Low-Level Grafikbibliothek legt.

Problematisch ist bei einem Umstieg von einer "Spiele"-Sprache wohl eher, dass alles so Low-Level ist und man alles von Hand machen muss, was man sonst als Befehle oder Funktionen schon zur Verfügung gestellt bekommen hat.
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

PyGame ist aber grundsätzlich nicht besonders "OOP"
Nun ich beziehe das mitunter eher auf die Tutoriale, die es so gibt.
Gruß!
Antworten