Maus auf Bild Zentrieren

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Was hast Du Dir bei dem ´a` gedacht und warum übergibst Du mit dem Argument einen Typ? Und warum machst Du dann nichts damit?

Man muß nicht alles an self binden und auch nicht explizit auf True prüfen:

Code: Alles auswählen

    def schiessen(self):
        schuss = pgf.mousePressed()
        ergebnis = True
        if schuss:
            ergebnis= False
        return ergebnis
Das kann man jetzt noch kürzer schreiben:

Code: Alles auswählen

    def schiessen(self):
        return not pgf.mousePressed()
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Noch mehr gruseliges in den `pygame_functions`, die `mousePressed()`-Funktion:

Code: Alles auswählen

def mousePressed():
    pygame.event.clear()
    mouseState = pygame.mouse.get_pressed()
    if mouseState[0]:
        return True
    else:
        return False
Mal von dem unnötigen ``if``/``else`` abgesehen, und dass die Pygame-Doku von der `get_pressed()`-Funktion abrät, löscht der `clear()`-Aufruf alle anstehenden Ereignisse. Man verliert also Ereignisse. Absichtlich. Das ist einfach nur kaputt. Das kann das drücken oder loslassen einer Taste sein, Mausbewegungen, Timer-Ereignisse, oder auch selbst definierte Ereignisse. Das kann man alles nicht mehr zuverlässig verwenden. Und `pygame.event.clear()` wird auch noch in ein paar anderen Funktionen in dem Modul aufgerufen.

Der Autor hat also nicht nur was gegen Python's Namenskonventionen, und Objektorientierung, sondern macht auch noch die Ereignisbehandlung kaputt, weil er offenbar den von Pygame/SDL dafür vorgesehenen Weg über eine Schleife die *alle* Ereignisse abarbeitet nicht nehmen will, und anscheinend die Konsequenzen nicht verstanden hat.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Giben
User
Beiträge: 13
Registriert: Montag 6. April 2020, 08:06

'a' war nur der verzweifelte Versuch irgend etwas zum laufen zu bekommen :)

Code: Alles auswählen

def schiessen(self):
        return not pgf.mousePressed()
kannst du mir das bitte genauer erklären, warum das so funktioniert?

Also sollte ich die Geschichte mit "Pygame:functions" lassen?
Jetzt bin ich verwirrt :mrgreen:
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Giben: Das ist einfach nur Dein Code vereinfacht. Fangen wir mal mit Deinem Code an:

Code: Alles auswählen

    def schiessen(self):
        schuss = pgf.mousePressed()
        ergebnis = True
        if schuss:
            ergebnis= False
        return ergebnis
Das ist unschön, weil es unregelmässig ist. Mit ``if``/``else`` sähe es so aus:

Code: Alles auswählen

    def schiessen(self):
        schuss = pgf.mousePressed()
        if schuss:
            ergebnis = False
        else:
            ergebnis = True
        return ergebnis
Wenn `schuss` wahr ist, dann ist das Ergebnis unwahr und umgekehrt. Das Ergebnis ist also genau die logische Umkehr/Negierung von `schuss`:

Code: Alles auswählen

    def schiessen(self):
        schuss = pgf.mousePressed()
        ergebnis = not schuss
        return ergebnis
Und der Rest ist dann einfach nur noch die Zwischenergebnisse nicht extra an Namen zu binden.

Ich würde die `pygame_functions` nicht verwenden.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Giben
User
Beiträge: 13
Registriert: Montag 6. April 2020, 08:06

ok hau weg Pygame_functions :D

Von vorne:

folgender Code mit den ich das Fadenkreuz mit der Maus steuern kann.Es funktioniert auch, aber warum 'hinkt' das Kreuz dem Maus zeiger nach?(ruckelt)

Code: Alles auswählen

import pygame
from pygame.locals import *

#from pygame_functions import *
BREITE = 800    
HOEHE  = 600
WEIS =(255,255,255)
FPS = 60
pygame.display.set_caption("Varroa Invaders")
clock = pygame.time.Clock()
fenster = pygame.display.set_mode([BREITE,HOEHE])
hintergrund = pygame.image.load("bilder/wiese.jpg")

class Player (pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load('Bilder/Daco50x49.png')
        self.rect = self.image.get_rect()
        #self.rect.center = (0,0)
    
    def update(self):
            for event in pygame.event.get():
                if event.type == pygame.MOUSEMOTION:
                    self.rect = event.pos
       
def main():
    spielaktiv = True
    spieler = Player()
    spritesall = pygame.sprite.Group(spieler)
   
    pygame.init()
    while spielaktiv:
        for event in pygame.event.get():
            if event.type==QUIT or (event.type==KEYDOWN and event.key==K_ESCAPE):
                spielaktiv = False
        
        fenster.blit(hintergrund,(0,0))
        spritesall.update()
        spritesall.draw(fenster)
        pygame.display.update()

        pygame.display.flip()
        clock.tick(FPS)
    pygame.quit()
if __name__ == "__main__":
    main()          
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Giben: Du hast da zwei verschachtelte Ereignisschleifen. Das sollte nur eine sein.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Giben
User
Beiträge: 13
Registriert: Montag 6. April 2020, 08:06

Ich kapiers einfach nicht :cry:
Wie bekomme ich jetzt das Sprite dazu um es mit der maus zu bewegen?? :cry:

Code: Alles auswählen

import pygame
from pygame.locals import *

#from pygame_functions import *
BREITE = 800    
HOEHE  = 600
WEIS =(255,255,255)
FPS = 60
pygame.display.set_caption("Varroa Invaders")
clock = pygame.time.Clock()
fenster = pygame.display.set_mode([BREITE,HOEHE])
hintergrund = pygame.image.load("bilder/wiese.jpg")

class Player (pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load('Bilder/Daco50x49.png')
        self.rect = self.image.get_rect()
        self.rect.center = (0,0)
    
    def update(self):
            
        event = pygame.event.get() 
        if event.type == pygame.MOUSEMOTION:
            self.rect.top +=1
            
       
def main():
    spielaktiv = True
    spieler = Player()
    spritesall = pygame.sprite.Group(spieler)
   
    pygame.init()
    while spielaktiv:
        for event in pygame.event.get():
            if event.type==QUIT or (event.type==KEYDOWN and event.key==K_ESCAPE):
                spielaktiv = False
            
        fenster.blit(hintergrund,(0,0))
        spritesall.update()
        spritesall.draw(fenster)
        pygame.display.update()

        pygame.display.flip()
        clock.tick(FPS)
    pygame.quit()
if __name__ == "__main__":
    main()          
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Giben: Das Problem ist nicht das ``for`` sondern das da überhaupt `pygame.event.get()` aufgerufen wird. Das hat in einem `Sprite` nix zu suchen, das gehört ins Hauptprogramm.

`event.type` führt ja auch zu einem `AttributeError` weil das gar kein einzelnes Ereignis ist.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Giben
User
Beiträge: 13
Registriert: Montag 6. April 2020, 08:06

Erstmal danke für deine Geduld :)

Also soweit bin ich auch gekommen.Aber wie bekomme ich jetzt die Mausteuerung hin?Wie schaffe ich es die Mauskoordinaten zur def update(sel)f zu übertragen?
Die koordinaten werden mir mit Print angezeigt, scheint also soweit zu funktionieren...

Code: Alles auswählen

   def update(self):
        self.rect.center 
            
       
def main():
    spielaktiv = True
    spieler = Player()
    spritesall = pygame.sprite.Group(spieler)
    
    pygame.init()
    while spielaktiv:
        for event in pygame.event.get():
            if event.type==QUIT or (event.type==KEYDOWN and event.key==K_ESCAPE):
                spielaktiv = False
            if event.type == pygame.MOUSEMOTION:
                bewegung = event.pos
                print (bewegung)
        spieler.update()
        fenster.blit(hintergrund,(0,0))
        #spritesall.update()
        spritesall.draw(fenster)
        pygame.display.update()
Antworten