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()
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
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()