python - 从边界生成移动物体

标签 python python-3.x pygame virtualbox ubuntu-18.04

我正在尝试使 Angryball 类中的对象从右边框随机生成,并在屏幕外从右向左移动。这个想法是,这些物体必须在窗口右边界的随机 y 坐标上生成(如果我能让它们看起来像是来自边界之外就更好了,但这是我稍后会检查的另一点),然后以速度 5 移动直到到达对面的边界。一旦一个物体退出,另一个物体就会再次产生。 当我运行它时没有任何错误,但它没有按预期工作:)你能帮我解决这个问题吗?

import pygame
import os
import random

size = width, height = 750, 422
screen = pygame.display.set_mode(size)

img_path = os.path.join(os.getcwd())
background_image = pygame.image.load('background.jpg').convert()
bg_image_rect = background_image.get_rect()
pygame.mixer.pre_init(44100, 16, 2, 4096)

pygame.display.set_caption("BallGame")

class Ball(object):
    def __init__(self):
        self.image = pygame.image.load("ball.png")
        self.image_rect = self.image.get_rect()
        self.image_rect.x
        self.image_rect.y
        self.facing = 'LEFT'

    def handle_keys(self):
        key = pygame.key.get_pressed()
        dist = 5
        if key[pygame.K_DOWN] and self.image_rect.y < 321:
            self.facing = 'DOWN'
            self.image_rect.y += dist
        elif key[pygame.K_UP] and self.image_rect.y > 0:
            self.facing = 'UP'
            self.image_rect.y -= dist
        if key[pygame.K_RIGHT] and self.image_rect.x < 649:
            self.facing = 'RIGHT'
            self.image_rect.x += dist
        elif key[pygame.K_LEFT] and self.image_rect.x > 0:
            self.facing = 'LEFT'
            self.image_rect.x -= dist

    def draw(self, surface):
        if self.facing == "RIGHT":
            surface.blit(pygame.transform.flip(self.image, True, False),(self.image_rect.x,self.image_rect.y))
        elif self.facing == "DOWN":
            surface.blit(pygame.image.load("ball_down.png"),(self.image_rect.x,self.image_rect.y))
        if self.facing == "UP":
            surface.blit(pygame.image.load("ball_up.png"),(self.image_rect.x,self.image_rect.y))
        elif self.facing == "LEFT":
            surface.blit(self.image,(self.image_rect.x,self.image_rect.y))



mob_images = [pygame.image.load("image1.png").convert_alpha(),pygame.image.load("image2.png").convert_alpha(),pygame.image.load("image3.png").convert_alpha(),pygame.image.load("image4.png").convert_alpha(),pygame.image.load("image5.png").convert_alpha()]
mob_image = random.choice(mob_images)

class Angryball(pygame.sprite.Sprite):
    def __init__(self, image, pos_x, pos_y):
        super(Angryball, self).__init__()
        self.image = image
        self.rect = self.image.get_rect()
        self.rect.x = pos_x
        self.rect.y = pos_y
        self.facing = 'LEFT'

    def update(self, screen):
        if self.rect.x <= 0:
            self.rect.right = screen.get_rect().width
            self.rect.top = random.randint(0, screen.get_rect().height)
        else:
            self.rect.move_ip(-5, 0)


pygame.init()
screen = pygame.display.set_mode((750, 422))

ball = Ball()
angryball = Angryball(mob_image, 700, random.randrange(400))
sprites = pygame.sprite.Group()
sprites.add(angryball)

clock = pygame.time.Clock()

pygame.mixer.music.load("bg_music.mp3")
pygame.mixer.music.play(-1, 0.0)


running = True
while running:
    esc_key = pygame.key.get_pressed()
    for event in pygame.event.get():
        if esc_key[pygame.K_ESCAPE]:
            pygame.display.quit()
            pygame.quit()
            running = False

    ball.handle_keys()

    sprites.update(screen)
    sprites.draw(screen)

    screen.blit(background_image, bg_image_rect)
    screen.blit(background_image, bg_image_rect.move(bg_image_rect.width, 0))
    bg_image_rect.move_ip(-2, 0)
    if bg_image_rect.right <= 0:
        bg_image_rect.x = 0


    ball.draw(screen)
    pygame.display.update()

    clock.tick(60)

最佳答案

使用pygame的Sprites .

Angryball继承自pygame.sprite.Sprite并将 image_rect 重命名为 rect

给它一个更新函数,如下所示:

def update(self, screen):
    if self.rect.x <= 0:
        self.rect.right = screen.get_rect().width
        self.rect.top = random.randint(0, screen.get_rect().height)
    else:
        self.rect.move_ip(-5, 0)

不要手动将其传输到屏幕,而是使用 Group :

angryball = Angryball(mob_image, 700, random.randrange(400))
sprites = pygame.sprite.Group()
sprites.add(angryball)

在你的主循环中只需调用

sprites.update(screen)
sprites.draw(screen)
<小时/>

您的代码不起作用,因为您在实际声明之前尝试在该行中使用angryball_image_rect

关于python - 从边界生成移动物体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51417267/

相关文章:

python - 是否可以在 Tornado 中基于模板变量运行 javascript 代码?

python - 尝试在屏幕上调用多个 Sprite 会导致故障?

pygame - 使用 psychopy 时如何在不更改窗口类型的情况下克服 "RuntimeError: Gamma ramp size is reported as 0."?

python - 使用用户定义函数声明 pandas 系列

python - 匹配不包含特定字符串的文件

html - 如何使用 mpld3 将 xkcd 图导入 html

Python - UnicodeDecodeError : 'charmap' codec can't decode byte 0x9d in position 1070: character maps to <undefined>

python - 如何在未连接互联网的计算机上安装 pygame?

python - 使用二进制搜索找到上限和下限值

python - 无法弄清楚循环