2017-03-03 4 views
2

Ich versuche zu verstehen, wie get_rect() funktioniert. In diesem einfachen Beispiel habe ich zwei Bilder und möchte die Position des zweiten Bildes erhalten und das erste Bild auf das zweite Bild verschieben.Pygame: Wie man richtig verwendet get_rect()

Ich habe eine Vielzahl von Beispielen online angeschaut und kann das nicht zum Funktionieren bringen. Was mache ich falsch?

import pygame, sys 
from pygame.locals import * 
import time 

pygame.init() 
FPS = 10 # frames per second setting 
fpsClock = pygame.time.Clock() 

# Set up the window 
DISPLAYSURF = pygame.display.set_mode((600, 400), 0, 32) 
pygame.display.set_caption('Test program for get_rect()') 

WHITE = (255, 255, 255) 

# Load two images 
baseImg = pygame.image.load('image1.jpg') 
spaceshipImg = pygame.image.load('image2.jpg') 

DISPLAYSURF.fill(WHITE) 

# Place one image at the bottom of the screen 
DISPLAYSURF.blit(baseImg, (300, 300)) 
pygame.display.update() 

# Place the second image at the top of the screen 
DISPLAYSURF.blit(spaceshipImg, (300, 0)) 
pygame.display.update() 

# Wait for one second 
time.sleep(1) 

# Obtain the rectangle for each image 
baseRect = baseImg.get_rect() 
spaceshipRect = spaceshipImg.get_rect() 

# This is where I believe I'm going wrong 
# I understand this to obtain the x,y of the spaceship image 
# Set the xy coordinates for the top image to the xy of the bottom image 
spaceshipRect.x = baseRect.x 
spaceshipRect.y = baseRect.y 

# Move the top image to new xy position 
# However this doesn't work 
DISPLAYSURF.blit(spaceshipImg, (spaceshipRect.x, spaceshipRect.y)) 

pygame.display.update() 

while True: 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      pygame.quit() 
      sys.exit() 
+0

Wenn Sie sich etwas über eine Funktion wundern, verwenden Sie entweder den 'help()' Befehl in Python oder suchen Sie in der [Dokumentation] (https://www.pygame.org/docs/ref/surface.html#) pygame.Surface.get_rect). Geben Sie auch die Beispiele an, die Sie angeschaut haben, da keiner hätte erwähnen sollen, dass er "x, y des Raumschiffbildes" erhält. Die Dokumentation sagt: _ "Dieses Rechteck beginnt immer bei 0, 0" _. –

Antwort

2

Zuerst images/pygame.Surfaces haben keine Position, so dass Sie die blit Position im rect speichern müssen. Wenn Sie die Methode get_rect eines pygame.Surface aufrufen, erstellt Pygame ein neues rect mit der Größe des Bildes und den x, y-Koordinaten (0, 0). Um den rect anderen Coords während der Instantiierung zu geben, können Sie ein Argument an get_rect übergeben, meistens wird center oder topleft verwendet. Um später die rect zu bewegen, können Sie eines dieser Attribute des rect ändern:

x,y 
top, left, bottom, right 
topleft, bottomleft, topright, bottomright 
midtop, midleft, midbottom, midright 
center, centerx, centery 
size, width, height 
w,h 

Hier ist ein Beispiel (drücken Sie a oder d, um die Position des rect zu ändern und dadurch die blit pos des Bildes):

import sys 
import pygame as pg 

BG_COLOR = pg.Color(80, 60, 70) 
PLAYER_COLOR = pg.Color(90, 140, 190) 

def main(): 
    screen = pg.display.set_mode((640, 480)) 
    clock = pg.time.Clock() 

    player_img = pg.Surface((40, 60)) 
    player_img.fill(PLAYER_COLOR) 
    # Create a rect with the size of the image/pygame.Surface 
    # and immediately set it's topleft coords to (100, 300). 
    player_rect = player_img.get_rect(topleft=(100, 300)) 

    done = False 

    while not done: 
     for event in pg.event.get(): 
      if event.type == pg.QUIT: 
       done = True 
      if event.type == pg.KEYDOWN: 
       if event.key == pg.K_d: 
        # Set the center to these new coords. 
        player_rect.center = (400, 200) 
       if event.key == pg.K_a: 
        # Set the x coord to 300. 
        player_rect.x = 300 

     screen.fill(BG_COLOR) 
     screen.blit(player_img, player_rect) 
     pg.display.flip() 
     clock.tick(30) 


if __name__ == '__main__': 
    pg.init() 
    main() 
    pg.quit() 
    sys.exit() 
+0

Vielen Dank, dass Sie sich die Zeit genommen haben, meine Frage und die ausführliche Antwort zu beantworten. Es war sehr hilfreich und beantwortete meine Fragen umfassend. Nochmals vielen Dank, du hast mich aus dieser Warteschleife befreit. – henrco

Verwandte Themen