Pygame zeichnen

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
cool_brick24
User
Beiträge: 34
Registriert: Montag 10. September 2018, 12:45

Hallo liebes Python Forum:

Ich versuche grade mit Python ein Netzwerk basierendes Agario zu programmieren. Ich möchte für meinen Player (Also ein circle) die Maus Position benutzen, damit er sich bewegen kann. Ich frage die Position von der Maus ab, und benutze diesen beim Player:

Code: Alles auswählen

Mouse_x, Mouse_y = pygame.mouse.get_pos()
     pPos = (Mouse_x, Mouse_y)

     drawPlayer(pPos)

Die Funktion drawPlayer:

Code: Alles auswählen

def drawPlayer(playerPosition):
     pygame.draw.circle(screen, (0, 0, 255), playerPosition, 20)
Doch wenn sich der Kreis zur Maus koordinate bewegt, wird der Kreis quasi kopiert. Und ich will, das der Kreis einfach nicht kopiert wird.

Zum genaueren Verstehen: Hier mein kompletter code:

Code: Alles auswählen

#Online Agario
import pygame

(width, height) = (400, 400)
screen = pygame.display.set_mode((width, height))
pygame.display.flip()
pygame.display.set_caption("Agario Online")
screen.fill((0, 255, 255))

programmOpen = True


#Feind
#Öffnet x.txt als temporäre Variable und tut diese dann in "px"
tfy = open("y.txt", "r")
for line in tfy:
     fy = line
tfy.close()

#Öffnet x.txt als temporäre Variable und tut diese dann in "px"
tfx = open("x.txt", "r")
for line in tfx:
     fx = line
tfx.close()

#Player Position
fPos = (int(fx), int(fy))

def drawGegner(gegnerPosition):
    pygame.draw.circle(screen, (255, 0, 0), gegnerPosition, 20)

def drawPlayer(playerPosition):
     pygame.draw.circle(screen, (0, 0, 255), playerPosition, 20)


while programmOpen:
     pygame.display.update()
     for event in pygame.event.get():
          if event.type == pygame.QUIT:
               programmOpen = False
               pygame.quit()


     drawGegner(fPos)
     

               
     Mouse_x, Mouse_y = pygame.mouse.get_pos()
     pPos = (Mouse_x, Mouse_y)

     drawPlayer(pPos)

     


               
     

Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Naja, du zeichnest halt Kreise an unterschiedlichen Positionen.
Wenn die da nicht bleiben sollen, musst du die wieder "löschen"
Dazu hast du zwei Möglichkeiten.
- du fügst deinen Draw...() Funktionen (die ziemlich überflüssig sind, da nur eine Zeile Code) noch eine weitere Zeile hinzu, z.B. pygame.draw.circle(screen, (0, 255, 255), ???Position, 20)
also nochmaliges Zeichnen des Kreises in der Hintergrundfarbe
- oder du löscht den Screen am Ende deiner while-Schleife
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
cool_brick24
User
Beiträge: 34
Registriert: Montag 10. September 2018, 12:45

Also du meinst

Code: Alles auswählen

 PyGame.display.update()
?
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Nein, eher das was du doch schon zu Beginn einmal machst....

Code: Alles auswählen

screen.fill((0, 255, 255))
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
cool_brick24
User
Beiträge: 34
Registriert: Montag 10. September 2018, 12:45

Jetzt wird mir gar nichts mehr angezeigt, d.h. nur noch die Füllfarbe. Meine ausgefüllten Kreise sind nur noch unsichtbar:

Code: Alles auswählen

while programmOpen:
     screen.fill((0, 255, 255))
     pygame.display.update()
     
     for event in pygame.event.get():
          if event.type == pygame.QUIT:
               programmOpen = False
               pygame.quit()

     drawGegner(fPos)
     
     Mouse_x, Mouse_y = pygame.mouse.get_pos()
     pPos = (Mouse_x, Mouse_y)
     drawPlayer(pPos)
     
mfg
-cool_brick24
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

weil es auf die Reihenfolge der draw und fill Funktionen ankommt.
Dein Code macht jetzt das:
Wiederhole:
- Bildschirm löschen
- Bildschirm anzeigen
- Kreise zeichnen

Die gezeichneten Kreise werden durch das Bildschirm löschen wieder "entfernt".

Die Frage ist also, wo macht der Aufruf der Funktion "Bildschirm anzeigen" am meisten Sinn?
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
cool_brick24
User
Beiträge: 34
Registriert: Montag 10. September 2018, 12:45

Also:

-Bildschrim anzeigen
-Kreise Zeichnen
-Bildschirm löschen
?
cool_brick24
User
Beiträge: 34
Registriert: Montag 10. September 2018, 12:45

Habs jetzt gelöst, indem ich erst: die Player Zeichne, dann den Display anzeigen lasse und am Ende ihn wieder lösche.
Mein End-Code:

Code: Alles auswählen

while programmOpen:
     
     
     
     for event in pygame.event.get():
          if event.type == pygame.QUIT:
               programmOpen = False
               pygame.quit()

     drawGegner(fPos)
     
     Mouse_x, Mouse_y = pygame.mouse.get_pos()
     pPos = (Mouse_x, Mouse_y)
     drawPlayer(pPos)

     pygame.display.update()

     screen.fill((0, 255, 255))

Nur noch eine frage: Kann ich den Kreis zeitverzögert zur Maus bewegen, d.h. bsp. Der Kreis spawnt in der Mitte des Bildschirmes(x = 200, y = 200) und die Maus ist auf Position (x = 100, y = 100) Und der Kreis wird zur Maus pro Sekunde 2 Pixel bewegt.


mfg

-cool_brick24
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Das ist gut.
Zur Erklärung warum das so ist:
Es gibt zwei Speicherbereiche für den Bildschirm
Ein Bereich wird angezeigt und in den anderen wird gezeichnet/gelöscht etc.
Wenn du dann die Funktion "Bildschirm anzeigen" aufrufst, wird zwischen den Bereichen umgeschaltet,
d.h. der Bereich in den du zuvor "gemalt" hast, wird angezeigt und alle
nachfolgenden Bildveränderungsoperationen werden auf dem anderen Bereich vorgenommen usw, usw, usw,

Zu deiner aktuellen Frage:
Die Abarbeitung deiner while-Schleife bestimmt die Geschwindigkeit, in der gezeichnet wird.
Um das zeitlich zu steuern, gibt es diese Pygame Module http://www.pygame.org/docs/ref/time.htm ... .get_ticks

Allgemein kann ich dir diese Dokumentation empfehlen http://www.pygame.org/docs/
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
cool_brick24
User
Beiträge: 34
Registriert: Montag 10. September 2018, 12:45

Vielen Dank ThomasL für deine Hilfe!
mdg (mit dankbaren Grüßen)
-cool_brick24
Antworten