首页 > 解决方案 > 雨滴往右,除了往下

问题描述

我正在用我的python书做练习,我需要从上到下制作雨滴,当它落在屏幕后面时,它会重新开始。但是使用我的代码,我的雨从左到右,并且不重置,所以它是双重失败,在我给出两个代码 game_functions 和雨滴下,我打开它的主代码只有这些与其他代码的连接。

 gf.update_raindrops(ai_settings, raindrops)
raindrops = Group()
gf.create_grid(ai_settings, screen, ship, raindrops)

游戏功能.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, screen, 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, screen, ship , 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, raindrops, screen, raindrop_number, 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()

雨.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
    

标签: pythonpygame

解决方案


如果你想让雨落而不是从左到右移动,你必须改变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

推荐阅读