使用pygame.sprite.spritecollideany Python [英] Using pygame.sprite.spritecollideany Python

查看:192
本文介绍了使用pygame.sprite.spritecollideany Python的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是python编程的新手,并且正在通过制作Alien Invasion游戏进行练习.这是一种经典的游戏配置,您必须击落成排的外星人,然后才能使其沉到底部并与您的飞船相撞.

I am new to python programming, and I am practicing by making a Alien Invasion game. This is a classic game configuration, there are rows of aliens you have to shot down before they make it to the bottom and collide with your ship.

这是我的 game_functions 代码:

import sys

import pygame
from bullet import Bullet
from alien import Alien

def check_keydown_events(event, ai_settings, screen, ship, bullets):
    """Respond to keypresses."""
if event.key == pygame.K_RIGHT:
    ship.moving_right = True
elif event.key == pygame.K_LEFT:
    ship.moving_left = True
elif event.key == pygame.K_SPACE:
    fire_bullet(ai_settings, screen, ship, bullets)
elif event.key == pygame.K_q:
    sys.exit()

def fire_bullet(ai_settings, screen, ship, bullets):
"""Fire a bullet if mimit not reached yet."""
#Create a new bullet and add it to the bullets group
if len(bullets) < ai_settings.bullets_allowed:
        new_bullet = Bullet(ai_settings, screen, ship)
        bullets.add(new_bullet)

def check_keyup_events(event, ship):
"""Respond to key releases."""
if event.key == pygame.K_RIGHT:
    ship.moving_right = False
elif event.key == pygame.K_LEFT:
    ship.moving_left = False

def check_events(ai_settings, screen, ship, bullets):
"""Respond to keypresses and mouse events."""
for event in pygame.event.get():
    if event.type == pygame.QUIT:
        sys.exit()
    elif event.type == pygame.KEYDOWN:
        check_keydown_events(event, ai_settings, screen, ship,           bullets)
    elif event.type == pygame.KEYUP:
        check_keyup_events(event, ship)

def update_screen(ai_settings, screen, ship, aliens, bullets):
"""Update images on the screen and flip to the new screen."""

# Redraw the screen during each pass through the loop.
screen.fill(ai_settings.bg_color)

#Redraw bullets behind the ship and aliens
for bullet in bullets.sprites():
    bullet.draw_bullet()
ship.blitme()
aliens.draw(screen)

# Make the most recently drawn screen visible.
pygame.display.flip()

def update_bullets(ai_settings, screen, bullets, aliens, ship):
"""Update position of bullets and get rid of olf bullets."""
#Update bullet position
bullets.update()
#Check for any bullets that hit an alien.
#if so, get rid of the bullet and alien

#Get rid of bullets that have disappeared
for bullet in bullets.copy():
    if bullet.rect.bottom <= 0:
        bullets.remove(bullet)

check_bullet_alien_collisons(ai_settings, screen, bullets, aliens, ship)

def check_bullet_alien_collisons(ai_settings, screen, bullets, aliens, ship):
"""Respond to bullet-alien collions."""
#Remove any bullets and aliens that collide.
collisons = pygame.sprite.groupcollide(bullets, aliens, True, True)

if len(aliens) == 0:
    #Destroy existing bullets and create new fleet.
    bullets.empty()
    create_fleet(ai_settings, screen, aliens, ship)

def get_number_aliens_x(ai_settings, alien_width):
"""Determine the number of aliens that fit in a row."""
available_space_x = ai_settings.screen_width - 2 * alien_width
number_aliens_x = int(available_space_x / (2 * alien_width))
return number_aliens_x

def get_number_rows(ai_settings, ship_height, alien_height):
"""Find the number of rows for screen."""
available_space_y = (ai_settings.screen_height - 
                        (3 * alien_height) - ship_height)
number_rows = int(available_space_y / (3 * alien_height))
return number_rows

def create_alien(ai_settings, screen, aliens, alien_number, row_number):
"""Create an alien and place it in the row."""
alien = Alien(ai_settings, screen)
alien_width = alien.rect.width
alien.x = alien_width + 2 * alien_width * alien_number
alien.rect.x = alien.x
alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
aliens.add(alien)

