Возьмите объект как аргумент, а НЕ как экземпляр / ссылку - PullRequest
0 голосов
/ 28 апреля 2018

В настоящее время я пишу игру с 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) Файл: GameMethods

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) Файл: Main

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 в качестве аргумента, он берет экземпляр или ссылку на память объекта и добавляет то же самое препятствие 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, и это также делает код более объектно-ориентированный.

1 Ответ

0 голосов
/ 28 апреля 2018

[REWRITED] Наконец-то понял вашу проблему. Вам нужно создавать разные объекты, используя разные имена классов. Поэтому передайте создателю один из параметров функции:

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)

А теперь у вас есть хороший массив со всеми препятствиями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...