Пример #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()