pygame mouse

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Bamba
User
Beiträge: 62
Registriert: Dienstag 31. Oktober 2006, 08:48

Sorry dass ich so was dummes frage, aber wie bekomme ich es hin, dass ein Bild von pos x,y nach pos x,y nach einem Mausklick wandert? Warum funkktioniert da:

Code: Alles auswählen

if event.type == MOUSEBUTTONDOWN:
            x1 = 500
            y1 = 500
nicht?

Bamba
Bamba
BlackJack

Du bindest hier nur den Wert 500 an die Namen `x1` und `y1`. Wenn Du etwas auf ein `Surface` zeichnen willst, dann musst Du das schon explizit mit der `blit()`-Methode machen.

Und wenn das Bild an der alten Stelle verschwinden soll, dann musst Du entweder den Platz an der alten Stelle mit der Hintergrundfarbe füllen (bei einfarbigem Hintergrund), den Teil des Hintergrunds an der Stelle wieder herstellen, oder ein ganz neues Bild aufbauen und das dann anzeigen.
Bamba
User
Beiträge: 62
Registriert: Dienstag 31. Oktober 2006, 08:48

Danke!

wie bekomme ich es bei Programmstart hin, dass Bild 1 auf 100,100 liegt und dann bei einem Mausklick zu der jeweiligen Position wechselt?

Code: Alles auswählen

x = 100
y = 100

screen.fill(black)
screen.blit(surface, (x, y))
pygame.display.flip()

while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == MOUSEBUTTONDOWN:
            (x1, y1) = pygame.mouse.get_pos()
            screen.fill(black)
            screen.blit(surface, (x1, y1))
            pygame.display.flip()
Bamba
Bamba
BlackJack

Die Antwort hast Du Dir doch schon selbst gegeben!?
Bamba
User
Beiträge: 62
Registriert: Dienstag 31. Oktober 2006, 08:48

Hallo,

ich weiß nicht, warum das zuerst nicht bei mir geklappt hat, jedoch funktinioniert es jetzt. Um nicht gleich einen neuen Thread anzufangen, stelle ich meine letzte Frage hierzu jetzt hier:

Wie bekomme ich es hin, dass man ein Bild "anklicken" kann und nur dieses Bild dann mit den obenstehenden Codezeilen mit weiteren Mausklicks irgendwohin geschickt wird?

Bamba
Bamba
BlackJack

Bamba hat geschrieben:Wie bekomme ich es hin, dass man ein Bild "anklicken" kann und nur dieses Bild dann mit den obenstehenden Codezeilen mit weiteren Mausklicks irgendwohin geschickt wird?
Dazu brauchst Du mindestens ein "Flag" wo vermerkt wird, ob das Bild noch angeklickt werden muss, oder ob Du schon in der "Bild bewegen" Phase bist.

In der ersten Phase musst Du bei jedem Mausklick überprüfen, ob die Koordinaten innerhalb des Bildes liegen und dann in die zweite Phase übergehen und den alten Code zum verschieben benutzen.

Die Prüfung ob der Mausklick innerhalb des Bildes stattfand, lässt sich mit `Surface.get_rect()` und `Rect.collide_point()` realisieren.
Bamba
User
Beiträge: 62
Registriert: Dienstag 31. Oktober 2006, 08:48

Danke Blackjack!

Leider kann ich mit deinen Ideen nichts anfangen. Könntest du dich ein bisschen verständlicher ausdrücken? Oder mir gleich ein bisschen Code zeigen, den ich dann für mein Beispiel anpassen kann? Das wäre sehr nett.

bamba
Bamba
BlackJack

Hm, ich versuchs. Du hast zwei Zustände, einmal bevor das Bild angeklickt wurde, dann musst Du bei jedem Mausklick überprüfen ob das Bild angeklickt wurde, oder ob der Klick ins Leere ging. Falls das Bild getroffen wurde, wird der andere Zustand aktuell: jetzt muss bei jedem Klick das Bild an die entsprechende Position gemalt werden. Welcher dieser beiden Zustände gerade aktuell ist, kannst Du Dir in einer Variable merken, im Beispiel unten ist das `is_activated`.

Code: Alles auswählen

import pygame


