首页 > 解决方案 > 将对象作为参数,而不是作为实例/引用

问题描述

我目前正在使用 pygame 编写游戏,但遇到了将对象作为参数的问题。所以,1)我有一个对象类,2)一个函数,它接受一个对象和一个整数并将对象附加到数组中 X 次,其中 X 等于整数,然后函数返回数组,以及 3)运行初始化对象的函数。

这些部分中的每一个都位于不同的文件中。他们每个导入 pygame 和 3) 导入 1) 和 2)

1)文件:对象

import pygame

class Obstacle(pygame.sprite.Sprite):
def __init__(self, screen, settings):
    # Initialize the lander
    #make the lander a sprite
    pygame.sprite.Sprite.__init__(self)
    #Keep local copy of screen
    self.screen = screen
    self.image = pygame.image.load('lander.png')
    self.imageCopy = self.image.copy()
    self.rect = self.image.get_rect()
    #Start with each new lander at the top of the screen
    self.rect.centerx = random.randint(50, settings.screen_width - 50)
    self.rect.centery = 0

2)文件:游戏方法

import pygame

def random_array(number_needed, object):
#Takes in the number of objects to be created in an array
#and returns that new array
#Use: to make an array that holds randomly located objects
number_assigned = 0
array = []
while number_assigned < number_needed:
    array.append(object)
    number_assigned += 1
return array

3)文件:主要

from Objects import Obstacles
import GameMethods as gm

def run_game():
"""Main function to start game and run top-level loop"""
# Initialize pygame, settings and screen object.
pygame.init()
  ....
  some unrelated code
  ....
 number_of_fixed_Obstacles_needed = 5
fixed_Obstacles_array = gm.random_array(number_of_fixed_Obstacles_needed, fixedObstacle(screen, settings)

问题出现在 3) 当我调用 gm.random_array 时。我不是 100% 确定,但是当我调用 fixedObstacle 作为参数时,它会获取对象的实例或内存引用并附加 SAME Obstacle 5 次。我试图让它在数组中附加 5 个不同的障碍物。

如果我把它放在运行函数中,它可以工作

 number_of_Obstacles_assigned = 0
 Obstacles_array = []
 while number_of_Obstacles_assigned < number_of_Obstacles_needed:
        Obstacles_array.append(fixedObstacle(screen, settings)
        number_of_Obstacles_assigned += 1

PS。我正在尝试制作一个函数,因为有许多我想附加到不同数组的 Object 类,因此调用 gm.random_array(number, object) 比调用 while-loop 快得多,而且它也使代码更多面向对象。

标签: pythonpygame

解决方案


[改写] 终于明白你的问题了。您需要使用不同的类名创建不同的对象。因此,将创建者作为函数参数之一传递:

import pygame

def random_array(number_needed, Creator, screen, settings):
    #Takes in the number of objects to be created in an array
    #and returns that new array
    #Use: to make an array that holds randomly located objects
    number_assigned = 0
    array = []
    while number_assigned < number_needed:
        array.append(Creator(screen, settings))
        number_assigned += 1
    return array

然后在Main

fixed_obstacles1_array = gm.random_array(number_obstacles1, Obstacle1, screen, settings)
fixed_obstacles2_array = gm.random_array(number_obstacles2, Obstacle2, screen, settings)
...

最后,如果您愿意,您可以连接这些数组

all_obstacles = fixed_obstacles1_array + fixed_obstacles2_array 

或者更面向对象的方式:

all_obstacles = []
disered_obstacles = [Obstacle1, Obstacle2, ObstacleN]
numbers_needed = [42, 3, 17]

for obstacle, number in zip(disered_obstacles, numbers_needed):
    all_obstacles += gm.random_array(number, obstacle, screen, settings)

现在你有一个很好的阵列,所有的障碍。


推荐阅读