【问题标题】:Create multiple instances of a class创建一个类的多个实例
【发布时间】:2025-12-11 03:40:01
【问题描述】:

我正在 Pygame 中开发太空入侵者类型的游戏。到目前为止,我只是了解了游戏的基础知识:

import pygame, sys, os, math, random, time
from pygame.locals import *

pygame.init()

window = pygame.display.set_mode((1000,500))
screen = pygame.display.get_surface()

spaceBackground = pygame.image.load("C:/Users/LN/Desktop/space-background.png")
spaceShip = pygame.image.load("C:/Users/LN/Desktop/space-ship.png")
bullet = pygame.image.load("C:/Users/LN/Desktop/bullet.png")
enemyShip = pygame.image.load("C:/Users/LN/Desktop/enemyAircraft.png")
class move():
    '''Move the space ship'''

    def _init_(self):
        screen.blit(spaceBackground, (0,0))
        self.position = spaceShip.get_rect()
        self.position = self.position.move(500,477)
        global place
        place = self.position
        pygame.display.flip()

    def moveUp(self):
        screen.blit(spaceBackground, self.position, self.position)
        self.position = self.position.move(0,-2)
        global place
        place = self.position

    def moveDown(self):
        screen.blit(spaceBackground, self.position, self.position)
        self.position = self.position.move(0,2)
        global place
        place = self.position

    def moveLeft(self):
        screen.blit(spaceBackground, self.position, self.position)
        self.position = self.position.move(-2,0)
        global place
        place = self.position

    def moveRight(self):
        screen.blit(spaceBackground, self.position, self.position)
        self.position = self.position.move(2,0)
        global place
        place = self.position

    def update(self):
        screen.blit(spaceShip, self.position)

    def notTooLow(self):
        if self.position[1] < (478):
            return True
        else:
            return False

    def notTooHigh(self):
        if self.position[1] > (4):
            return True
        else:
            return False
    def notTooRight(self):
        if self.position[0] < (974):
            return True
        else:
            return False

    def notTooLeft(self):
        if self.position[0] > (5):
            return True
        else:
            return False


class shoot():
    '''Shoots bullets out of the ship'''

    def _init_(self):
        global bulletUp
        bulletUp = False
        self.position = (0,0)

    def startMoveUp(self):
        self.position = place
        self.position = self.position.move(11,0)

    def bulletOnScreen(self):
        if self.position[1] > -5:
            return True
        else:
            global bulletUp
            bulletUp = False

    def moveUp(self):
        screen.blit(spaceBackground, self.position)
        self.position = self.position.move(0,-6)
        screen.blit(bullet, self.position)
        screen.blit(spaceShip, place)


class enemy():
    '''Spawn and control enemies'''

    def _init_(self):
        global numbEnemy
        numbEnemy = 0
        self.position = enemyShip.get_rect()

    def moveSpawn(self):
        self.position = self.position.move(0,50)

    def spawnEnemy(self):                                 
        screen.blit(enemyShip, (500, 20))
        self.position = enemyShip.get_rect()

    def moveEnemy(self):
        screen.blit(spaceBackground, self.position)
        self.position = self.position.move(0,1)
        screen.blit(enemyShip, self.position)






move = move()
move._init_()
shoot = shoot()
shoot._init_()
enemy = enemy()
enemy._init_()



counter = 0
while True:
    if counter//300*300 == counter:
        enemy.spawnEnemy()
    if counter//2*2 == counter:
        enemy.moveEnemy()
    if pygame.key.get_pressed()[K_UP] and move.notTooHigh():
        move.moveUp()
    pygame.event.pump()
    if pygame.key.get_pressed()[K_DOWN] and move.notTooLow():
        move.moveDown()

我不知道该怎么做,就是制造多艘敌舰。有没有一种简单的方法可以让我在不删除另一艘的情况下生成另一艘船?

【问题讨论】:

  • 您需要创建新的enemy 实例:newEnemy = enemy(); newEnemy.spawnEnemy()
  • 我认为你误解了什么是类。类是一种东西。我看不出moveshoot 可能是什么东西。
  • 另外,__init__ 每边应该有两个下划线。它在创建类的实例时被隐式调用;您不必在创建对象后显式调用 __init__ 方法。
  • 我认为你应该在开始制作游戏之前学习 Python...为了有效地使用 Pygame,你至少需要对 Python 中的面向对象编程有足够的了解,而你似乎没有有。
  • 好的.... 我了解类的工作原理(除了 init 的东西,这很有用),我只是不知道如何重复创建新类无需手动制作。有没有办法在代码中自动生成它们?

标签: python class pygame


【解决方案1】:

假设你的游戏中有一个名为敌人的类。为简洁起见,我不会明确定义函数,只会使用pass 语句作为占位符。

class Enemy:
    def __init__(self):
        pass

    def update(self):
        pass

    def draw(self, display_surface):
        pass

要创建多个敌人,您只需创建一个敌人列表,您将在其中存储对当前活动的敌人对象的所有引用。

enemies = []

要添加单个敌人,您只需将enemy 的构造函数调用附加到您的列表中。您可以根据需要多次执行此操作。

enemies.append(Enemy())

正如@monkey 在 cmets 中也提到的那样,您可以轻松地使用列表推导将您的活动敌人列表一次设置为多个对象实例。

enemies = [Enemy() for x in range(10)]

然后在您的游戏循环中,您在每次迭代中执行以下操作:

for enemy in enemies: # loop through all your active enemies
    enemy.update() # Update the state of every enemy.

for enemy in enemies: # once again loop through all your active enemies
    enemy.draw(display_surface) # Draw the image of every enemy to the display surface.

这是一个基本示例,说明如何在 Pygame 中巧妙地进行面向对象的游戏编程。

【讨论】:

  • 非常感谢!我觉得我实际上开始对 OOP 以及游戏循环的工作原理有了基本的了解!
  • 你也可以使用列表推导:enemies = [Enemy() for x in range(10)) ]
  • @monkey 这样做只会创建多个 Enemy() 对象吗?
  • @Shashank Gupta 另外,为什么要创建一个更新函数和一个绘制函数。为什么不把两者结合起来简化呢?
  • @Newbie404 因为在游戏循环中你有一个“更新阶段”和一个“绘制阶段”。在开始绘制任何东西之前,您总是希望分别更新所有游戏对象的状态。在真实的游戏中,这可能是 Player 类的一个实例、Enemy 类的几个实例、“Bullet”类的几个实例等等。此外,在游戏循环的绘制阶段,您可能希望在其他对象之上绘制某些对象。例如,您可能希望让玩家类始终与敌人类重叠(看到玩家很重要!)....