Seite 1 von 1

Pygame zeichnen

Verfasst: Dienstag 6. November 2018, 16:18
von cool_brick24
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)

     


               
     


Re: Pygame zeichnen

Verfasst: Dienstag 6. November 2018, 16:30
von ThomasL
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

Re: Pygame zeichnen

Verfasst: Dienstag 6. November 2018, 18:49
von cool_brick24
Also du meinst

Code: Alles auswählen

 PyGame.display.update()
?

Re: Pygame zeichnen

Verfasst: Dienstag 6. November 2018, 19:06
von ThomasL
Nein, eher das was du doch schon zu Beginn einmal machst....

Code: Alles auswählen

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

Re: Pygame zeichnen

Verfasst: Mittwoch 7. November 2018, 14:22
von cool_brick24
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

Re: Pygame zeichnen

Verfasst: Mittwoch 7. November 2018, 14:34
von ThomasL
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?

Re: Pygame zeichnen

Verfasst: Mittwoch 7. November 2018, 15:32
von cool_brick24
Also:

-Bildschrim anzeigen
-Kreise Zeichnen
-Bildschirm löschen
?

Re: Pygame zeichnen

Verfasst: Mittwoch 7. November 2018, 15:36
von cool_brick24
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

Re: Pygame zeichnen

Verfasst: Mittwoch 7. November 2018, 15:49
von ThomasL
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/

Re: Pygame zeichnen

Verfasst: Mittwoch 7. November 2018, 16:17
von cool_brick24
Vielen Dank ThomasL für deine Hilfe!
mdg (mit dankbaren Grüßen)
-cool_brick24