问题描述
我正在用我的python书做练习,我需要从上到下制作雨滴,当它落在屏幕后面时,它会重新开始。但是在我的代码中,我的雨从左到右,并且没有重置,所以它是双重失败,在我给出两个代码 game_functions 和raindrop 下,我打开它的主代码只有这些与其他代码的连接。
gf.update_raindrops(ai_settings,raindrops)
raindrops = Group()
gf.create_grid(ai_settings,screen,ship,raindrops)
game_functions.py
def get_number_raindrops_x(ai_settings,rain_width):
available_space_x = ai_settings.screen_width
number_raindrops_x = int(available_space_x / (2 * rain_width))
return number_raindrops_x
def get_number_rows_rains(ai_settings,ship_height,rain_height):
available_space_y = ai_settings.screen_height
number_rows = int(available_space_y / rain_height)
return number_rows
def create_raindrop(ai_settings,raindrops,raindrop_number,row_number):
raindrop = Raindrop(ai_settings,screen)
raindrop.x = raindrop.rect.width + 2 * raindrop.rect.width * raindrop_number
raindrop.rect.x = raindrop.x
raindrop.y = raindrop.rect.height + 2 * raindrop.rect.height * row_number
raindrop.rect.y = raindrop.y
raindrops.add(raindrop)
def create_grid(ai_settings,raindrops):
raindrop = Raindrop(ai_settings,screen)
number_raindrops_x = get_number_raindrops_x(ai_settings,raindrop.rect.width)
number_rows = get_number_rows_rains(ai_settings,ship.rect.height,raindrop.rect.height)
for row_number in range(number_rows):
for raindrop_number in range(number_raindrops_x):
create_raindrop(ai_settings,row_number)
def check_grid_edges(ai_settings,raindrops):
for raindrop in raindrops.sprites():
if raindrop.check_edges():
change_grid_direction(ai_settings,raindrops)
break
def change_grid_direction(ai_settings,raindrops):
for raindrop in raindrop.sprites():
raindrop.rect.y == ai_settings.rain_drop_speed
def update_raindrops(ai_settings,raindrops):
check_grid_edges(ai_settings,raindrops)
raindrops.update()
rain.py
import pygame
from pygame.sprite import Sprite
class Raindrop(Sprite):
def __init__(self,ai_settings,screen):
super(Raindrop,self).__init__()
self.screen = screen
self.ai_settings = ai_settings
self.image = pygame.image.load('/Users/dominikkolber/Desktop/graphic/drop.png')
self.rect = self.image.get_rect()
self.rect.x = self.rect.width
self.rect.y = self.rect.height
self.x = float(self.rect.x)
def blitme(self):
self.screen.blit(self.image,self.rect)
def check_edges(self):
screen_rect = self.screen.get_rect()
if self.rect.bottom >= screen_rect.bottom:
return True
def update(self):
self.x += (self.ai_settings.rain_drop_speed)
self.rect.x = self.x
解决方法
如果您想让雨下而不是从左向右移动,则必须更改 y
坐标而不是 x
坐标:
class Raindrop(Sprite):
def __init__(self,ai_settings,screen):
# [...]
self.y = float(self.rect.y)
# [...]
def update(self):
self.y += (self.ai_settings.rain_drop_speed)
self.rect.y = self.y
如果雨滴击中底部,则需要通过更改单个雨滴的 y
属性在顶部重新启动它:
def check_grid_edges(ai_settings,raindrops):
for raindrop in raindrops.sprites():
if raindrop.check_edges():
raindrop.y = 0