コード例 #1
0
class Window(QGraphicsScene):

    next_level = pyqtSignal(int)

    next_level2 = pyqtSignal(int)

    sound_invaderkilled = QtMultimedia.QSound(
        'assets/sounds/invaderkilled.wav')
    sound_shipexplosion = QtMultimedia.QSound(
        'assets/sounds/shipexplosion.wav')

    def __init__(self, singlemulti, level_number, parent=None):
        QGraphicsScene.__init__(self, parent)

        self.key_notifier = KeyNotifier()
        self.key_notifier.key_signal.connect(self.do_key_press)
        self.key_notifier.start()

        self.numberOfPlayer = singlemulti
        self.level_numberrr = level_number

        # Postavljanje pozadine
        self.set_background()

        #Postavljanje Glavnog igraca
        if (self.numberOfPlayer == 1):
            self.player = Player()
            self.player.setPos(400, 525)
            self.addItem(self.player)
            self.flag_playerOneDead = False

        elif (self.numberOfPlayer == 2):
            self.player = Player()
            self.player.setPos(400, 525)
            self.addItem(self.player)
            self.flag_playerOneDead = False

            self.player2 = Player2()
            self.player2.setPos(100, 525)
            self.addItem(self.player2)
            self.flag_playerTwoDead = False

        # Postavljanje neprijatelja
        self.enemies = []
        self.enemies.append(Enemy())
        self.enemies[0].setPos(100, 50)

        for i in range(0, 55):
            self.enemies.append(Enemy())
            if i == 11:
                self.enemies[i].setPos(self.enemies[0].x(),
                                       self.enemies[0].y() + 60)
                continue
            if i == 22:
                self.enemies[i].setPos(self.enemies[11].x(),
                                       self.enemies[11].y() + 60)
                continue
            if i == 33:
                self.enemies[i].setPos(self.enemies[22].x(),
                                       self.enemies[22].y() + 60)
                continue
            if i == 44:
                self.enemies[i].setPos(self.enemies[33].x(),
                                       self.enemies[33].y() + 60)
                continue
            self.enemies[i].setPos(self.enemies[i - 1].x() + 60,
                                   self.enemies[i - 1].y())

        for i in range(0, 55):
            self.addItem(self.enemies[i])

        # Pomeranje neprijatelja
        self.moveEnemy = MoveEnemy()
        self.moveEnemy.calc_done.connect(self.move_enemy)
        self.moveEnemy.start()

        # Pucanje igraca
        self.shootLaser = PlayerShoot()
        self.shootLaser.calc_done.connect(self.move_laser_up)
        self.shootLaser.collision_detected.connect(
            self.player_laser_enemy_collide)
        self.shootLaser.start()
        self.playerOneCanShoot = True
        self.playerTwoCanShoot = True

        # Pucanje protivnika
        self.enemyShoot = EnemyShoot()
        self.enemyShoot.can_shoot.connect(self.enemy_shoot_laser)
        self.enemyShoot.move_down.connect(self.move_enemy_laser)
        self.enemyShoot.collision_detected.connect(self.enemy_hit_player)
        self.enemyShoot.collision_detected_with_shield.connect(
            self.enemy_laser_shield_collide)
        #self.enemyShoot.next_level.connect(self.next_level)
        if self.numberOfPlayer == 1:
            self.enemyShoot.add_player(self.player)
        else:
            self.enemyShoot.add_player(self.player)
            self.enemyShoot.add_player(self.player2)
        self.enemyShoot.start()

        for i in range(0, 55):
            self.moveEnemy.add_enemy(self.enemies[i])
            self.shootLaser.add_enemy(self.enemies[i])
            self.enemyShoot.add_enemy(self.enemies[i])

        #Dodavanje stitova
        self.shields = []
        self.shields.append(Shield())
        self.shields[0].setPos(50, 350)
        self.shields.append(Shield())
        self.shields[1].setPos(375, 350)
        self.shields.append(Shield())
        self.shields[2].setPos(700, 350)

        for i in range(0, 3):
            self.addItem(self.shields[i])
            self.enemyShoot.add_shield(self.shields[i])

        self.view = QGraphicsView(self)
        self.view.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.view.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.view.show()
        self.view.setFixedSize(WINDOW_WIDTH, WINDOW_HEIGHT)
        self.setSceneRect(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT)

        self.initUI(self.numberOfPlayer, self.level_numberrr)

    def move_enemy(self, enemyPixMap: QGraphicsPixmapItem, newX, newY):
        enemyPixMap.setPos(newX, newY)

    def remove_enemy_label(self, enemy: QGraphicsPixmapItem):
        if enemy in self.enemies:
            self.enemies.remove(enemy)

    def remove_laser(self, laserLabel: QGraphicsPixmapItem):
        if laser in self.enemies:
            self.enemies.remove(enemy)
            self.enemyShoot.remove_enemy(
                enemy)  #Da ne pucaju kad su vec pogodjeni

    def keyPressEvent(self, event):
        self.key_notifier.add_key(event.key())

    def keyReleaseEvent(self, event):
        if (self.key_notifier.exists_key(event.key())):
            self.key_notifier.rem_key(event.key())

    # POKUSAJ PROCESA

    def do_key_press(self, key):
        try:
            # proc = multiprocessing.Process(target = self.__update_position__, args = [key])
            # proc.start()
            # proc.join()

            #(Process(target=__update_position__, args=[key])).start()

            self.__update_position__(key)
        except Exception as e:
            print('Exception: {}'.format(str(e)))

    def set_background(self):
        loadedPicture = QImage('assets/background.png')
        brushBackground = QBrush(loadedPicture)
        self.setBackgroundBrush(brushBackground)

    def player_laser_enemy_collide(self, enemyLabel: QGraphicsPixmapItem,
                                   laserLabel: QGraphicsPixmapItem):
        try:
            self.sound_invaderkilled.play()
            enemyLabel.hide()
            laserLabel.hide()
            self.shootLaser.remove_laser(laserLabel)
            self.shootLaser.remove_enemy(enemyLabel)
            self.remove_enemy_label(enemyLabel)
            self.enemyShoot.remove_enemy(enemyLabel)
            self.moveEnemy.remove_enemy(enemyLabel)

            if len(self.enemies) == 1:
                if (self.numberOfPlayer == 1):
                    # Gasenje threadova
                    self.shootLaser.die()
                    self.moveEnemy.die()
                    self.enemyShoot.die()
                    # Unistavanje postojecih projektila na screenu
                    for laser in self.shootLaser.laserLabels:
                        self.removeItem(laser)
                    for laser in self.enemyShoot.lasers:
                        self.removeItem(laser)
                    for shield in self.shields:
                        self.removeItem(shield)
                    self.shields.clear()

                    # Povecavanje nivoa za jedan i restart neprijatelja update gui
                    self.level_numberrr += 1
                    self.level_advance()
                    self.Widget.setZValue(50)

                elif (self.numberOfPlayer == 2):
                    # Gasenje threadova
                    self.shootLaser.die()
                    self.moveEnemy.die()
                    self.enemyShoot.die()
                    # Unistavanje postojecih projektila na screenu
                    for laser in self.shootLaser.laserLabels:
                        self.removeItem(laser)
                    for laser in self.enemyShoot.lasers:
                        self.removeItem(laser)
                    for shield in self.shields:
                        self.removeItem(shield)
                    self.shields.clear()

                    # Povecavanje nivoa za jedan i restart neprijatelja update gui
                    self.level_numberrr += 1
                    self.level_advance()
                    self.Widget.setZValue(50)

        except Exception as e:
            print(
                'Exception in Main_Thread/player_laser_enemy_collide method: ',
                str(e))

    def enemy_laser_shield_collide(self, laserLabel: QGraphicsPixmapItem,
                                   shieldLabel: QGraphicsPixmapItem):
        try:
            self.sound_shipexplosion.play()
            self.enemyShoot.remove_laser(laserLabel)
            laserLabel.hide()

            for shield in self.shields:
                if shield == shieldLabel:
                    shield.makeDamage()
                    if shield.health <= 0:
                        self.enemyShoot.remove_shield(shield)
                        self.shields.remove(shield)
                    shield.update_shield(shield)

        except Exception as e:
            print(str(e))

    def player_shoot_laser(self, laserLabel: QGraphicsPixmapItem, startX,
                           startY):
        laserLabel.setPos(startX + PLAYER_BULLET_X_OFFSETS[0],
                          startY - PLAYER_BULLET_Y)
        self.addItem(laserLabel)
        self.shootLaser.add_laser(laserLabel)

    def move_laser_up(self, laserLabel: QGraphicsPixmapItem, newX, newY):
        if newY > 0:
            laserLabel.setPos(newX, newY)
        else:
            laserLabel.hide()
            self.shootLaser.remove_laser(laserLabel)

    def enemy_shoot_laser(self, startX, startY):
        enemyLaserLabel = BulletEnemy()
        enemyLaserLabel.setPos(startX, startY)
        self.addItem(enemyLaserLabel)

        # dodamo laser da moze da se krece ka dole
        self.enemyShoot.add_laser(enemyLaserLabel)

    def move_enemy_laser(self, enemyLaser: QGraphicsPixmapItem, newX, newY):
        if newY < WINDOW_HEIGHT - 50:
            enemyLaser.setPos(newX, newY)
        else:
            enemyLaser.hide()
            self.enemyShoot.remove_laser(enemyLaser)

    def enemy_hit_player(self, laserLabel: QGraphicsPixmapItem,
                         playerLabel: QGraphicsPixmapItem):
        self.sound_shipexplosion.play()
        laserLabel.hide()

        if self.player == playerLabel:
            self.player.loseLife()
        if self.numberOfPlayer == 2:
            if self.player2 == playerLabel:
                self.player2.loseLife()

        self.update_GUI_lives(self.numberOfPlayer)

    def __update_position__(self, key):

        if self.player:
            playerPos = self.player.pos()

            dx = 0

            # Closing program
            if key == Qt.Key_Escape:
                self.shootLaser.die()
                self.moveEnemy.die()
                self.enemyShoot.die()
                self.key_notifier.die()
                self.view.hide()

            if playerPos.x() + dx <= 0:
                if key == Qt.Key_D:
                    dx += PLAYER_SPEED
            elif playerPos.x() + dx >= 845:
                if key == Qt.Key_A:
                    dx -= PLAYER_SPEED
            else:
                if key == Qt.Key_D:
                    dx += PLAYER_SPEED
                if key == Qt.Key_A:
                    dx -= PLAYER_SPEED
            self.player.setPos(playerPos.x() + dx, playerPos.y())

            if key == Qt.Key_Space:
                if self.playerOneCanShoot:
                    laserLabel = Bullet()
                    self.player_shoot_laser(laserLabel, playerPos.x(),
                                            playerPos.y())

        ## player 2 ##
        if self.numberOfPlayer == 2 and self.player2:
            playerPos2 = self.player2.pos()
            dx2 = 0

            if playerPos2.x() + dx2 <= 0:
                if key == Qt.Key_Right:
                    dx2 += PLAYER_SPEED
            elif playerPos2.x() + dx2 >= 845:
                if key == Qt.Key_Left:
                    dx2 -= PLAYER_SPEED
            else:
                if key == Qt.Key_Right:
                    dx2 += PLAYER_SPEED
                if key == Qt.Key_Left:
                    dx2 -= PLAYER_SPEED
            self.player2.setPos(playerPos2.x() + dx2, playerPos2.y())

            if key == Qt.Key_Control and self.player2:
                if self.playerTwoCanShoot:
                    laserLabel2 = Bullet()
                    self.player_shoot_laser(laserLabel2, playerPos2.x(),
                                            playerPos2.y())

    def initUI(self, numberOfPlayer, level_number):
        self.horizontalLayoutWidget = QWidget()
        self.horizontalLayoutWidget.setGeometry(QtCore.QRect(13, 10, 871, 10))
        self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")

        self.horizontalLayout = QHBoxLayout(self.horizontalLayoutWidget)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setSpacing(230)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.horizontalLayout.setAlignment(Qt.AlignLeft)

        #Zivoti prvog igraca
        self.lab_lives1 = QtWidgets.QLabel(self.horizontalLayoutWidget)
        self.lab_lives1.setEnabled(True)
        font = QtGui.QFont()
        font.setPointSize(16)
        font.setBold(True)
        font.setWeight(QFont.Bold)
        self.lab_lives1.setFont(font)
        self.lab_lives1.setObjectName("lab_lives1")
        self.lab_lives1.setStyleSheet("color:yellow")
        self.horizontalLayout.addWidget(self.lab_lives1)

        self.lab_lives1.setText("Player1 Lives: 3")

        #Level
        self.lab_level = QtWidgets.QLabel(self.horizontalLayoutWidget)
        self.lab_level.setEnabled(True)
        font = QtGui.QFont()
        font.setPointSize(16)
        font.setBold(True)
        font.setWeight(75)
        self.lab_level.setFont(font)
        self.lab_level.setObjectName("lab_level")
        self.lab_level.setStyleSheet("color:yellow")
        self.horizontalLayout.addWidget(self.lab_level)

        self.lab_level.setText("Level: " + str(level_number))

        #Zivoti drugog igraca
        if self.numberOfPlayer == 2:
            self.lab_lives2 = QtWidgets.QLabel(self.horizontalLayoutWidget)
            self.lab_lives2.setEnabled(True)
            font = QtGui.QFont()
            font.setPointSize(16)
            font.setBold(True)
            font.setWeight(75)
            self.lab_lives2.setFont(font)
            self.lab_lives2.setObjectName("lab_lives2")
            self.lab_lives2.setStyleSheet("color:yellow")
            self.horizontalLayout.addWidget(self.lab_lives2)

            self.lab_lives2.setText("Player2 Lives: 3")

        self.horizontalLayoutWidget.show()
        self.horizontalLayoutWidget.setAttribute(
            QtCore.Qt.WA_TranslucentBackground)

        self.Widget = self.addWidget(self.horizontalLayoutWidget)

    def update_GUI_lives(self, playerNo):
        #if playerNo==1:
        lives = self.player.lives

        if lives == 3:
            self.lab_lives1Text = "Player1 Lives: 3"
            self.lab_lives1.setText(self.lab_lives1Text)
        elif lives == 2:
            self.lab_lives1Text = "Player1 Lives: 2"
            self.lab_lives1.setText(self.lab_lives1Text)
        elif lives == 1:
            self.lab_lives1Text = "Player1 Lives: 1"
            self.lab_lives1.setText(self.lab_lives1Text)
        elif lives <= 0:
            self.lab_lives1Text = "Player1 Lives: 0"
            self.lab_lives1.setText(self.lab_lives1Text)
            self.flag_playerOneDead = True
            self.player.hide()
            self.playerOneCanShoot = False
            #self.player = None

        if playerNo == 2:
            lives = self.player2.lives

            if lives == 3:
                self.lab_lives2Text = "Player2 Lives: 3"
                self.lab_lives2.setText(self.lab_lives2Text)
            elif lives == 2:
                self.lab_lives2Text = "Player2 Lives: 2"
                self.lab_lives2.setText(self.lab_lives2Text)
            elif lives == 1:
                self.lab_lives2Text = "Player2 Lives: 1"
                self.lab_lives2.setText(self.lab_lives2Text)
            elif lives <= 0:
                self.lab_lives2Text = "Player2 Lives: 0"
                self.lab_lives2.setText(self.lab_lives2Text)
                self.flag_playerTwoDead = True
                self.player2.hide()
                self.playerTwoCanShoot = False
                #self.player2 = None

        self.lab_levelText = "Level: {}".format(self.level_numberrr)
        self.lab_level.setText(self.lab_levelText)

        if self.numberOfPlayer == 1:
            if self.flag_playerOneDead == True:
                self.gameOver()
        elif self.numberOfPlayer == 2:
            if self.flag_playerOneDead == True and self.flag_playerTwoDead == True:
                self.gameOver()

    def gameOver(self):

        self.tempWidget = QWidget()
        self.tempWidget.setGeometry(QtCore.QRect(0, 0, 900, 600))
        self.tempWidget.setObjectName("tempWidget")

        self.horizontalLayout = QHBoxLayout(self.tempWidget)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setSpacing(230)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.horizontalLayout.setAlignment(Qt.AlignCenter)

        #Labela game over
        self.lab_gameOver = QtWidgets.QLabel(self.tempWidget)
        self.lab_gameOver.setEnabled(True)
        font = QtGui.QFont()
        font.setFamily("Calibri")
        font.setPointSize(60)
        font.setBold(True)
        font.setWeight(QFont.Bold)
        self.lab_gameOver.setFont(font)
        self.lab_gameOver.setObjectName("lab_gameOver")
        self.lab_gameOver.setStyleSheet(
            "color: red; background-color: transparent;")
        self.horizontalLayout.addWidget(self.lab_gameOver)
        self.lab_gameOver.setText("GAME OVER")

        self.tempWidget.setStyleSheet(
            "background-color: rgba(255,255,255,70);")

        self.Widget = self.addWidget(self.tempWidget)

        self.moveEnemy.die()
        self.shootLaser.die()
        self.enemyShoot.die()
        self.key_notifier.die()

    def level_advance(self):

        self.levelUP()
        self.player.lives = 3
        if (self.numberOfPlayer == 2):
            self.player2.lives = 3
            self.player.show()
            self.player2.show()
            self.playerOneCanShoot = True
            self.playerTwoCanShoot = True
            self.flag_playerOneDead = False
            self.flag_playerTwoDead = False

        self.update_GUI_lives(self.numberOfPlayer)

        # Postavljanje neprijatelja
        self.enemies = []
        self.enemies.append(Enemy())
        self.enemies[0].setPos(100, 50)

        for i in range(0, 55):
            self.enemies.append(Enemy())
            if i == 11:
                self.enemies[i].setPos(self.enemies[0].x(),
                                       self.enemies[0].y() + 60)
                continue
            if i == 22:
                self.enemies[i].setPos(self.enemies[11].x(),
                                       self.enemies[11].y() + 60)
                continue
            if i == 33:
                self.enemies[i].setPos(self.enemies[22].x(),
                                       self.enemies[22].y() + 60)
                continue
            if i == 44:
                self.enemies[i].setPos(self.enemies[33].x(),
                                       self.enemies[33].y() + 60)
                continue
            self.enemies[i].setPos(self.enemies[i - 1].x() + 60,
                                   self.enemies[i - 1].y())

        for i in range(0, 55):
            self.addItem(self.enemies[i])

        self.moveEnemy = MoveEnemy()
        self.moveEnemy.calc_done.connect(self.move_enemy)
        self.moveEnemy.start()

        self.enemyShoot = EnemyShoot()
        self.enemyShoot.can_shoot.connect(self.enemy_shoot_laser)
        self.enemyShoot.move_down.connect(self.move_enemy_laser)
        self.enemyShoot.collision_detected.connect(self.enemy_hit_player)
        self.enemyShoot.collision_detected_with_shield.connect(
            self.enemy_laser_shield_collide)
        # Ubrzavanje lasera igraca i enemya
        self.enemyShoot.enemyLaserSpeed += self.level_numberrr
        self.moveEnemy.enemyMoveSpeed += self.level_numberrr

        #print('Enemy move speed: {}'.format(self.moveEnemy.enemyMoveSpeed))
        #print('Enemy laser speed: {}'.format(self.enemyShoot.enemyLaserSpeed))

        if self.numberOfPlayer == 1:
            self.enemyShoot.add_player(self.player)
        else:
            # PROVERA AKO JE MRTAV NE IGRA VISE / A USTVARI IGRA PROCITANO IZ PROJEKTA, NEMA VEZE
            if self.player != None:
                self.enemyShoot.add_player(self.player)
            if self.player2 != None:
                self.enemyShoot.add_player(self.player2)
        self.enemyShoot.start()

        self.shootLaser = PlayerShoot()
        self.shootLaser.calc_done.connect(self.move_laser_up)
        self.shootLaser.collision_detected.connect(
            self.player_laser_enemy_collide)
        self.shootLaser.start()

        for i in range(0, 55):
            self.moveEnemy.add_enemy(self.enemies[i])
            self.shootLaser.add_enemy(self.enemies[i])
            self.enemyShoot.add_enemy(self.enemies[i])

        #Dodavanje stitova
        self.shields = []
        self.shields.append(Shield())
        self.shields[0].setPos(50, 350)
        self.shields.append(Shield())
        self.shields[1].setPos(375, 350)
        self.shields.append(Shield())
        self.shields[2].setPos(700, 350)

        for i in range(0, 3):
            self.addItem(self.shields[i])
            self.enemyShoot.add_shield(self.shields[i])

    def levelUP(self):

        self.tempWidget = QWidget()
        self.tempWidget.setGeometry(QtCore.QRect(0, 0, 900, 600))
        self.tempWidget.setObjectName("tempWidget")

        self.horizontalLayout = QHBoxLayout(self.tempWidget)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setSpacing(230)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.horizontalLayout.setAlignment(Qt.AlignCenter)

        #Labela next level
        self.lab_nextLevel = QtWidgets.QLabel(self.tempWidget)
        self.lab_nextLevel.setEnabled(True)
        font = QtGui.QFont()
        font.setFamily("Calibri")
        font.setPointSize(30)
        font.setBold(True)
        font.setWeight(QFont.Bold)
        self.lab_nextLevel.setFont(font)
        self.lab_nextLevel.setObjectName("lab_nextLevel")
        self.lab_nextLevel.setStyleSheet(
            "color: GREEN; background-color: transparent;")
        self.horizontalLayout.addWidget(self.lab_nextLevel)
        self.lab_nextLevel.setText("NEXT LEVEL")

        self.tempWidget.setStyleSheet("background-color: rgba(255,255,255,0)")
        self.WidgetLEVEL = self.addWidget(self.tempWidget)

        self.WidgetLEVEL.setZValue(20)

        self.timer = QTimer()
        self.timer.timeout.connect(self.levelUPdelete)
        self.timer.start(2000)

    def levelUPdelete(self):
        self.WidgetLEVEL.hide()
