python - 将对象作为参数,而不是作为实例/引用
问题描述
我目前正在使用 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 快得多,而且它也使代码更多面向对象。
解决方案
[改写] 终于明白你的问题了。您需要使用不同的类名创建不同的对象。因此,将创建者作为函数参数之一传递:
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)
现在你有一个很好的阵列,所有的障碍。
推荐阅读
- python-3.x - Pandas DataFrame:Groupby.First - 索引限制?
- list - 从字符串列表中仅提取由数字组成的元素
- angular - 使用带有 ngIf 的异步管道
- flutter - 使用多个图像创建链式颤动动画
- python - 设置我的表单(离开表单)需要自动化一些事情
- sql - 带有日期的 where 子句中的 If 语句
- python-3.x - 如何解决找不到反向匹配的问题?
- react-native - 有什么办法可以有不同的路线吗?
- ios - 无法代理网站或将 Charles Proxy 证书下载到 iPhone
- python - 如何检查字典中是否存在值在python中