2015-07-04 4 views
1

Приносим извинения за плохой титул. У меня есть опыт работы с кодом игры с C# (XNA) или java (LibGDX), но я недавно начал использовать python и pygame, и мне трудно понять, как создать код. Это, как я думал, что это будет сделать, чтобы сделать:Pygame - разработка кода

game.py файл:

import pygame 
import entities 

width = 400 
height = 300 
# Set up the window size 
screen = pygame.display.set_mode((width, height), 0, 32) 
player = entities.Player(width/2, height/2) # The player 

#main game loop is here... 

entities.py файл:

import pygame 
import game 

class Player: 
    def __init__(self, x, y): 
     # Texture for the player 
     self.texture = pygame.image.load('player.png') 

    def draw(self): 
     """ Draws the player """ 
     game.screen.blit(self.texture, (self.position.x, self.position.y)) 

#class Enemy: ... 

Однако этот код дать мне ошибки. Я думаю, проблема в том, что я импортирую entities.py в game.py, а затем импортирую game.py в entities.py.

Как я буду правильно проектировать это в python?

ответ

1

Я рекомендую использовать то, что уже предлагает pygame.

Взгляните на классы Sprite и Group (и их более сложные подклассы).

Так ваш класс игрок может выглядеть следующим образом:

class Player(pygame.sprite.Sprite): 

    def __init__(self, x, y): 
     pygame.sprite.Sprite.__init__(self) 
     # Texture for the player 
     self.image = pygame.image.load('player.png') 
     self.rect = self.image.get_rect(topleft=(x, y)) 

    # no need for a draw function 
    # the sprite class will handle this 
    # just make sure you store the coordinates of 
    # your entity in self.rect 

    def update(self, some_game_state): 
     pass # do something with some_game_state 

Тогда в вашей игре, вы должны поместить все ваши лиц в одном (или более) группой (ами), а просто позвонить draw и update на эта группа (группы).

entities = pygame.sprite.Group(player) # add other sprite here, too 

# main loop 
while True: 
    ... 

    # pass the game state to all entities 
    # how you design this is up to you 
    # (pass multiple values, pass a single instace of the game class, 
    # create a class that encapsulates the state necesseray for the entities etc.) 
    entites.update(some_game_state) 

    # pass the main surface to the draw function 
    entities.draw(screen) 

    ... 
0

Вы должны передать переменные в соответствующие классы, а не делать их глобальными и импортировать. Таким образом, один из возможных решений было бы сделать screen атрибут игрока:

class Player: 
    def __init__(self, x, y, screen): 
     self.screen = screen 
     ... 

    def draw(self): 
     """ Draws the player """ 
     self.screen.blit(...) 

Теперь нет необходимости импортировать game в entities.py, и вы можете создать экземпляр плеер там, как это:

player = entities.Player(width/2, height/2, screen) 

Возможно, есть другие способы сделать это, но это должно дать вам эту идею.

+0

Для игрока или сущности не имеет атрибута 'screen'. Это должно быть атрибутом, который войдет в 'static class Game' в C# или java. Кроме того, мне пришлось бы получить доступ ко многим переменным, если не ко всем переменным из моего файла 'game.py'. Это приведет к тому, что в будущем многие параметры будут включены во все мои функции, что будет очень запутанным. Любые другие идеи? – dimitris93

+0

Я не понимаю, почему это должен быть статический атрибут; это часть данных, которую игрок должен ссылаться, поэтому для нее вполне разумно быть атрибутом экземпляра. В любом случае, если вы не хотите этого делать, вы можете просто передать его в качестве аргумента для 'draw'. –

+0

Ну, это кажется немного лучше. Будет ли смысл обертывать код, который у меня внутри 'game.py' внутри класса' game', и передать это как параметр, когда мне нужно больше, чем только одна переменная? Или это кажется еще хуже? – dimitris93

Смежные вопросы