2016-02-26 2 views
0

Итак, я начинаю веселиться с pygame. Но у меня проблемы. Я пытался каким-то образом усовершенствовать свой код, сделать его организованным, поэтому я решил использовать классы здесь. Это выглядит так:Использование классов в Pygame

import pygame 
from pygame.locals import * 
import sys 

pygame.init() 

class MainWindow: 
    def __init__(self, width, height): 
     self.width=width 
     self.height=height 
     self.display=pygame.display.set_mode((self.width,self.height)) 
     pygame.display.set_caption("Caption") 
    def background(self) 
     img = pygame.image.load("image.png") 
     self.display.blit(img, (0,0))    

mainWindow = MainWindow(800,600) 

while True: 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      pygame.exit() 
      sys.exit() 
     mainWindow.background() 
    pygame.display.update() 

Хорошо, работает. Но что, если я хочу, например, заполнить окна белым цветом? Затем я должен определить метод fill(), который будет только self.display.fill(), правильно? Есть ли способ справиться с этим нормально, не определяя сотни уже существующих методов pygame в моем классе?

И еще одно. Если я что-то сделать с помощью моего класса, и я завинтить, я всегда получаю эту Сообщ:

File "C:/Python35/game.py", line 23, in <module> 
    pygame.display.update() 
pygame.error 

И я на самом деле не знаю, что, черт возьми, это не так. Если я делаю это нормально, без классов, то я получаю erros, например, pygame object blabla has no method blablabla или что-то в этом роде, я просто знаю, что происходит. Есть ли способ преодолеть это и найти, что происходит?

Заранее благодарим за вашу помощь!

+0

Вы можете установить родительский класс, который определяет цвет, который ваш MainWindow мог бы наследовать от него. –

+0

Да, я знаю, но я хотел, чтобы ситуация была похожа на вашу, но когда MainWindow наследует, как из некоторого класса pygame, поэтому методы наследуются , нет необходимости определять их XD И я думаю, что это невозможно :( – Frynio

+0

Почему бы просто не установить класс, который я предлагаю вместо этого в качестве mixin? –

ответ

4

Что вы здесь делаете, это на правильном пути, но это сделано неправильно. Ваш основной «игровой цикл» должен быть внутри самого класса как метод, а не вызывать материал извне класса в реальном цикле. Вот основной пример того, что вы должны делать.

#Load and initialize Modules here 
import pygame 
pygame.init() 

#Window Information 
displayw = 800 
displayh = 600 
window = pygame.display.set_mode((displayw,displayh)) 

#Clock 
windowclock = pygame.time.Clock() 

#Load other things such as images and sound files here 
image = pygame.image.load("foo.png").convert #Use conver_alpha() for images with transparency 

#Main Class 
class MainRun(object): 
    def __init__(self,displayw,displayh): 
     self.dw = displayw 
     self.dh = displayh 
     self.Main() 

    def Main(self): 
     #Put all variables up here 
     stopped = False 

     while stopped == False: 
      window.fill((255,255,255)) #Tuple for filling display... Current is white 

      #Event Tasking 
      #Add all your event tasking things here 
      for event in pygame.event.get(): 
       if event.type == pygame.QUIT: 
        pygame.quit() 
        quit() 
       elif event.type == pygame.KEYDOWN: 
        stopped = True 

      #Add things like player updates here 
      #Also things like score updates or drawing additional items 
      #Remember things on top get done first so they will update in the order yours is set at 

      #Remember to update your clock and display at the end 
      pygame.display.update() 
      windowclock.tick(60) 

     #If you need to reset variables here 
     #This includes things like score resets 

    #After your main loop throw in extra things such as a main menu or a pause menu 
    #Make sure you throw them in your main loop somewhere where they can be activated by the user 

#All player classes and object classes should be made outside of the main class and called inside the class 
#The end of your code should look something like this 
if __name__ == __main__: 
    MainRun() 

Основная петля будет называть себя при создании объекта MainRun().

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

Я надеюсь, что это поможет вам с вашим программированием и удачей вам.

=============== РЕДАКТИРОВАНИЕ ========================================================== ============

В этом случае для этих специальных операций сделать их объектами конкретными. Вместо того, чтобы использовать один общий метод, чтобы разжечь ваши объекты, сделайте каждый объект своей собственной функцией. Это делается таким образом, чтобы у вас было больше возможностей для каждого объекта. Общая идея для кода ниже ... Я создал простой объект игрока здесь.

#Simple player object 
class Player(object): 
    def __init__(self,x,y,image): 
     self.x = x 
     self.y = y 
     self.image = image 

    #Method to draw object 
    def draw(self): 
     window.blit(self.image,(self.x,self.y)) 

    #Method to move object (special input of speedx and speedy) 
    def move(self,speedx,speedy): 
     self.x += speedx 
     self.y += speedy 

Теперь вот как вы используете методы объекта ... Я включил цикл событий, чтобы показать, как использовать функцию перемещения. Просто добавьте этот код в свой основной цикл, где он нужен, и все будет готово.

#Creating a player object 
player = Player(0,0,playerimage) 

#When you want to draw the player object use its draw() method 
player.draw() 

#Same for moving the player object 
#I have included an event loop to show an example 
#I used the arrow keys in this case 
speedx = 0 
speedy = 0 

for event in pygame.event.get(): 
    if event.type == pygame.KEYDOWN: 
     if event.key == pygame.K_UP: 
      speedy = -5 
      speedx = 0 
     elif event.key == pygame.K_DOWN: 
      speedy = 5 
      speedx = 0 
     elif event.key == pygame.K_RIGHT: 
      speedy = 0 
      speedx = 5 
     elif event.key == pygame.K_LEFT: 
      speedy = 0 
      speedx = -5 
    elif event.type == pygame.KEYUP: 
     speedx = 0 
     speedy = 0 

#Now after you event loop in your object updates section do... 
player.move(speedx,speedy) 
#And be sure to redraw your player 
player.draw() 

#The same idea goes for other objects such as obstacles or even scrolling backgrounds 

Обязательно используйте одно и то же отображаемое имя дисплея внутри своей функции рисования.

+0

Хорошо, спасибо. Но я хотел спросить что-то вроде этого: Итак, у меня есть класс, но вы создали класс MainRun(). Я хотел, чтобы это было похоже на MainWindow(), потому что это было бы так: awkay, 'mainWindow = MainWindow (800,600)', получил мой объект window, теперь позволяет установить надпись 'mainWindow.caption (« My window »)' , хорошо, теперь позволяет blit фоновое изображение к нему 'mainWindow.background (" image.png ")'. И метод 'background()' по-прежнему вызывает метод класса pygame - load, а затем 'blit()'. И даже если этот метод существует в pygame, мне все равно нужно определить их в моем классе, и я не хочу этого делать – Frynio

+0

Хорошо, что я обновил ответ в разделе === EDIT ===, чтобы показать, как использовать другие объекты внутри вашей игры. – TacoTree11

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