2016-10-08 3 views
1

Я работаю над своим школьным проектом, для которого я проектирую 2D-игру.Pygame: Столкновение двух изображений

У меня 3 изображения, один из них - игрок, а другие 2 - экземпляры (кофе и компьютер). Что я хочу сделать, когда изображение игрока сталкивается с одним из двух экземпляров, я хочу, чтобы программа что-то печатала.

Я не уверен, что возможен столкновение изображений. Но я знаю, что прямое столкновение возможно. Однако, после нескольких неудачных попыток, я не могу сделать мои образы изображения. Кто-нибудь, пожалуйста, помогите мне. Вот мой исходный код:

import pygame 
import os 

black=(0,0,0) 
white=(255,255,255) 
blue=(0,0,255) 


class Player(object): 
    def __init__(self): 
     self.image = pygame.image.load("player1.png") 
     self.image2 = pygame.transform.flip(self.image, True, False) 
     self.coffee=pygame.image.load("coffee.png") 
     self.computer=pygame.image.load("computer.png") 
     self.flipped = False 
     self.x = 0 
     self.y = 0 


    def handle_keys(self): 
     """ Movement keys """ 
     key = pygame.key.get_pressed() 
     dist = 5 
     if key[pygame.K_DOWN]: 
      self.y += dist 
     elif key[pygame.K_UP]: 
      self.y -= dist 
     if key[pygame.K_RIGHT]: 
      self.x += dist 
      self.flipped = False 
     elif key[pygame.K_LEFT]: 
      self.x -= dist 
      self.flipped = True 

    def draw(self, surface): 
     if self.flipped: 
      image = self.image2 
     else: 
      im = self.image    
     for x in range(0, 810, 10): 
      pygame.draw.rect(screen, black, [x, 0, 10, 10]) 
      pygame.draw.rect(screen, black, [x, 610, 10, 10]) 

     for x in range(0, 610, 10): 
      pygame.draw.rect(screen, black, [0, x, 10, 10]) 
      pygame.draw.rect(screen, black, [810, x, 10, 10]) 

     surface.blit(self.coffee, (725,500)) 
     surface.blit(self.computer,(15,500)) 
     surface.blit(im, (self.x, self.y)) 



pygame.init() 



screen = pygame.display.set_mode((800, 600))#creates the screen 

player = Player() 
clock = pygame.time.Clock() 

running = True 
while running: 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      pygame.quit()  # quit the screen 
      running = False 

    player.handle_keys()  # movement keys 
    screen.fill((255,255,255)) # fill the screen with white 




    player.draw(screen)  # draw the player to the screen 
    pygame.display.update() # update the screen 

    clock.tick(60)    # Limits Frames Per Second to 60 or less 

ответ

0

Используйте pygame.Rect(), чтобы сохранить размер и положение изображения.

Изображение (или скорее pygame.Surface()) имеет функцию get_rect(), которая возвращает pygame.Rect() с размером изображения (и позиции).

self.rect = self.image.get_rect() 

Теперь вы можете установить стартовую позицию, т.е. (0, 0)

self.rect.x = 0 
self.rect.y = 0 

# or 

self.rect.topleft = (0, 0) 

# or 

self.rect = self.image.get_rect(x=0, y=0) 

(Rect использование левый верхний угол, как (х, у)).

Используйте его, чтобы изменить положение

self.rect.x += dist 

и нарисовать изображение

surface.blit(self.image, self.rect) 

, а затем вы можете проверить столкновение

if self.rect.colliderect(self.rect_coffe): 

BTW: а теперь class Player выглядит почти pygame.sprite.Sprite :)

+0

Хорошо, я включил изменения, я сделал плеер прямым, а также кофе. Я поставил тест на столкновение до цикла while, и я положил , если self.rect.colliderect (self.rect_coffe): print «no» Как только я запускаю программу, она печатает «нет». Что я делаю неправильно? – meowmar

+0

после 'key handle' и перед' draw'. – furas

+0

Вы установили позицию coffe в 'rect_coffe'? как использование по умолчанию по умолчанию (x = 0, y = 0). вы всегда можете напечатать (self.rect, self.rect_coffe) ', чтобы видеть позиции. – furas

Смежные вопросы