コード例 #2
0
class MiniBoard(QWidget):
    def __init__(self):
        super().__init__()
        self.mini_game_winner = None
        self.fonts = {u"\u274C": 80, u"\u2B55": 75}
        self.mini_grid_layout = QGridLayout(self)
        self.mini_grid_layout.setSpacing(5)
        self.mini_grid_layout.setContentsMargins(0, 0, 0, 0)
        self.view = QGraphicsView(self)
        self.view.setFixedSize(220, 220)
        self.view.setStyleSheet('''background: transparent; 
                              border-style: double; border-width: 6px; 
                              border-color: blue''')
        self.view.hide()
        for i in range(0, 3):
            for j in range(0, 3):
                button = BoardCell(' ')
                button.setObjectName("cell%d%d" % (i, j))
                button.clicked.connect(self.play_turn)
                self.mini_grid_layout.addWidget(button, i, j)

    def enable_free_cells(self):
        self.setEnabled(True)

    def is_mini_game_over(self, symbol):
        board = BoardUtils.grid_to_2d_array(self.mini_grid_layout)
        p1 = self.parent().players[0]
        p2 = self.parent().players[1]
        win_move = BoardUtils.winner_move(board, symbol)
        if win_move is not None:
            return win_move
        return BoardUtils.is_tie(board, p1, p2)

    @pyqtSlot()
    def play_turn(self):
        button = self.sender()
        game_board = self.parent()
        next_turn_i = int(button.objectName()[4])
        next_turn_j = int(button.objectName()[5])
        cur_symbol = game_board.players[game_board.turn]
        button.label.setText(cur_symbol)
        button.label.setStyleSheet('color: royalBlue')
        cur_turn_result = self.is_mini_game_over(cur_symbol)
        if cur_turn_result is not None:
            if cur_turn_result[0] == -1:
                self.mini_game_winner = 'Tie'
                self.view.hide()
            else:
                self.mini_game_winner = cur_symbol
            cur_i = int(self.objectName()[4])
            cur_j = int(self.objectName()[5])
            if self.mini_game_winner != 'Tie':
                self.draw_line(cur_turn_result)
            game_board.final_scores[cur_i][cur_j] = self.mini_game_winner
            # check if full game is over
            final_game_result = game_board.is_game_over(cur_symbol)
            if final_game_result is not None:
                self.window().findChild(QLabel, "turn").setText("Nice!")
                if final_game_result[0] != -1:
                    game_board.draw_line(final_game_result)
                game_board.disable_all_mini_boards()
                game_board.game_enabled = False
                if final_game_result[0] == -1:
                    self.alert("it's a tie, wanna try again?")
                else:
                    self.alert("the %s's win!" % cur_symbol)
                return
        button.setEnabled(False)
        game_board.disable_all_mini_boards()
        if self.mini_game_winner is None:
            self.view.hide()
        next_turn_board = game_board.findChild(
            MiniBoard, "mini%d%d" % (next_turn_i, next_turn_j))
        if next_turn_board.mini_game_winner is None:
            next_turn_board.view.show()
        game_board.turn = (game_board.turn + 1) % 2
        if (next_turn_board
                is not None) and next_turn_board.mini_game_winner is None:
            next_turn_board.enable_free_cells()
        else:
            game_board.enable_all_mini_boards()
        self.window().findChild(QLabel, "turn").setText(
            "Play %s!" % game_board.players[game_board.turn])

    @staticmethod
    def alert(message):
        w = QMessageBox()
        w.setMinimumHeight(200)
        w.setText(message)
        w.setFont(QFont('Arial', 20))
        w.setWindowTitle('Game Over')
        w.setIcon(QMessageBox.Information)
        w.setStandardButtons(QMessageBox.Ok)
        w.exec()

    def draw_line(self, line_tuple):
        self.view.setStyleSheet('background: transparent; border-style: none')
        del self.view
        self.view = QGraphicsView(self)
        x = self.x()
        y = self.y()
        width = self.width()
        height = self.height()
        scene = QGraphicsScene(QRectF(x, y, width, height))
        self.view.setStyleSheet('background: transparent; border-style: none')
        self.view.setFixedSize(width, height)
        self.view.setScene(scene)
        pen = QPen()
        pen.setColor(QColor(65, 105, 225))
        pen.setWidth(10)
        line_coordinates = self.get_line_coordinates(line_tuple)
        scene.addLine(line_coordinates[0], line_coordinates[1],
                      line_coordinates[2], line_coordinates[3], pen)
        winner_label = self.create_winner_label()
        scene.addItem(winner_label)
        self.view.show()
        timer = QTimer(self.view)
        timer.timeout.connect(winner_label.show)
        timer.start(1000)

    def create_winner_label(self):
        w = QGraphicsTextItem()
        w.setPlainText("%s" % self.mini_game_winner)
        game_board = self.parent()
        print(game_board)
        w.setFont(QFont('SansSerif', self.fonts[self.mini_game_winner]))
        w.setDefaultTextColor(Qt.black)
        w.setPos(self.x(), self.y())
        w.setVisible(False)
        return w

    def get_line_coordinates(self, line_points):
        x = self.x()
        y = self.y()
        height = self.height()
        width = self.width()
        cell1_y = line_points[0] + 1
        cell1_x = line_points[1] + 1
        cell2_y = line_points[2] + 1
        cell2_x = line_points[3] + 1
        if line_points[4] == 'row':
            new_x1 = x + (width / 3) * cell1_x - 80
            new_y1 = y + (height / 3) * cell1_y - 40
            new_x2 = x + (width / 3) * cell2_x
            new_y2 = y + (height / 3) * cell2_y - 40
        elif line_points[4] == 'col':
            new_x1 = x + (width / 3) * cell1_x - 30
            new_y1 = y + (height / 3) * cell1_y - 60
            new_x2 = x + (width / 3) * cell2_x - 30
            new_y2 = y + (height / 3) * cell2_y - 20
        elif line_points[4] == 'diagonal left':
            new_x1 = x + 30
            new_y1 = y + 30
            new_x2 = x + width - 25
            new_y2 = y + height - 25
        else:
            new_x1 = x + 30
            new_y1 = y + height - 30
            new_x2 = x + width - 20
            new_y2 = y + 10
        return new_x1, new_y1, new_x2, new_y2
