2013-04-25 3 views
-1

Я делаю очень обычную игру, и я пытаюсь сделать так, чтобы птица (игрок) уклонялась от камней, и если птица попала под скалы, она умирает. Но я не могу понять, как заставить игру узнать, попала ли утка в скалу.Sprite Health в Pygame

Вот мой код:

import os, sys 
import random 
import time 



img_path = os.path.join('C:\Python27', 'player.png') 
img_path2 = os.path.join('C:\Python27', 'rock.png') 


class Bird(object): 
    def __init__(self): 

     self.image = pygame.image.load(img_path) 



     self.x = 0 
     self.y = 0 


    def handle_keys(self): 

     key = pygame.key.get_pressed() 
     dist = 2 
     if key[pygame.K_DOWN]: 
      self.y += dist 
     elif key[pygame.K_UP]: 
      self.y -= dist 
     if key[pygame.K_RIGHT]: 
      self.x += dist 
     elif key[pygame.K_LEFT]: 
      self.x -= dist 




    def draw(self, surface): 
     surface.blit(self.image, (self.x, self.y)) 

    def bird_health(self): 
     health = 1 
     if health ==0: 
      sys.exit() 


    def background(self, surface): 
     bg = os.path.join('C:\Python27', 'bg.png') 
     self.image2 = pygame.image.load(bg) 
     surface.blit(self.image2, (0,0)) 


class Rock(object): 
    def __init__(self, x=640, y=0,): 
     self.image = pygame.image.load(img_path2) 


     self.x = x 
     self.y = y 
     dist = 10 
     self.dist = dist 
    def rock(self): 
     dist = 10 
     self.x -=dist 




    def rock_draw(self, surface): 
     surface.blit(self.image, (self.x, self.y)) 






pygame.init() 
screen = pygame.display.set_mode((640, 200)) 

bird = Bird() # create an instance 
rock = Rock() 
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 

     if rock.x < 0: 
      y = random.randint(10, 190) 
      rock = Rock(640, y) 

    bird.handle_keys()  
    rock.rock() 
    screen.fill((255,255,255)) 
    bird.background(screen) 
    bird.draw(screen) 
    rock.rock_draw(screen) 
    pygame.display.update() 

    clock.tick(40) 

Сейчас я просто хочу, чтобы выйти, если состояние здоровья птицы = 0.

ответ

1

Это программа, где я обнаруживаю, что мяч попал в весло, надеюсь, что это поможет. полностью в нижней части (в отдельном поле кода) - это всего лишь код, где я обнаруживаю, что они сталкиваются.

import pygame 

# Constants 
WIDTH = 700 
HEIGHT = 500 
SCREEN_AREA = pygame.Rect(0, 0, WIDTH, HEIGHT) 
BLACK = (0, 0, 0) 
WHITE = (255, 255, 255) 

# Initialization 
pygame.init() 
screen = pygame.display.set_mode([WIDTH, HEIGHT]) 
pygame.mouse.set_visible(0) 
pygame.display.set_caption("Breakout Recreation WIP") 
clock = pygame.time.Clock() 

# Variables 
paddle = pygame.Rect(350, 480, 50, 10) 
ball = pygame.Rect(10, 250, 15, 15) 
paddle_movement_x = 0 
ball_direction = (1, 1) 
balls = 3 
done = False 

while not done and balls > 0: 

    # Process events 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      done = True 
     keys = pygame.key.get_pressed() 
     if keys[pygame.K_LEFT]: 
      paddle_movement_x = -2 
     elif keys[pygame.K_RIGHT]: 
      paddle_movement_x = 2 
     else: 
      paddle_movement_x = 0 

    # Move paddle 
    paddle.move_ip(paddle_movement_x, 0) 
    paddle.clamp_ip(SCREEN_AREA) 

    # Move ball 
    ball.move_ip(*ball_direction) 
    if ball.right > WIDTH or ball.left < 0: 
     ball_direction = -ball_direction[0], ball_direction[1] 
    elif ball.top < 0 or paddle.colliderect(ball): 
     ball_direction = ball_direction[0], -ball_direction[1] 
    elif ball.bottom > HEIGHT: 
     balls = balls - 1 
     ball_direction = (1, 1) 
     ball = pygame.Rect(10, 250, 15, 15) 

    ball.clamp_ip(SCREEN_AREA) 

    # Redraw screen 
    screen.fill(BLACK) 
    pygame.draw.rect(screen, WHITE, paddle) 
    pygame.draw.rect(screen, WHITE, ball) 
    pygame.display.flip() 
    clock.tick(100) 

pygame.quit() 

здесь код, где я в основном изменить направление мяча:

# Move ball 
    ball.move_ip(*ball_direction) 
    if ball.right > WIDTH or ball.left < 0: 
     ball_direction = -ball_direction[0], ball_direction[1] 
    elif ball.top < 0 or paddle.colliderect(ball): 
     ball_direction = ball_direction[0], -ball_direction[1] 
    elif ball.bottom > HEIGHT: 
     balls = balls - 1 
     ball_direction = (1, 1) 
     ball = pygame.Rect(10, 250, 15, 15) 
4

Я не сделал Pygame в то время, но это ссылка: http://www.pygame.org/docs/ref/sprite.html#pygame.sprite.spritecollideany

Pygame имеет встроенную функцию Collide, spritecollideany()

или вы можете использовать это:

def checkCollision(bird, rock): 
    if bird.x == rock.x and bird.y == rock.y: 
     sys.exit() 

и в классах птиц и гор, убедитесь, что x и y доступны. Это будет работать только в том случае, если угол птицы равен углу скалы, но вы можете добавить клаузулы для проверки. Например:

if bird.x == rock.x and bird.y == rock.y or bird.x == rock.x + rock.length and... 

Это будет расширено в зависимости от того, где расположена птица.

+0

spritecollideany будет работать, но я думаю, что я должен создать прямоугольники Будут esiest способ сделать это – Serial

+0

К сожалению, это было навсегда, так как я использовал pygame. Эта ссылка может помочь: http://www.pygame.org/docs/ref/rect.html Что вам нужно сделать, это дать ему атрибут; возможно загрузить изображение на прямоугольник? У меня нет pygame, поэтому я не могу попробовать и проверить - извините – elder4222

+0

хорошо спасибо за помощь! – Serial