def create_fleet(ai_settings, screen, ship, aliens):
"""Create a full fleet of aliens."""
#Create an alien and find the number of aliens in a row
alien = Alien(ai_settings, screen)
number_aliens_x = get_number_aliens_x(ai_settings, alien.rect.width)
number_rows = get_number_rows(ai_settings, ship.rect.height, alien.rect.height)

#Create the fleet of aliens
for row_number in range(number_rows):
    for alien_number in range(number_aliens_x):
        create_alien(ai_settings, screen, aliens, alien_number, row_number)

def check_fleet_edges(ai_settings, aliens):
"""Respond appropriately if any aliens reached an edge."""
for alien in aliens.sprites():
    if alien.check_edges:
        change_fleet_direction(ai_settings, aliens)
        break

def change_fleet_direction(ai_settings, aliens):
"""Drop the entire fleet and change the fleet's direction."""
for alien in aliens.sprites():
    alien.rect.y += ai_settings.fleet_drop_speed
ai_settings.fleet_direction *= -1

def update_aliens(ai_settings, aliens, ship):
"""Check for fleet on edge, then update positions of fleet."""
check_fleet_edges(ai_settings, aliens)
aliens.update()

#Look for alien-ship collisons.
if pygame.sprite.spritecollideany(aliens, ship):
    print("Ship hit!")

这是我的游戏初始化代码,因此我可以运行功能并玩游戏

And this is my game init code so I can run the functions and play the game

import pygame
from pygame.sprite import Group

from settings import Settings
from ship import Ship
from alien import Alien
import game_functions as gf

def run_game():
#Initialze game, settings, and screen object.
pygame.init()
ai_settings = Settings()
screen = pygame.display.set_mode(
    (ai_settings.screen_width, ai_settings.screen_height))
pygame.display.set_caption("Alien Invasion!")

#Make a ship, a group of aliens, and a group of bullets
ship = Ship(ai_settings, screen)
aliens = Group()
bullets = Group()

#Create a fleet of aliens
gf.create_fleet(ai_settings, screen, ship, aliens)

# Start the main loop for the game
while True:
    gf.check_events(ai_settings, screen, ship, bullets)
    ship.update()
    gf.update_bullets(ai_settings, screen, bullets, aliens, ship)
    gf.update_aliens(ai_settings, aliens, ship)
    gf.update_screen(ai_settings, screen, ship, aliens, bullets)

run_game()

我已经完成了大部分游戏,但是当我在 game_functions 文件中添加 pygame.sprite.spritecollideany()时,我会得到

I have most of the game done, but when I add the pygame.sprite.spritecollideany() in the game_functions file, I get

属性错误:组"没有属性矩形""

"Attribute Error: the 'Group' has no attribute 'rect'"

我知道我可能缺少一些简单的东西,但是我无法弄清楚.对不起,我在复制并粘贴问题时没有正确键入代码,以节省时间.

I know there is probably something simple I am missing, but I cannot figure it out. Sorry of the code is not correctly typed as I copied and pasted to save time when posting my question.

我还使用Ubuntu 14.04 LTS,并运行python-3.4.3.

I am also using Ubuntu 14.04 LTS, and running python-3.4.3.

推荐答案

阅读Pygame文档: pygame.sprite.spritecollideany()

Read Pygame doc: pygame.sprite.spritecollideany()

此函数期望将单个sprite作为第一个参数,将group作为第二个参数,但是您将 aliens 用作组作为第一个参数,并将ship用作sprite作为第二个参数.

This function expects single sprite as first argument, and group as second argument but you use aliens which is group as first argument, and ship which is sprite as second argument.

您必须更改参数的顺序.

You have to change order of arguments.

顺便说一句:下次只需使用 print()-这是最流行的方法(如果您不知道如何调试)来检查变量中的内容看看有什么问题.

BTW: next time simply use print() - it is most popular method (if you don't know how to debug) to check what you have in variables and see what is wrong.

这篇关于使用pygame.sprite.spritecollideany Python的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