如何在pygame中绘制类对象列表?

问题描述 投票:1回答:1

我正在尝试在pygame中创建“太空侵略者”(我是一个初学者,这只是我的第二个游戏,我已经创建了一个外星物体列表:

numOfAliens = 24
aliens = []

# An alien class containing an x, y, width, and height value
class alien:
    x, y = 0, 0
    width, height = 20, 20

# Loops 24 times and adds alien to the class
for i in range(numOfAliens):
    aliens.append(alien)

我还有另一段代码,为每个x值加上5和宽度,以将外星人隔开:

for i in aliens:
    i.x += 5 + i.width
    print(i.x, i.y, i.width, i.height)

印刷品告诉我,这前两个代码块工作正常,没有任何问题,当我尝试将其绘制到pygame窗口时会出现问题:

# Loops 24 times, drawing each alien to the window
for i in range(numOfAliens):
        pygame.draw.rect(win, GREEN, (aliens[i].x, aliens[i].y, aliens[i].width, aliens[i].height))

当然Aliens [i] .x将获得列表中每个对象的x值,但不会。如果我在此for循环中添加print(“ hi”),则它仅应循环执行24次且窗口上未绘制任何内容时,它会无限打印出“ hi”,有什么办法可以解决此问题?

如果需要,这里是所有代码:

import pygame
pygame.init()

clock = pygame.time.Clock()

# Window
win_width, win_height = 500, 500

win = pygame.display.set_mode((win_width, win_height))
pygame.display.set_caption("Space Invaders")


# Colours
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (30, 224, 27)


# Player
player_width, player_height = 20, 20
player_x, player_y = int((win_width / 2) - (player_width / 2)), (win_height - 50)
player_vel = 10
isShooting = False
isAlive = True


# Bullet
bullet_width, bullet_height = 4, 16
bullet_x, bullet_y = player_x, player_y
bullet_vel = 5


# Aliens
numOfAliens = 24
aliens = []

class alien:
    x, y = 0, 0
    width, height = player_width, player_height

for i in range(numOfAliens):
    aliens.append(alien)

for i in aliens:
    i.x += 5 + i.width
    print(i.x, i.y, i.width, i.height)

# Draw Function
def draw():
    win.fill(BLACK)
    pygame.draw.rect(win, GREEN, (player_x, player_y, player_width, player_height))

    for i in aliens:
        pygame.draw.rect(win, GREEN, (i.x, i.y, i.width, i.height))

    if isShooting:
        pygame.draw.rect(win, WHITE, (bullet_x, bullet_y, bullet_width, bullet_height))

    pygame.display.update()

# Game Loop
run = True
while run:
    clock.tick(20)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    keys = pygame.key.get_pressed()

    if keys[pygame.K_LEFT] and player_x > 0:
        player_x -= player_vel

    if keys[pygame.K_RIGHT] and player_x < win_width - player_width:
        player_x += player_vel

    if keys[pygame.K_SPACE] and not(isShooting):
        bullet_y = player_y
        bullet_x = int(player_x + (player_width / 2))
        isShooting = True

    if bullet_y + bullet_height <= 0:
        isShooting = False

    if isShooting:
        bullet_y -= bullet_vel

    draw()

pygame.quit()
python pygame draw
1个回答
1
投票

实际上,您不创建任何外星人实例。 alien只是类本身。

© www.soinside.com 2019 - 2024. All rights reserved.