Hi,

Anyone have any ideas for this issue? i hope I got the messages in the right
thread...

Thanks...


On Tue, Jan 4, 2011 at 8:25 AM, Cristina Ionescu <[email protected]>wrote:

> Hi Luke,
>
> Thanks for the quick response, it's true I should know better for giving
> details... Here's a simplified code that respects the way I implemented the
> game and how it's used. The precise issue is that the escape key has no
> effect and closing the game window kills everything, app main window and
> all... I'm going to look more at why the Escape key isn't interpreted, I
> haven't looked into it closely..
> Hope this is more helpful and thanks again:
>
>
> import sys
>
> from PyQt4.QtCore import *
> from PyQt4.QtGui  import *
>
> import pygame
> from   pygame.locals import *
>
> #a thread called elsewhere due to other reasons
> class mythread(QThread):
>
>     def __init__(self, game_owner, parent=None):
>         super(mythread, self).__init__(parent)
>
>         self.halted = False
>         self.mutex = QMutex()
>         self.game_owner = game_owner
>
>     def initialize(self):
>         self.halted = False
>
>     def run(self):
>         self.upd_game()
>
>     def upd_game(self):
>         while not self.halted:
>             #restart game if over and replay is enabled
>             if (self.game_owner.game !=None):
>                 if (not self.game_owner.game.gameover):
>                     self.game_owner.game.run()
>                     #an escape or quit game can happen during a run...
>                 else:
>                     #need to close pygame window only
>                     #try:
>                     #    self.game_owner.game.quit()
>                     #except:
>                     #    pass
>                     self.game_owner.game = None
>
>     def stop(self):
>         try:
>             self.mutex.lock()
>             self.halted = True
>         finally:
>             self.mutex.unlock()
>
> ##Game - counts Up and DOwn keys pressed
> class mygame:
>
>     def __init__(self):
>         #game variables and flags
>         self.nb_up = 0
>         self.nb_down   = 0
>         self.gameover  = False
>         self.replay    = True
>
>         #Clock
>         self.clock = pygame.time.Clock()
>
>         #Display configuration
>         self.screen = pygame.display.set_mode((200,200))
>         pygame.display.set_caption("Have fun with my bogus game!")
>
>         #background entity
>         self.background = pygame.Surface(self.screen.get_size())
>         self.background = self.background.convert()
>         self.background.fill((0,0,0))
>
>         #Score board label
>         pygame.font.init()
>         text          = "Up: "+ str(self.nb_up) + "   vs.   Down: " +
> str(self.nb_down)
>         self.lbl_font = pygame.font.SysFont("Comic Sans MS", 12)
>         self.label    = self.lbl_font.render(text, 1, (200,200,200))
>
>     ##Update score label
>     def upd_score(self):
>         text          = "Up: "+ str(self.nb_up) + "   vs.   Down: " +
> str(self.nb_down)
>         self.label    = self.lbl_font.render(text, 1, (200,200,200))
>
>     ##Interpret pressed key
>     def interpret_key(self):
>         #get pressed key
>         keystate = pygame.key.get_pressed()
>
>         if keystate[pygame.locals.K_UP]:
>             self.nb_up += 1
>
>         if keystate[pygame.locals.K_DOWN]:
>             self.nb_down += 1
>         #player wants to stop game - no effect?
>         if keystate[pygame.locals.K_ESCAPE]:
>             return False
>
>         return True
>
>    ##Method called in thread
>     def run(self):
>
>         #tick the clock
>         self.clock.tick(30)
>
>         #update key score or exit
>         if not self.interpret_key():
>             self.replay   = False
>             self.gameover = True
>             return
>
>         #Quit the game
>         for event in pygame.event.get():
>             if event.type == pygame.QUIT:
>                 self.gameover = True
>                 self.replay   = False
>
>         #update graphical components
>         self.screen.blit(self.background, (0,0))
>         self.upd_score()
>         self.screen.blit(self.label, (10,10))
>         pygame.display.flip()
>
>     ##quit game
>     def quit(self):
>         pygame.quit()
>         #pygame.display.quit()
>
> ##main window class
> class mainwin(QMainWindow):
>
>     def __init__(self, parent=None):
>         QMainWindow.__init__(self)
>
>         #Main window settings
>         self.setWindowTitle("Trying to exit pygame")
>         self.setMinimumSize(300 , 300)
>         #self.move(0,0)
>
>         self.winthread = None
>         self.game = None
>
>         #menu
>         #Create the Menu Bar
>         self.menu = self.menuBar()
>
>         #Create the File menu entry in the bar
>         self.file_menu = self.menu.addMenu('&File')
>         #Create the File entry actions
>         self.file_quit = self.file_menu.addAction('&Quit')
>         self.file_quit.setShortcut(QKeySequence('Ctrl+Q'))
>         self.connect(self.file_quit, SIGNAL("triggered()"), self.quit)
>
>         #toolbar
>         self.toolbar = QToolBar(self)
>         self.toolbar.setObjectName("toolbar")
>         self.addToolBar(self.toolbar)
>
>         #add menu actions to toolbar
>         self.toolbar.addAction(self.file_quit)
>
>         #main widget
>         self.mainWidget  = QWidget()
>         self.setCentralWidget(self.mainWidget)
>
>         layv = QVBoxLayout()
>
>         self.b_startgame = QPushButton('Go!', self.mainWidget)
>         self.b_startgame.setMaximumWidth(100)
>         self.connect(self.b_startgame, SIGNAL('clicked()'),
> self.start_game)
>         layv.addWidget(self.b_startgame)
>
>         self.mainWidget.setLayout(layv)
>
>     ##exit app window
>     def quit(self):
>         self.close()
>
>     #start game and thread calling its run
>     def start_game(self):
>         self.winthread = mythread(self)
>         self.winthread.start()
>         self.game = mygame()
>
>
> if __name__ == "__main__":
>     app = QApplication(sys.argv)
>     app.setApplicationName('TestPyGame')
>
>     form = mainwin()
>     form.show()
>     app.exec_()
>
>
>

Reply via email to