コード例 #3
0
ファイル: window.py プロジェクト: HaloOrangeWang/PoetProgram
class GameWindow(QMainWindow):
    def __init__(self, frame_cnt):
        super().__init__()
        # 初始化,load数据
        self.img_list = []
        self.cter_img_list = []
        self.npc_img_list = []
        for frame_it in range(frame_cnt):
            self.img_list.append(QImage('data/%03d.png' % frame_it))
        for t in range(4):
            self.cter_img_list.append(QImage('imgs/001-Fighter01_big.png').copy(t * 96, 288, 96, 144))
            self.npc_img_list.append(QImage('imgs/066-Beast04.png').copy(t * 96, 96, 96, 96))
        self.dialog_img = QImage('imgs/001-Blue01.png').copy(130, 66, 28, 28)
        self.tri_img = [QImage('imgs/001-Blue01.png').copy(160, 64, 16, 16), QImage('imgs/001-Blue01.png').copy(160, 80, 16, 16)]
        # 准备图形界面
        self.init_ui()
        self.frame_cnt = frame_cnt
        self.curr_frame = 0  # 当前处于第几帧
        # 设置播放新帧的定时器
        self.frame_timer = QTimer(self)
        self.frame_timer.timeout.connect(self.on_new_frame)
        self.frame_timer.start(40)

    def init_ui(self):
        # 设置窗口主题、大小和背景图片
        self.setObjectName('MainWindow')
        self.setFixedSize(1300, 740)
        # 设置背景view
        self.bkgrd = QGraphicsView(self)
        self.bkgrd.setFixedSize(1280, 720)
        self.bkgrd.move(10, 10)
        self.bkgrd.setStyleSheet("background:transparent;border:none;")
        bkgrd_pixmap = QPixmap.fromImage((self.img_list[0]))
        bkgrd_pixmap.fromImage(self.img_list[0])
        self.bkgrd_scene = QGraphicsScene()
        self.bkgrd_scene.addItem(QGraphicsPixmapItem(bkgrd_pixmap))
        self.bkgrd.setScene(self.bkgrd_scene)
        # 小人
        self.character = QGraphicsView(self)
        self.character.setFixedSize(96, 144)
        self.character.move(0, 500)
        self.character.setStyleSheet("background:transparent;border:none;")
        cter_pixmap = QPixmap.fromImage((self.cter_img_list[0]))
        cter_pixmap.fromImage(self.img_list[0])
        self.cter_scene = QGraphicsScene()
        self.cter_scene.addItem(QGraphicsPixmapItem(cter_pixmap))
        self.character.setScene(self.cter_scene)
        # NPC
        self.npc = QGraphicsView(self)
        self.npc.setFixedSize(96, 96)
        self.npc.move(1050, 530)
        self.npc.setStyleSheet("background:transparent;border:none;")
        npc_pixmap = QPixmap.fromImage((self.npc_img_list[0]))
        self.npc_scene = QGraphicsScene()
        self.npc_scene.addItem(QGraphicsPixmapItem(npc_pixmap))
        self.npc.setScene(self.npc_scene)
        # 对话框
        self.dialog = QGraphicsView(self)
        self.dialog.setFixedSize(1248, 208)
        self.dialog.move(26, 496)
        dialog_pixmap = QPixmap.fromImage(self.dialog_img)
        palette = QPalette()
        palette.setBrush(self.dialog.backgroundRole(), QBrush(dialog_pixmap))
        self.dialog.setPalette(palette)
        self.dialog.hide()
        self.label = QLabel(self)
        self.label.setFont(QFont("宋体", 24, 40))
        self.label.setFixedSize(1000, 100)
        self.label.move(60, 496)
        self.label.setText("啦啦啦啦啦")
        self.label.hide()
        # 对话框下面的小三角
        self.tri = QGraphicsView(self)
        self.tri.setFixedSize(16, 16)
        self.tri.move(632, 696)
        self.tri.setStyleSheet("background:transparent;border:none;")
        tri_pixmap = QPixmap.fromImage(self.tri_img[0])
        self.tri_scene = QGraphicsScene()
        self.tri_scene.addItem(QGraphicsPixmapItem(tri_pixmap))
        self.tri.setScene(self.tri_scene)
        self.tri.hide()

        # 显示界面
        self.show()

    def on_new_frame(self):
        self.curr_frame += 1
        # 更新背景
        bkgrd_pixmap = QPixmap.fromImage((self.img_list[self.curr_frame]))
        self.bkgrd_scene.clear()
        self.bkgrd_scene.addItem(QGraphicsPixmapItem(bkgrd_pixmap))
        # 更新小人
        if self.curr_frame % 6 == 0:
            cter_pixmap = QPixmap.fromImage((self.cter_img_list[int(self.curr_frame % 24 // 6)]))
            self.cter_scene.clear()
            self.cter_scene.addItem(QGraphicsPixmapItem(cter_pixmap))
            npc_pixmap = QPixmap.fromImage((self.npc_img_list[int(self.curr_frame % 24 // 6)]))
            self.npc_scene.clear()
            self.npc_scene.addItem(QGraphicsPixmapItem(npc_pixmap))
        if self.curr_frame % 12 == 0:
            tri_pixmap = QPixmap.fromImage((self.tri_img[int(self.curr_frame % 24 // 12)]))
            self.tri_scene.clear()
            self.tri_scene.addItem(QGraphicsPixmapItem(tri_pixmap))
        if self.curr_frame <= 95:
            self.character.move(self.curr_frame * 10, 500)
        # 更新对话框
        if self.curr_frame == 100:
            self.dialog.show()
            self.label.show()
            self.tri.show()
        if self.curr_frame == 192:
            self.dialog.hide()
            self.label.hide()
            self.tri.hide()
        if self.curr_frame == self.frame_cnt - 1:  # 已达最后一帧
            self.frame_timer.stop()