class MovableObject(object):
    def __init__(self, surface, position=(0, 0)):
        self.surface = surface
        self.position = position
    
    def draw_on(self, surface):
        surface.blit(self.surface, self.position)
    
    def is_hit(self, (x, y)):
        return self.surface.get_rect(topleft=self.position).collidepoint(x, y)


def main():
    pygame.display.init()
    screen = pygame.display.set_mode((640, 480))
    surface = pygame.Surface((10, 10))
    surface.fill((255, 255, 255))
    BLACK = (0, 0, 0)

    screen.fill(BLACK)
    picture = MovableObject(surface, (100, 100))
    picture.draw_on(screen)
    pygame.display.flip()
    
    is_activated = False
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit() 
            elif event.type == pygame.MOUSEBUTTONDOWN:
                coordinates = pygame.mouse.get_pos()
                if not is_activated:
                    is_activated = picture.is_hit(coordinates)
                else:
                    screen.fill(BLACK)
                    picture.position = coordinates
                    picture.draw_on(screen)
                    pygame.display.flip()
Zuletzt geändert von BlackJack am Sonntag 12. November 2006, 12:35, insgesamt 1-mal geändert.
Bamba
User
Beiträge: 62
Registriert: Dienstag 31. Oktober 2006, 08:48

Wow Danke. Ich habe deinen Code mal übernommen. Bei kommt aber immer nur:

Code: Alles auswählen

line 13, in is_hit
    return self.surface.get_rect(topleft=self.position).collidepoint(x, y)
TypeError: get_rect() takes no keyword arguments
Bamba
Bamba
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich glaube schon,d ass das gehen müsste, zumindest wenn man der Funktionssignatur aus der Pygame-Dokumentation glaubt. Hast du die aktuelle Pygame-Version?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Bamba
User
Beiträge: 62
Registriert: Dienstag 31. Oktober 2006, 08:48

Ich habe pygame 1.6
Bamba
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Bamba hat geschrieben:Ich habe pygame 1.6
Dann aktualisier mal auf das aktuelle 1.7.1, da sollen viele Sachen erweitert/dazugekommen sein.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Bamba
User
Beiträge: 62
Registriert: Dienstag 31. Oktober 2006, 08:48

Okay, jetzt kommt keine fehlermeldung mehr und es funktioniert, aber wenn ich zwei weiße Flächen zeichne auf unterschiedlichen positionen und danach mit der Maus irgendwohin klicke wird dort ein neues gezeichnet und die alten verschwinden. Ich will aber ,dass ich vorher per Mausklick eine Fläche auswähle und danach erst irgendwohin bewegen kann. Wie geht das?

Bamba
Bamba
BlackJack

Dann musst Du Dir die Position von beiden Bildchen merken und bei beiden prüfen ob der Mausklick in einem der beiden liegt und dann für die zweite Phase merken welches von beiden ausgewählt wurde.

Und wenn Du das gesamte Anzeige-`Surface` mit der Hintergrundfarbe füllst, dann musst Du auch alles wieder an seinem Platz zeichnen damit nichts verschwindet wenn die `flip()`-Methode aufgerufen wird.
Bamba
User
Beiträge: 62
Registriert: Dienstag 31. Oktober 2006, 08:48

So, ich habe das jetzt mal selber gemacht und folgendes Skript erstellt:

Code: Alles auswählen

while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.MOUSEBUTTONDOWN:
                coordinates = pygame.mouse.get_pos()
                if not is_activated:
                    is_activated = picture.is_hit(coordinates)

                if picture == coordinates:
                    if event.type == pygame.MOUSEBUTTONDOWN:
                        coordinates = pygame.mouse.get_pos()
                        picture.position = coordinates
                        picture.draw_on(screen)
                        pygame.display.flip()
                        
                elif picture2 == coordinates:
                    if event.type == pygame.MOUSEBUTTONDOWN:
                        coordinates = pygame.mouse.get_pos()
                        picture.position = coordinates
                        picture.draw_on(screen)
                        pygame.display.flip()
Das funktioniert aber nicht, warum?

Bamba
Bamba
BlackJack

Du vergleichst das Objekt das an `picture` bzw. `picture2` gebunden ist mit einem Tupel mit Mauskoordinaten. Wann sollte das denn "wahr" ergeben?
Antworten