2017-08-11 1 views
0

Tout d'abord, j'ai chargé une image du navire et initialisé son emplacement. par la suite j'ajoute une balle à mon programme. Après cela, j'ai trouvé que peu importe comment je le débogue, il ne peut pas être au bon endroit.erreur de position de pygame

# 1. - import library 
import pygame,sys 
from pygame.locals import * 
from pygame.sprite import Sprite 

class Player(Sprite): 
    def __init__(self): 
     super().__init__() 
     self.image = pygame.image.load('image/pig.bmp') 
     self.rect = self.image.get_rect() 
     self.screen_rect = screen.get_rect() 


class Bullet(Sprite):   
    def __init__(self, player): 
     super().__init__() 
     self.rect = pygame.Rect(0, 0, bullet_width, bullet_height) 
     self.color = bullet_color 
     self.rect.center = player.rect.center 
     self.rect.left = player.rect.right 

# 2. - Initialize the game 
pygame.init() 
width,height = 800,600 
screen = pygame.display.set_mode((width,height)) 
keys = [False,False,False,False] 
playerpos = [0,288] 
bullet_width = 15 
bullet_height = 6 
bullet_color = (200, 200 , 0) 

player = Player() 
bullet = Bullet(player) 

grass = pygame.image.load("image/bg.bmp") 

# 4. - keep looping through 
while True: 
    # 5. - clear the screen before drawing it again. 
    screen.fill(0) 
    # 6. - Draw the screen elements. 
    screen.blit(grass,(0,0)) 
    screen.blit(player.image, playerpos) 

    pygame.draw.rect(screen, bullet.color, bullet.rect) 
    # 7. - update the screen 
    pygame.display.flip() 
    # 8. - loop through the events 
    for event in pygame.event.get(): 
     # check if the event is the X button. 
     if event.type == pygame.QUIT: 
      pygame.quit() 
      sys.exit() 

et pourquoi balles apparaissent en haut à gauche enter image description here

J'espère balle apparaissent dans le côté droit du navire, mais je ne peux pas le faire si je ne pas utiliser de coordonnées (x, y) ,Comment puis-je le faire?

Répondre

0

Vous êtes en train de dessiner le vaisseau dans une position sans rapport avec la position de son rect, en utilisant playerpos. Vous devez faire le lien la position du navire liée à son rect, de sorte que la balle peut y accéder:

# 1. - import library 
import pygame,sys 
from pygame.locals import * 
from pygame.sprite import Sprite 

class Player(Sprite): 
    def __init__(self): 
     super().__init__() 
     self.image = pygame.image.load('image/pig.bmp') 
     self.image.fill((255, 0, 0)) 
     self.rect = self.image.get_rect() 
     self.screen_rect = screen.get_rect() 


class Bullet(Sprite): 
    def __init__(self, player): 
     super().__init__() 
     self.rect = pygame.Rect(0, 0, bullet_width, bullet_height) 
     self.color = bullet_color 
     self.rect.center = player.rect.center 
     self.rect.left = player.rect.right 

# 2. - Initialize the game 
pygame.init() 
width,height = 800,600 
screen = pygame.display.set_mode((width,height)) 
keys = [False,False,False,False] 

bullet_width = 15 
bullet_height = 6 
bullet_color = (200, 200 , 0) 

player = Player() 
player.rect.topleft = [0,288] 
bullet = Bullet(player) 

grass = pygame.image.load("image/bg.bmp") 

# 4. - keep looping through 
while True: 
    # 5. - clear the screen before drawing it again. 
    screen.blit(grass, (0, 0)) 
    # 6. - Draw the screen elements. 
    screen.blit(player.image, player.rect.topleft) 

    pygame.draw.rect(screen, bullet.color, bullet.rect) 
    # 7. - update the screen 
    pygame.display.flip() 
    # 8. - loop through the events 
    for event in pygame.event.get(): 
     # check if the event is the X button. 
     if event.type == pygame.QUIT: 
      pygame.quit() 
      sys.exit() 

En effet, une méthode de surface get_rect() n'a aucune idée où la surface va être blittée à un autre surface, donc il donne juste sa position comme (0, 0). get_rect() est seulement utile pour obtenir les dimensions d'une surface.