2013-09-12 5 views
-1

Я работаю над типом игры космических захватчиков в Pygame. До сих пор я просто основы игры вниз:Создайте несколько экземпляров класса

import pygame, sys, os, math, random, time 
from pygame.locals import * 

pygame.init() 

window = pygame.display.set_mode((1000,500)) 
screen = pygame.display.get_surface() 

spaceBackground = pygame.image.load("C:/Users/LN/Desktop/space-background.png") 
spaceShip = pygame.image.load("C:/Users/LN/Desktop/space-ship.png") 
bullet = pygame.image.load("C:/Users/LN/Desktop/bullet.png") 
enemyShip = pygame.image.load("C:/Users/LN/Desktop/enemyAircraft.png") 
class move(): 
    '''Move the space ship''' 

    def _init_(self): 
     screen.blit(spaceBackground, (0,0)) 
     self.position = spaceShip.get_rect() 
     self.position = self.position.move(500,477) 
     global place 
     place = self.position 
     pygame.display.flip() 

    def moveUp(self): 
     screen.blit(spaceBackground, self.position, self.position) 
     self.position = self.position.move(0,-2) 
     global place 
     place = self.position 

    def moveDown(self): 
     screen.blit(spaceBackground, self.position, self.position) 
     self.position = self.position.move(0,2) 
     global place 
     place = self.position 

    def moveLeft(self): 
     screen.blit(spaceBackground, self.position, self.position) 
     self.position = self.position.move(-2,0) 
     global place 
     place = self.position 

    def moveRight(self): 
     screen.blit(spaceBackground, self.position, self.position) 
     self.position = self.position.move(2,0) 
     global place 
     place = self.position 

    def update(self): 
     screen.blit(spaceShip, self.position) 

    def notTooLow(self): 
     if self.position[1] < (478): 
      return True 
     else: 
      return False 

    def notTooHigh(self): 
     if self.position[1] > (4): 
      return True 
     else: 
      return False 
    def notTooRight(self): 
     if self.position[0] < (974): 
      return True 
     else: 
      return False 

    def notTooLeft(self): 
     if self.position[0] > (5): 
      return True 
     else: 
      return False 


class shoot(): 
    '''Shoots bullets out of the ship''' 

    def _init_(self): 
     global bulletUp 
     bulletUp = False 
     self.position = (0,0) 

    def startMoveUp(self): 
     self.position = place 
     self.position = self.position.move(11,0) 

    def bulletOnScreen(self): 
     if self.position[1] > -5: 
      return True 
     else: 
      global bulletUp 
      bulletUp = False 

    def moveUp(self): 
     screen.blit(spaceBackground, self.position) 
     self.position = self.position.move(0,-6) 
     screen.blit(bullet, self.position) 
     screen.blit(spaceShip, place) 


class enemy(): 
    '''Spawn and control enemies''' 

    def _init_(self): 
     global numbEnemy 
     numbEnemy = 0 
     self.position = enemyShip.get_rect() 

    def moveSpawn(self): 
     self.position = self.position.move(0,50) 

    def spawnEnemy(self):         
     screen.blit(enemyShip, (500, 20)) 
     self.position = enemyShip.get_rect() 

    def moveEnemy(self): 
     screen.blit(spaceBackground, self.position) 
     self.position = self.position.move(0,1) 
     screen.blit(enemyShip, self.position) 






move = move() 
move._init_() 
shoot = shoot() 
shoot._init_() 
enemy = enemy() 
enemy._init_() 



counter = 0 
while True: 
    if counter//300*300 == counter: 
     enemy.spawnEnemy() 
    if counter//2*2 == counter: 
     enemy.moveEnemy() 
    if pygame.key.get_pressed()[K_UP] and move.notTooHigh(): 
     move.moveUp() 
    pygame.event.pump() 
    if pygame.key.get_pressed()[K_DOWN] and move.notTooLow(): 
     move.moveDown() 

То, что я не знаю, как это сделать, это создать несколько вражеских кораблей. Есть ли простой способ сделать это, чтобы я мог создать еще один корабль, не удаляя другого?

+0

Вам нужно создать новый экземпляр 'enemy':' newEnemy = enemy(); newEnemy.spawnEnemy() ' – justhalf

+2

Я думаю, вы неправильно понимаете, какие классы. Класс - это своего рода вещь. Я не вижу никакого способа, чтобы «переместить» или «стрелять» мог быть чем-то другим. – user2357112

+0

Кроме того, '__init__' должен иметь по два символа подчеркивания с каждой стороны. Он неявно называется, когда создается экземпляр класса; вам не нужно явно вызывать метод '__init__' после создания объекта. – user2357112

ответ

3

Предположим, у вас есть класс, называемый врагом в вашей игре. Для краткости я не буду четко определять функции и просто буду использовать операторы pass в качестве заполнителей.

class Enemy: 
    def __init__(self): 
     pass 

    def update(self): 
     pass 

    def draw(self, display_surface): 
     pass 

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

enemies = [] 

Для добавления одного врага, вы просто добавить вызов конструктора enemy в свой список. Вы можете делать это столько раз, сколько хотите.

enemies.append(Enemy()) 

Как @monkey также упоминается в комментариях, вы можете легко использовать список понимание, чтобы установить список активных врагов несколько экземпляров объектов одновременно.

enemies = [Enemy() for x in range(10)] 

Затем в цикле игры, вы делаете что-то вроде следующего в каждой итерации:

for enemy in enemies: # loop through all your active enemies 
    enemy.update() # Update the state of every enemy. 

for enemy in enemies: # once again loop through all your active enemies 
    enemy.draw(display_surface) # Draw the image of every enemy to the display surface. 

И это является основным примером того, как вы аккуратно делать объектно-ориентированное программирование игры в Pygame.

+0

Спасибо тонну! Я чувствую, что на самом деле я начинаю понимать базовое понимание ООП и как работают петли игры! – Newbie404

+0

Вы также можете использовать понимание списка: 'враги = [Enemy() для x в диапазоне (10))]' – ninMonkey

+0

@monkey Будет ли это создавать только несколько объектов Enemy()? – Newbie404

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