2016-12-18 3 views
1

Я делаю игру, в которой вы летаете вокруг галактики, и там должны быть другие корабли, которые летают куда-то, но как я могу это запустить? допустим, как X количество раз.Как создать или запустить этот класс? python

Все так, если есть способ закрыть все корабли?

class spaceship(): ###thigs that fly arround when GUI == 4 

    def __init__(self,GUIstatus): 

     self.shipUp = pygame.image.load("icons/shipUP.png") 
     self.shipRight = pygame.image.load("icons/shipRIGHT.png") 
     self.shipLeft = pygame.image.load("icons/shipLEFT.png") 
     self.shipDown = pygame.image.load("icons/shipDOWN.png") 
     self.shipImage = self.shipLeft 
     self.shipnpc_x = 0 
     self.shipnpc_y = 0 
     self.GUIstatus = GUIstatus 

     self.shipType = (random.randrange(0,10)) 
     self.randomspeed = (random.randrange(0,5)) 
     self.speed = 10 += self.randomspeed 

     self.exists = 0 

     ##Logic place for selecting and randomizing ship and things 

    def Update(self): 
      if self.exists == 1: 
       return 
      if self.exists == 0 and self.GUIstatus == 4: 
       if dirrection == LEFT: 
        self.shipnpc_x +=selfspeed 
        self.shipImage = self.shipLeft 

       if dirrection == RIGHT: 
        self.shipnpc_x -=selfspeed 
        self.shipImage = self.shipRight 

       if dirrection == UP: 
        self.shipnpc_y -=self.speed 
        self.shipImage = self.shipUp 

       if dirrection == DOWN: 
        self.npcship_y +=self.speed 
        self.shipImage = self.shipDown 


    def Draw(self,screen): 
      if self.exists == 1: 
       return 
      screen.blit(self.shipImage,(self.shipnpc_x,self.shipnpc_y)) 
+0

Ваш вопрос немного неясен. Вы можете создавать новые экземпляры 'ship1 = spaceship()', а затем вызывать метод update/draw с помощью 'ship1.Draw()' или 'ship1.Update()'. Но я предполагаю, что это не то, что вы имеете в виду? Кроме того, принято называть имена классов 'Spaceship' _ (CamelCase) _ и методы/переменные' update' _ (lower_case) _. Это соглашение облегчает другим программистам понимание программ друг друга. –

+0

вам нужно 'mainloop', в котором вы перемещаете все корабли в каждом цикле. Каждое судно должно иметь собственный метод 'update()', который меняет свое положение. – furas

+0

[простой пример] (https://github.com/furas/python-examples/tree/master/pygame/follow-player), в котором у вас есть игрок и два игрока - когда вы перемещаете игрока, то и сами движутся. – furas

ответ

1

Не беспокойтесь, это на самом деле довольно распространенная проблема, с которой сталкиваются новички.

То, что вы хотите сделать, это поставить свои объекты в какой-то список (в питоне, вы обычно используете []), и вместо вызова методов на одном объекте, как

ship1.Update() 

вы используете петля перебрать этот список, как

for ship in ships: 
    ship.Update() 

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

Вы должны начать с использования классов Sprite и Group, поэтому давайте изменим ваш класс spaceship. Обратите внимание на комментарии

class Spaceship(pygame.sprite.Sprite): ###thigs that fly arround when GUI == 4 

    def __init__(self, ships, GUIstatus): 

     # ships is a Group for all ships 
     pygame.sprite.Sprite.__init__(self, ships) 
     self.shipUp = ... 

     # the image has to be in self.image 
     self.image = self.shipLeft 

     # no need for shipnpc_x and shipnpc_y, since we store 
     # our position in self.rect 
     self.rect = self.image.get_rect() 
     self.GUIstatus = GUIstatus 

     self.shipType = ... 

    # this has to be called update instead of update 
    # to work with groups 
    def update(self): 

     # to change the position, we just alter self.rect 

     if self.exists == 0 and self.GUIstatus == 4: 
      if dirrection == LEFT: 
       self.rect.move_ip(-self.speed, 0) 
       self.shipImage = self.shipLeft 

      if dirrection == RIGHT: 
       self.rect.move_ip(self.speed, 0) 
       self.shipImage = self.shipRight 

      if dirrection == UP: 
       self.rect.move_ip(0, -self.speed) 
       self.shipImage = self.shipUp 

      if dirrection == DOWN: 
       self.rect.move_ip(0, self.speed) 
       self.shipImage = self.shipDown 

    # no need for the Draw function, since it's handled 
    # by the sprite class' draw function 

Теперь с этими изменениями на месте, мы просто должны создать Group:

ships = pygame.sprite.Group() 

Поэтому, когда вы создаете Spaceship, вы поместите его в группу кораблей, просто прохождения группы к инициализатору. Если вы хотите 30 судов, просто использовать цикл:

for _ in xrange(30): 
    Spaceship(ships, GUIstatus) 

Как для обновления и рисования, просто позвоните

ships.update() 
ships.draw(screen) 

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

Вот и все! Если вы хотите избавиться от Spaceship, просто вызовите функцию kill (возможно, внутри метода обновления) или используйте что-то вроде pygame.sprite.groupcollide, чтобы сделать это автоматически.

В конце концов, вы, вероятно, захотите иметь несколько групп, например. одну группу за все, что вы назовете update и draw на вашем mainloop, и, если вы создадите, скажем, игру-шутер, одну группу для всех врагов и одну для ваших пуль, чтобы вы могли использовать pygame.sprite.groupcollide для обнаружения столкновений и т. д.

+0

«self.rect.move_ip (self.speed, 0)» внутри (x, y) правильно? и что должно быть xrange be? – cmdtvt

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