Seite 1 von 1

pygame mouse

Verfasst: Freitag 10. November 2006, 17:52
von Bamba
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

Verfasst: Freitag 10. November 2006, 17:58
von 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.

Verfasst: Freitag 10. November 2006, 18:26
von Bamba
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

Verfasst: Freitag 10. November 2006, 21:36
von BlackJack
Die Antwort hast Du Dir doch schon selbst gegeben!?

Verfasst: Samstag 11. November 2006, 13:23
von Bamba
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

Verfasst: Samstag 11. November 2006, 14:45
von 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.

Verfasst: Samstag 11. November 2006, 16:26
von Bamba
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

Verfasst: Samstag 11. November 2006, 17:41
von 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()

Verfasst: Sonntag 12. November 2006, 09:51
von Bamba
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

Verfasst: Sonntag 12. November 2006, 11:24
von Leonidas
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?

Verfasst: Sonntag 12. November 2006, 11:50
von Bamba
Ich habe pygame 1.6

Verfasst: Sonntag 12. November 2006, 11:59
von Leonidas
Bamba hat geschrieben:Ich habe pygame 1.6
Dann aktualisier mal auf das aktuelle 1.7.1, da sollen viele Sachen erweitert/dazugekommen sein.

Verfasst: Sonntag 12. November 2006, 17:51
von Bamba
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

Verfasst: Sonntag 12. November 2006, 20:13
von 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.

Verfasst: Sonntag 12. November 2006, 21:05
von Bamba
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

Verfasst: Sonntag 12. November 2006, 21:54
von BlackJack
Du vergleichst das Objekt das an `picture` bzw. `picture2` gebunden ist mit einem Tupel mit Mauskoordinaten. Wann sollte das denn "wahr" ergeben?