ich habe einen ersten Entwurf für ein Spiel auf Pygame-Basis programmiert, bei dem man eine Spielfigur (=Bilddatei) auf dem Bildschirm durch Mausklicks bewegen kann.
Leider muss ich dabei irgendwo Fehler gemacht haben, denn die Spielfigur zittert/wackelt mit hoher Frequenz um etwa 3 Pixel in diagonaler Richtung hin und her, nachdem man sie mit der Maus an eine andere Position geschickt hat (was generell funktioniert). Ich dachte zunächst auf enen Rundungsfehler, da meine Bilddatei eine ungerade Anzahl an Pixeln (in der Breite) hatte, welche für die Festlegung der Position durch 2 geteilt wird. Als ich die Bildbreite angepasst habe, war das Problem allerdings nicht behoben.
Vorgehensweise des Programms: Wird die rechte Maustaste gedrückt, prüft das Programm, ob die Koordinaten des Mauszeigers sich von der aktuellen Position der Figur unterscheiden. Falls dem so ist, wird PlayerIsMoving = True und bei den folgenden Durchläufen der Game Loop werden die X und Y-Positionen der Figur jeweils um 1 inkrementiert oder dekrementiert (je nach dem, in welche Richtung geklickt wurde) - solange, bis die Figur ihren Zielort erreicht hat.
Bilddatei: Link
Code: Alles auswählen
import pygame, sys, os
from pygame.locals import *
os.environ['SDL_VIDEO_CENTERED'] = '1' # Window centered
# Colors
GREEN = (50, 180, 50)
FPS = 30
WINDOWWIDTH = 1000
WINDOWHEIGHT = 700
BGCOLOR = GREEN
ICONPATH = 'Icons\\'
# Main Function
def main():
pygame.init()
global FPSCLOCK, SCREENSURF
FPSCLOCK = pygame.time.Clock()
SCREENSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Testspiel')
SCREENSURF.fill(BGCOLOR)
# Load Images
try: playerIcon = pygame.image.load(os.path.join(ICONPATH, 'playerIcon.png'))
finally: None
mouseX = 0
mouseY = 0
playerX = WINDOWWIDTH / 2 - playerIcon.get_size()[0] / 2
playerY = WINDOWHEIGHT / 2 - playerIcon.get_size()[1] / 2
PlayerIsMoving = False
# Game Loop
while True:
SCREENSURF.fill(BGCOLOR)
if PlayerIsMoving:
if destX > playerX:
playerX += 1
else:
playerX -= 1
if destY > playerY:
playerY += 1
else:
playerY -= 1
# Set Player Position
SCREENSURF.blit(playerIcon, (playerX, playerY))
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit
elif event.type == MOUSEBUTTONUP:
if event.button == 3:
mouseX, mouseY = event.pos
if (mouseX != playerX) or (mouseY != playerY):
PlayerIsMoving = True
destinationX = mouseX - playerIcon.get_size()[0] / 2
destinationY = mouseY - playerIcon.get_size()[1] / 2
else: PlayerIsMoving = False
pygame.display.update()
FPSCLOCK.tick(FPS)
if __name__ == '__main__':
main()
Mfg
Pythoguras