class AudioWidget(DebuggingWidget): def __init__(self, parent=None) -> None: """Visual widget. Not called directly. Serves as a base class for BaseTestWidget, providing methods for drawing to the GUI. """ super(AudioWidget, self).__init__(parent) inherit = ( "proband_id", "test_name", "language", "fullscreen", "computer_id", "user_id", "platform", "resumable", ) self.kwds = { k: v for k, v in self.parent().kwds.items() if k in inherit } logger.debug(f"initialised {type(self)} with parent={parent}") # stimuli paths self.aud_stim_paths = get_aud_stim_paths(self.kwds["test_name"]) # silence self.silence = QSound(self.aud_stim_paths["silence.wav"]) # 440 pip self.pip = QSound(self.aud_stim_paths["440.wav"]) # feedback self.correct = QSound(self.aud_stim_paths["correct.wav"]) self.incorrect = QSound(self.aud_stim_paths["incorrect.wav"]) self.feedback_sounds = [self.incorrect, self.correct] # other sounds self.test_over = QSound(self.aud_stim_paths["test_over.wav"]) self.new_block = QSound(self.aud_stim_paths["new_block.wav"]) def play_feeback(self, correct): """Play either the correct or incorrect sound.""" sound = self.feedback_sounds[correct] if not sound.isFinished(): pass else: sound.play() def play_pip(self, sleep): """Play a regular pip but optionally sleep while its playing.""" if not self.pip.isFinished(): pass else: self.pip.play() if sleep: while not self.pip.isFinished(): self.sleep(10)
def trial(self): t = self.current_trial # calculate the correct answer if t.block_type == "forward": answer = t.sequence elif t.block_type == "backward": answer = t.sequence[::-1] else: digits = [] letters = [] for a in t.sequence: if a.isdigit(): digits.append(a) elif a.isalpha(): letters.append(a) answer = sorted(digits) + sorted(letters) # instructions and buttons self.display_instructions(self.instructions[9] % "-".join(t.sequence)) corr_button = self._display_continue_button() corr_button.setText(self.instructions[10] % "-".join(answer)) corr_button.setFont(QFont("Helvetica", 18)) corr_button.resize(corr_button.sizeHint()) corr_button.setMinimumHeight(120) corr_button.setMinimumWidth(320) x = (self.frameGeometry().width() - corr_button.width()) // 2 - 250 y = self.frameGeometry().height() - (corr_button.height() + 20) corr_button.move(x, y) corr_button.clicked.disconnect() corr_button.clicked.connect(self._correct) incorr_button = self._display_continue_button() incorr_button.setText(self.instructions[11]) incorr_button.setFont(QFont("Helvetica", 18)) incorr_button.resize(incorr_button.sizeHint()) incorr_button.setMinimumHeight(120) incorr_button.setMinimumWidth(320) x = (self.frameGeometry().width() - incorr_button.width()) // 2 + 250 y = self.frameGeometry().height() - (incorr_button.height() + 20) incorr_button.move(x, y) incorr_button.clicked.disconnect() incorr_button.clicked.connect(self._incorrect) sound = QSound(self.aud_stim_paths[f"{str(t.sequence)}.wav"]) corr_button.setEnabled(False) incorr_button.setEnabled(False) sound.play() while not sound.isFinished(): self.sleep(100) corr_button.setEnabled(True) incorr_button.setEnabled(True)
class App(QWidget): def __init__(self): super().__init__() self.setWindowTitle('The Seeker of fire') self.showFullScreen() self.Text = QLabel(self) self.book = QLabel(self) self.location = QLabel(self) self.changed = False self.action_targ = QLabel(self) self.action_targ.resize(self.width() / 12, 10) self.action_targ.move(0, 0) self.action_targ.setStyleSheet('QLabel {background-color: Red;' 'border-radius: 5px }') self.targ_pos = [(self.width() / 2.17, self.height() / 2.5 - 20), (self.width() / 2.9, self.height() / 2.5 - 20), (self.width() / 1.75, self.height() / 2.5 - 20)] self.the_right_answer = [False, False, False] self.ur_damage = 10 self.e_damage = 0 self.HP_points = 100 self.eHP_points = 100 self.result = False self.cursor = QCursor(QPixmap('cursor_3.png')) self.cursor.pixmap() self.setCursor(self.cursor) self.skip = QPushButton(self) self.skip.resize(100, 20) self.skip.move(self.width() / 2 + 180, self.height() / 4 + self.height() / 16 + 20) self.skip.setText('SKIP') self.skip.setStyleSheet( 'QPushButton {background-color: rgba(10, 20, 100, 0.2)}' 'QPushButton:hover {background-color: Red}') self.read = True self.skip.clicked.connect(self.next) melody = 'DS2.wav' self.playable = QSound(melody) self.playable.play() melody2 = 'in_battle.wav' self.playable2 = QSound(melody2) self.next_melody = False self.movie = QMovie("fire_3.gif") self.movie.setScaledSize(QSize(self.width(), self.height())) self.movie.frameChanged.connect(self.repaint) self.movie.start() self.NPC_enemy = QLabel(self) self.NPC_enemy.resize(self.height() / 5, self.height() / 5) self.NPC_enemy.move(self.width() / 2.3, self.height() / 16) self.NPC_enemy.setStyleSheet( "QLabel {color: rgb(0, 0, 51);" 'background-color: rgba(10, 20, 100, 0.2);' 'border-color: rgba(100, 100, 100, 0.5);' 'border-style: solid;' 'border-width: 2px;' '}' 'QLabel:hover {background-color: rgba(100, 0, 0, 0.7)}') self.book.resize(self.width() / 3, self.height() / 16) self.book.move(self.width() / 3, self.height() / 4 + 40) self.book.setStyleSheet( "QLabel {background-color: rgba(100, 40, 51, 0.5);" "text-align: center }") self.book.setFont(QFont('Times New Roman', 12)) self.attack = QPushButton(self) self.defend = QPushButton(self) self.dodge = QPushButton(self) self.change_size('attack_proj.png', (int(self.width() / 12), int(self.height() / 4))) self.change_size('shield.png', (int(self.width() / 12), int(self.height() / 4))) self.change_size('dodging.png', (int(self.width() / 12), int(self.height() / 4))) self.attack.setStyleSheet( 'QPushButton {background-color: rgba(10, 20, 100, 0.2);' 'border-color: rgb(10, 20, 100,);' 'border-style: solid;' 'border-width: 5px;' 'border-radius: 40px;' 'background-image: url(attack_proj.png)' '}' 'QPushButton:pressed {background-image: url(DS3.jpg)}') self.attack.resize(self.width() / 12, self.height() / 4) self.attack.move(self.width() / 2.17, self.height() / 2.5) self.attack.clicked.connect(self.attack_fnc) self.defend.setStyleSheet( 'QPushButton {background-color: rgba(10, 20, 100, 0.2);' 'border-color: rgb(10, 20, 100,);' 'border-style: solid;' 'border-width: 5px;' 'border-radius: 40px;' 'background-image: url(shield.png)' '}' 'QPushButton:pressed {background-image: url(DS3.jpg)}') self.defend.resize(self.width() / 12, self.height() / 4) self.defend.move(self.width() / 2.9, self.height() / 2.5) self.defend.clicked.connect(self.defend_fnc) self.dodge.setStyleSheet( 'QPushButton {background-color: rgba(10, 20, 100, 0.2);' 'border-color: rgb(10, 20, 100,);' 'border-style: solid;' 'border-width: 5px;' 'border-radius: 40px;' 'background-image: url(dodging.png)' '}' 'QPushButton:pressed {background-image: url(DS3.jpg)}') self.dodge.resize(self.width() / 12, self.height() / 4) self.dodge.move(self.width() / 1.75, self.height() / 2.5) self.dodge.clicked.connect(self.dodge_fnc) self.Text.move(self.width() / 3, 0) self.Text.resize(self.width() / 3, self.height()) self.Text.move(self.width() / 3, 0) self.Text.setStyleSheet( "QLabel {color: rgb(0, 0, 51);" 'font-family: "Times New Roman", Georgia, Serif;' 'font-size: 25px;' 'background-color: rgba(10, 20, 100, 0.2);' 'border-color: rgb(10, 20, 100,);' 'border-style: solid;' 'border-width: 5px' '}') self.HP = QProgressBar(self) self.HP.resize(self.width() / 3, 30) self.HP.move(self.width() / 3, self.height() * 0) self.HP.setStyleSheet( "QProgressBar{border: 1px solid transparent;text-align: center;" "color:rgba(255,255,250,0);" "border-radius: 10px;" "border-width: 8px;" "border-image: 9,2,5,2; " "background-color: Grey;" "}" "QProgressBar::chunk {background-color: qlineargradient(x1: 0, " "y1: 0, x2: 0, y2: 1, stop: 0 rgba(100,80,50,1), stop: 1 rgba(255,0,0,1));" "border-radius: 5px}") self.HP.setValue(self.HP_points) self.eHP = QProgressBar(self) self.eHP.resize(self.width() / 6, 10) self.eHP.setStyleSheet( "QProgressBar{border: 1px solid transparent;text-align: center;" "color:rgba(255,255,250,0);" "border-radius: 10px;" "border-width: 8px;" "border-image: 9,2,5,2; " "background-color: Grey" "}" "QProgressBar::chunk {background-color: qlineargradient(x1: 0, " "y1: 0, x2: 0, y2: 1, stop: 0 rgba(100,80,50,100), stop: 1 rgba(255,0,0,255));" "border-radius: 5px}") self.eHP.move(self.width() / 2.45, self.width() / 6.5) self.close_button = QPushButton(self) self.close_button.resize(self.width() / 4, self.height() / 20) self.close_button.move(self.width() / 3 + self.width() / 24, self.height() / 1.07) self.close_button.setStyleSheet( 'QPushButton {border: 3px solid;' 'border-radius: 10px;' 'background-color: Khaki' '}' 'QPushButton:pressed{border: 1px solid;' 'border-radius: 40px;' 'background-color: Red' '}' 'QPushButton:hover{background-color: rgba(255, 0, 0, 40)}') self.close_button.clicked.connect(self.close_event) self.close_button.setFont(QFont('Times New Roman', 20)) self.close_button.setText('Выход') self.location.resize(self.width() / 3, self.height() / 8) self.location.move(self.width() / 3, self.height() / 4) self.location.setFont(QFont('Times New Roman', 20)) self.location.setText('ЗАБРОШЕННЫЕ МОГИЛЫ') self.location.setStyleSheet( "QLabel {background-color: rgba(250, 40, 51, 0.5);" "}") self.location.setAlignment(Qt.AlignCenter) self.game() def next(self): self.read = False def paintEvent(self, event): currentframe = self.movie.currentPixmap() framerect = currentframe.rect() framerect.moveCenter(self.rect().center()) if framerect.intersects(event.rect()): painter = QPainter(self) painter.drawPixmap(framerect.left(), framerect.top(), currentframe) def close_event(self): self.close() def game(self): dont_stop = threading.Thread(target=self.always_on) screen = threading.Thread(target=self.on_screen) screen.start() dont_stop.start() def on_screen(self): self.HP.show() self.close_button.show() self.Text.show() self.book.show() self.NPC_enemy.show() self.skip.show() self.attack.show() self.defend.show() self.dodge.show() self.eHP.show() self.write('И в самом деле. Замок, что зовётся Лотриком, ') self.write('стоит там, где сходятся земли Повелителей пепла. ') self.write( 'Покоряя север, пилигримы убеждаются, что старые сказания не лгут') self.write('Огонь затухает, и повелители пепла покидают свои троны') self.write('Когда огонь под угрозой, когда звонит колокол,') self.write(' Повелители пепла поднимаются из своих могил.') self.write('Олдрик, святой покровитель глубин.') self.write('Легион нежити Фаррона, Хранители Бездны') self.write( 'И мрачный правитель из осквернённой столицы - гигант Йорм.') self.write( 'Но в действительности... Повелители оставят свои троны, и негорящие восстанут.' ) self.write('Безымянная, проклятая нежить, недостойная стать пеплом.') self.write('И стало так. Негорящие всегда ищут угли.') self.location.show() time.sleep(2) self.location.close() self.write('Вы поднимаетесь из могилы. В руках у вас ваш меч. ') self.write('Вы чётко знате, что будуте делать дальше') self.write('Вам предстоит вернуть повелителей на свои троны и спасти ') self.write('угасающий мир от погружения во тьму') self.write('Перед вами тропа') self.write('Пути назад больше нет') self.write('...') self.write('Вы идете по тропе') self.write( 'Перед вами Полый, нежить, потерявшая рассудок и навеки лишившаяся ' ) self.write('возможности прикоснуться к Огню') self.write('Полый достает меч') self.write('Приготовьтесь к битве') self.write(' ') self.NPC_enemy.close() self.NPC_enemy.setStyleSheet( 'QLabel { background-image: url(hollow.jpg)}') time.sleep(0.3) self.NPC_enemy.show() self.next_melody = True self.playable.stop() # self.eHP.setValue(100) self.book.setStyleSheet('QLabel {color: Red }') self.the_right_answer = [False, False, True] self.write_in_battle('Усиленная атака сверху') time.sleep(2) if self.result is not True: self.write_in_battle('Вы погибли') time.sleep(2) self.close() else: self.eHP_points -= 10 self.eHP.close() self.eHP.setValue(self.eHP_points) self.eHP.show() self.write_in_battle('Вы успешно уклонились') self.result = False self.the_right_answer = [False, True, False] self.write_in_battle('Противник потерял равновесие') time.sleep(2) if self.result is not True: self.write_in_battle('Вы погибли') time.sleep(2) self.close() else: self.eHP_points -= 10 self.eHP.close() self.eHP.setValue(self.eHP_points) self.eHP.show() self.write_in_battle('Вы успешно атаковали') self.result = False self.the_right_answer = [False, False, True] self.write_in_battle('Выпад вперед!') time.sleep(1) if self.result is not True: self.write_in_battle('Вы погибли') time.sleep(2) self.close() else: self.eHP_points -= 10 self.eHP.close() self.eHP.setValue(self.eHP_points) self.eHP.show() self.write_in_battle('Ваш противник в ярости!') self.result = False self.the_right_answer = [True, False, False] self.write_in_battle('Полый нансосит слабый удар') time.sleep(1.5) if self.result is not True: self.write_in_battle('Вы погибли') time.sleep(2) self.close() else: self.eHP_points -= 10 self.eHP.close() self.eHP.setValue(self.eHP_points) self.eHP.show() self.write_in_battle('Щит сломан') self.result = False self.the_right_answer = [False, True, False] self.write_in_battle('Полый выронил меч. Это ваш шанс!') victory = False time.sleep(0.8) if self.result is not True: self.write_in_battle('Полый увернулся') self.write_in_battle('Вы подбираете его щит') else: self.eHP_points -= 60 self.eHP.close() self.eHP.setValue(self.eHP_points) self.eHP.show() self.write_in_battle('Полый побежден!') self.result = False victory = True if victory is False: self.the_right_answer = [False, False, True] self.write_in_battle('Полый нансосит слабый удар') time.sleep(1.5) if self.result is not True: self.write_in_battle('Вы погибли') time.sleep(2) self.close() else: self.eHP_points -= 30 self.eHP.close() self.eHP.setValue(self.eHP_points) self.eHP.show() self.write_in_battle('Парирование') self.result = False self.the_right_answer = [False, True, False] self.write_in_battle('Полый медленно замахнулся') time.sleep(1.5) if self.result is not True: self.write_in_battle('Вы погибли') time.sleep(2) self.close() else: self.eHP_points -= 30 self.eHP.close() self.eHP.setValue(self.eHP_points) self.eHP.show() self.write_in_battle('Полый сделал шаг назад') self.result = False self.the_right_answer = [False, True, False] self.write_in_battle('Полый поднимает меч') time.sleep(1.5) if self.result is not True: self.write_in_battle('Вы погибли') time.sleep(2) self.close() else: self.eHP_points -= 10 self.eHP.close() self.eHP.setValue(self.eHP_points) self.eHP.show() self.write_in_battle('Полый падает') self.result = False self.next_melody = False self.NPC_enemy.close() self.NPC_enemy.setStyleSheet( "QLabel {color: rgb(0, 0, 51);" 'background-color: rgba(10, 20, 100, 0.2);' 'border-color: rgba(100, 100, 100, 0.5);' 'border-style: solid;' 'border-width: 2px;' '}' 'QLabel:hover {background-color: rgba(100, 0, 0, 0.7)}') time.sleep(0.3) self.NPC_enemy.show() self.write('Полый побежден') if victory is True: self.NPC_enemy.close() self.NPC_enemy.setStyleSheet( 'QLabel { background-image: url(letter.jpg)}') time.sleep(0.3) self.NPC_enemy.show() self.write('Вы получили новый щит: урон противников снижен') self.write('Ваш щит сломан: урон противников повышен') self.write('Вы продолжаете идти по тропе') self.write('Справа от вас труп') self.write('В его карамане что-то есть') self.write('Найдена записка') self.write('С тех времен, как Гвин впервые ') self.write( 'разжег <не разобрать>, минуло много веков и много циклов <не разобрать>' ) self.write('пламени. После того, как он разжег огонь,') self.write('этот путь повторили многие великие герои, ') self.write('известные как <не разобрать>') def always_on(self): while True: time.sleep(0.5) if self.playable.isFinished() is True: if self.next_melody is False: self.playable2.stop() self.playable.play() if self.playable2.isFinished() is True: if self.next_melody is True: self.playable2.play() def change_size(self, input_image_path, size=(0, 0)): original_image = Image.open(input_image_path) resized_image = original_image.resize(size) resized_image.save(input_image_path) self.changed = True def write(self, text): your_text = ' ' for letter in text: if self.read is True: time.sleep(0.1) your_text += letter self.book.setText(your_text) else: self.read = True break time.sleep(0.2) def write_in_battle(self, text): your_text = ' ' for letter in text: time.sleep(0.05) your_text += letter self.book.setText(your_text) def defend_fnc(self): if self.the_right_answer[0] is True: self.result = True else: self.result = False self.action_targ.close() self.action_targ.move(self.targ_pos[1][0], self.targ_pos[1][1]) self.action_targ.show() def attack_fnc(self): if self.the_right_answer[1] is True: self.result = True else: self.result = False self.action_targ.close() self.action_targ.move(self.targ_pos[0][0], self.targ_pos[0][1]) self.action_targ.show() def dodge_fnc(self): if self.the_right_answer[2] is True: self.result = True else: self.result = False self.action_targ.close() self.action_targ.move(self.targ_pos[2][0], self.targ_pos[2][1]) self.action_targ.show()
class main(QtWidgets.QOpenGLWidget): def __init__(self, parent): QtWidgets.QOpenGLWidget.__init__(self, parent) self.started = False self.imageID_back = None self.in_scene = [] self.ornaments = [] self.elapsed_time_shoot = 0 self.elapsed_time_asteroide = 0 self.elapsed_time_inimigo = 0 self.elapsed_time_planet = 920000000000 / 3 self.elapsed_time_stars = 0 self.elapsed_time_powers = 0 self.elapsed_time_power_shoot = 0 self.elapsed_time_power_speed = 0 self.hack = False self.speed = False self.sound_laser = QSound("sound/laser.wav", self) self.sound_laser_enemy = QSound("sound/laserenemy.wav", self) self.sound_explosion = QSound("sound/explos.wav", self) self.sound_1000pts = QSound("sound/1000pts.wav", self) self.sound_inGame = QSound("sound/startScene.wav", self) self.sound_death = QSound("sound/nooo.wav", self) self.sound_power = QSound("sound/powerUp.wav", self) self.enemy_queue = Queue_rotative() self.asteroid_queue = Queue_rotative() self.bullets_queue = Queue_rotative() self.planets_queue = Queue_rotative() self.explosion_queue = Queue_rotative() self.propellant_queue = Queue_rotative() self.power_queue = Queue_rotative() self.animation_explosion = [None for i in range(EXPLOSION_FRAMES)] self.animation_propellant_enemy = [ None for i in range(PROPELLANT_FRAMES) ] self.img_planets = [None for i in range(10)] self.img_nave_azul = None self.img_nave_amarela = None self.img_nave_preta = None self.img_tiro_azul = None self.img_tiro_preto = None self.img_tiro_amarelo = None self.img_tiro = None self.logo_init = None self.logo_end = None self.power_up_vida = None self.power_up_shoot = None self.power_up_speed = None self.myLogo_i = Logo() self.myLogo_e = Logo() self.myNave = None # Inicializa as filas de pre carregamentos def init_queue(self): for i in range(20): new = Enemy() self.enemy_queue.push(new) for i in range(50): new = Asteroide() self.asteroid_queue.push(new) for i in range(100): new = Shoot() self.bullets_queue.push(new) for i in range(10): new = Planeta() self.planets_queue.push(new) for i in range(50): new = Explode() self.explosion_queue.push(new) for i in range(30): new = Propellant() self.propellant_queue.push(new) for i in range(20): new = Power_up() self.power_queue.push(new) # Prepara a cena e carrega as texturas def initializeGL(self): glClearColor(0.0, 0.0, 0.0, 0.0) glShadeModel(GL_SMOOTH) glEnable(GL_DEPTH_TEST) glEnable(GL_BLEND) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) glEnable(GL_ALPHA_TEST) glAlphaFunc(GL_NOTEQUAL, 0.0) glMatrixMode(GL_PROJECTION) glLoadIdentity() gluPerspective(45, 1.65, 0.1, 500) gluLookAt(0, -100, 50, 0, 0, 0, 0, 1, 0) glMatrixMode(GL_MODELVIEW) glLoadIdentity() self.myNave = Nave(self.animation_propellant_enemy, 0) self.in_scene.append(self.myNave) for i in range(EXPLOSION_FRAMES): self.animation_explosion[i] = self.loadImage("img/explosion/Comp" + str(i) + ".png") for i in range(PROPELLANT_FRAMES): self.animation_propellant_enemy[i] = self.loadImage( "img/fire/Comp" + str(i) + ".png") for i in range(10): self.img_planets[i] = self.loadImage("img/planets/planeta" + str(i) + ".png") self.img_nave_amarela = self.loadImage("img/nave4.png") self.img_nave_azul = self.loadImage("img/nave1.png") self.img_nave_preta = self.loadImage("img/nave3.png") self.img_tiro_amarelo = self.loadImage("img/nave4_pow.png") self.img_tiro_preto = self.loadImage("img/nave3_pow.png") self.img_tiro_azul = self.loadImage("img/nave1_pow.png") self.img_tiro = self.loadImage("img/nave2_pow.png") self.logo_init = self.loadImage("img/SpaceCute.png") self.logo_end = self.loadImage("img/YouDied.png") self.power_up_vida = self.loadImage("img/power_up_life.png") self.power_up_shoot = self.loadImage("img/power_up_shot.png") self.power_up_speed = self.loadImage("img/power_up_speed.png") self.myLogo_i.load("inicio", self.logo_init, self.logo_end) self.ornaments.append(self.myLogo_i) self.myLogo_i.inited = True self.myLogo_e.load("fim", self.logo_init, self.logo_end) self.init_queue() # Arrumando erros de frict fix_p = self.propellant_queue.pop() fix_p.load(self.animation_propellant_enemy, 1000, 1000, "fix") self.ornaments.append(fix_p) new_explosion = self.explosion_queue.pop() new_explosion.load(self.animation_explosion, 1000, 1000, "fix") self.ornaments.append(new_explosion) tx = 0 ambiente = [0.2, 0.2, 0.2, 1.0] difusa = [0.7, 0.7, 0.7, 1.0] especular = [1.0, 1.0, 1.0, 1.0] posicao = [0.0, 3.0, 2.0, 0.0] lmodelo_ambiente = [0.2, 0.2, 0.2, 1.0] glLightfv(GL_LIGHT0, GL_AMBIENT, ambiente) glLightfv(GL_LIGHT0, GL_DIFFUSE, difusa) glLightfv(GL_LIGHT0, GL_POSITION, posicao) glLightfv(GL_LIGHT0, GL_SPECULAR, especular) glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodelo_ambiente) glEnable(GL_LIGHTING) glEnable(GL_LIGHT0) glEnable(GL_COLOR_MATERIAL) # Funcao para carregar imagens a partir de um caminho def loadImage(self, path): im = Image.open(path) ix, iy, image = im.size[0], im.size[1], im.tobytes() ID = glGenTextures(1) glBindTexture(GL_TEXTURE_2D, ID) glPixelStorei(GL_UNPACK_ALIGNMENT, 1) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, ix, iy, 0, GL_RGBA, GL_UNSIGNED_BYTE, image) return ID # funcoes para acoes no teclado # A = move para esquerda # D = move para direita # W = atira def keyPressEvent(self, event): if event.key() == QtCore.Qt.Key_Left: self.myNave.moving_left = True if event.key() == QtCore.Qt.Key_A: self.myNave.moving_left = True if event.key() == QtCore.Qt.Key_Right: self.myNave.moving_right = True if event.key() == QtCore.Qt.Key_D: self.myNave.moving_right = True if event.key() == QtCore.Qt.Key_Space: self.myNave.shooting = True if event.key() == QtCore.Qt.Key_Up: self.myNave.moving_up = True if event.key() == QtCore.Qt.Key_W: self.myNave.moving_up = True if event.key() == QtCore.Qt.Key_Down: self.myNave.moving_down = True if event.key() == QtCore.Qt.Key_S: self.myNave.moving_down = True def keyReleaseEvent(self, event): if event.key() == QtCore.Qt.Key_Left: self.myNave.moving_left = False if event.key() == QtCore.Qt.Key_A: self.myNave.moving_left = False if event.key() == QtCore.Qt.Key_Right: self.myNave.moving_right = False if event.key() == QtCore.Qt.Key_D: self.myNave.moving_right = False if event.key() == QtCore.Qt.Key_Space: self.myNave.shooting = False if event.key() == QtCore.Qt.Key_Up: self.myNave.moving_up = False if event.key() == QtCore.Qt.Key_W: self.myNave.moving_up = False if event.key() == QtCore.Qt.Key_Down: self.myNave.moving_down = False if event.key() == QtCore.Qt.Key_S: self.myNave.moving_down = False # Funcao de desenhar a cena def paintGL(self): # Checa se a musica de fundo acabou e reinicia self.check_end_backm() self.update() # Se o player morreu, entao o jogo acaba if self.myNave.dead: self.started = False glClear(GL_COLOR_BUFFER_BIT) glLoadIdentity() self.update_time() self.spawn_planets() self.spawn_stars() glDisable(GL_DEPTH_TEST) # Desenha os ornamentos ( "Flores" ) # e retira os objetos "mortos" retornando eles para a fila for obj in self.ornaments: if not obj == None: if obj.dead: if isinstance(obj, Planeta): self.planets_queue.push(obj) self.ornaments.remove(obj) elif isinstance(obj, Star): self.ornaments.remove(obj) elif isinstance(obj, Explode): self.explosion_queue.push(obj) self.ornaments.remove(obj) elif isinstance(obj, Propellant): self.propellant_queue.push(obj) self.ornaments.remove(obj) obj.draw() obj.act() obj.check_dead() # Verifica se o jogo foi iniciado if not self.started: return glEnable(GL_DEPTH_TEST) # Desenha a cena # e retira os objetos mortos retornando ele para a fila # e instancia uma explosao no lugar for obj in self.in_scene: if not obj == None: if obj.dead: if isinstance(obj, Enemy): new_explosion = self.explosion_queue.pop() new_explosion.load(self.animation_explosion, obj.move_x + obj.position_x, obj.move_y + 6, "enemy") self.in_scene.append(new_explosion) self.enemy_queue.push(obj) self.in_scene.remove(obj) elif isinstance(obj, Asteroide): new_explosion = self.explosion_queue.pop() new_explosion.load(self.animation_explosion, obj.move_x + obj.position_x, obj.move_y + 5, "enemy") self.in_scene.append(new_explosion) self.asteroid_queue.push(obj) self.in_scene.remove(obj) elif isinstance(obj, Shoot): self.bullets_queue.push(obj) self.in_scene.remove(obj) elif isinstance(obj, Explode): obj.dead = False self.explosion_queue.push(obj) self.in_scene.remove(obj) elif isinstance(obj, Power_up): self.power_queue.push(obj) self.in_scene.remove(obj) if isinstance(obj, Nave): if obj.shooting: self.create_shoot(obj.move_x + obj.position_x) obj.draw() obj.act() obj.check_dead() # Testa as colisoes e aplica os efeitos (ganhar pontos, ou perder vida) for obj_A in self.in_scene: if isinstance(obj_A, Asteroide): for obj_B in self.in_scene: if not (obj_A == obj_B): if isinstance(obj_B, Nave) and self.collide( obj_B, obj_A): # ui.down_life() obj_A.dead = True elif isinstance(obj_B, Shoot) and self.collide( obj_B, obj_A): if not obj_B.is_enemy: obj_A.dead = True if not self.hack: obj_B.dead = True self.sound_explosion.play() ui.up_point(10) if ui.score % 1000 == 0: self.sound_1000pts.play() elif isinstance(obj_A, Enemy): obj_A.elapsed_shoot_time += time() if obj_A.elapsed_shoot_time >= SHOOT_TIME_ENEMY: pos = [obj_A.get_x()[0] + 5, obj_A.get_y()[0] + 6, 0] player = [ self.myNave.get_x()[0] + 5, self.myNave.get_y()[0] - 8, 0 ] dir = [ player[0] - pos[0], player[1] - pos[1], player[2] - pos[2] ] angle_R = math.atan2(dir[1], pos[0]) angle = math.degrees(angle_R) if obj_A.nave_type == 0: self.create_shoot(obj_A.move_x + obj_A.position_x, obj_A.move_y, obj_A.move_y + 6, True, obj_A.nave_type, obj_A.shoot_type, self.img_tiro_azul, angle) elif obj_A.nave_type == 1: self.create_shoot(obj_A.move_x + obj_A.position_x, obj_A.move_y, obj_A.move_y + 6, True, obj_A.nave_type, obj_A.shoot_type, self.img_tiro_amarelo, angle) elif obj_A.nave_type == 2: self.create_shoot(obj_A.move_x + obj_A.position_x, obj_A.move_y, obj_A.move_y + 6, True, obj_A.nave_type, obj_A.shoot_type, self.img_tiro_preto, angle) obj_A.elapsed_shoot_time = 0 for obj_B in self.in_scene: if not (obj_A == obj_B): if isinstance(obj_B, Nave) and self.collide( obj_B, obj_A): # ui.down_life() obj_A.dead = True elif isinstance(obj_B, Shoot) and self.collide( obj_B, obj_A): if not obj_B.is_enemy: obj_A.dead = True if self.hack: obj_B.dead = False else: obj_B.dead = True self.sound_explosion.play() ui.up_point(10) if ui.score % 1000 == 0: self.sound_1000pts.play() elif isinstance(obj_A, Shoot): if obj_A.is_enemy: for obj_B in self.in_scene: if not (obj_A == obj_B): if isinstance(obj_B, Nave) and self.collide( obj_B, obj_A): # ui.down_life() obj_A.dead = True elif isinstance(obj_A, Nave): if self.speed: obj_A.speed = 3 else: obj_A.speed = 0 for obj_B in self.in_scene: if not (obj_A == obj_B): if isinstance(obj_B, Power_up) and self.collide( obj_B, obj_A): obj_B.dead = True self.sound_power.play() if obj_B.skin == 0: ui.up_life() elif obj_B.skin == 1: self.hack = True self.elapsed_time_power_shoot = 0 elif obj_B.skin == 2: self.speed = True self.elapsed_time_power_speed = 0 self.spawn_asteroide() self.spawn_inimigos() self.spawn_powers() self.update() # Checa se a musica de fundo acabou e reinicia caso positivo def check_end_backm(self): if self.sound_inGame.isFinished(): self.sound_inGame.play() # Atualiza o tempo dos temporizadores def update_time(self): self.elapsed_time_shoot += time() self.elapsed_time_asteroide += time() self.elapsed_time_inimigo += time() self.elapsed_time_planet += time() self.elapsed_time_stars += time() self.elapsed_time_powers += time() if self.hack: self.elapsed_time_power_shoot += time() if self.elapsed_time_power_shoot >= POWER_UP_SHOOT: self.hack = False if self.speed: self.elapsed_time_power_speed += time() if self.elapsed_time_power_speed >= POWER_UP_SPEED: self.speed = False # Faz a criacao das estrelas, com uma posicao e escala aleatoria def spawn_stars(self): if self.elapsed_time_stars >= SPAWN_TIME_STARS: position = randint(-70, 70) scale = self.rand_tam_star() new_star = Star(position, scale) self.ornaments.append(new_star) self.elapsed_time_stars = 0 # Faz a criacao dos planetas, com uma posicao e escala aleatoria def spawn_planets(self): if self.elapsed_time_planet >= SPAWN_TIME_PLANET: position = randint(-50, 50) scale = self.rand_tam() new_planet = self.planets_queue.pop() new_planet.load(position, scale, self.img_planets) self.ornaments.append(new_planet) self.elapsed_time_planet = 0 # Retorna um tamanho aleatorio para os planetas def rand_tam(self): return float(str(randint(0, 2)) + "." + str(randint(1, 5))) # Retorna um tamanho aleatorio para as estrelas def rand_tam_star(self): return float("0." + str(randint(1, 3))) # Faz a criacao dos asteroides, com uma posicao aleatioria def spawn_asteroide(self): if self.elapsed_time_asteroide >= SPAWN_TIME: new_aste = self.asteroid_queue.pop() new_aste.load(randint(-49, 43)) self.in_scene.append(new_aste) self.elapsed_time_asteroide = 0 # Faz a criacao dos power ups, com uma posicao aleatioria def spawn_powers(self): if self.elapsed_time_powers >= POWER_UP_TIME: new_power = self.power_queue.pop() new_power.load(randint(-49, 43), 60, self.power_up_vida, self.power_up_shoot, self.power_up_speed) self.in_scene.append(new_power) self.elapsed_time_powers = 0 # Faz a criacao dos inimigos, com uma posicao aleatoria def spawn_inimigos(self): if self.elapsed_time_inimigo >= SPAWN_TIME_ENEMY: new_inimigo = self.enemy_queue.pop() new_inimigo.load(randint(-49, 43), self.animation_propellant_enemy, self.img_nave_azul, self.img_nave_amarela, self.img_nave_preta) self.in_scene.append(new_inimigo) self.elapsed_time_inimigo = 0 # Funcao para criacao dos tiros, tanto dos inimigos quanto do player def create_shoot(self, position, position_y=None, position_y_2=None, is_enemy=False, type="player", qtd=None, tiro_respectivo=None, my_angle=None): if is_enemy: if qtd == 1: new_shoot = self.bullets_queue.pop() new_shoot.load(tiro_respectivo, position, position_y, position_y_2, True, type, 0, my_angle) self.in_scene.append(new_shoot) elif qtd == 2: new_shoot = self.bullets_queue.pop() new_shoot.load(tiro_respectivo, position - 2.5, position_y, position_y_2, True, type, 0, my_angle) new_shoot2 = self.bullets_queue.pop() new_shoot2.load(tiro_respectivo, position + 2.5, position_y, position_y_2, True, type, 0, my_angle) self.in_scene.append(new_shoot) self.in_scene.append(new_shoot2) elif qtd == 3: new_shoot = self.bullets_queue.pop() new_shoot.load(tiro_respectivo, position - 5, position_y, position_y_2, True, type, 0, my_angle) new_shoot2 = self.bullets_queue.pop() new_shoot2.load(tiro_respectivo, position, position_y, position_y_2, True, type, 0, my_angle) new_shoot3 = self.bullets_queue.pop() new_shoot3.load(tiro_respectivo, position + 5, position_y, position_y_2, True, type, 0, my_angle) self.in_scene.append(new_shoot) self.in_scene.append(new_shoot2) self.in_scene.append(new_shoot3) self.sound_laser_enemy.play() return if self.elapsed_time_shoot >= SHOOT_TIME: if self.myNave.moving_right: adjust = 3 elif self.myNave.moving_left: adjust = -3 else: adjust = 0 if self.hack: new_shoot = self.bullets_queue.pop() new_shoot.load(self.img_tiro, position + adjust + 5, self.myNave.get_y()[1], self.myNave.get_y()[1] + 8, False, 1, self.myNave.get_z()[0] + 10, 0) new_shoot2 = self.bullets_queue.pop() new_shoot2.load(self.img_tiro, position + adjust - 5, self.myNave.get_y()[1], self.myNave.get_y()[1] + 8, False, 1, self.myNave.get_z()[0] + 10, 0) new_shoot3 = self.bullets_queue.pop() new_shoot3.load(self.img_tiro, position + adjust, self.myNave.get_y()[1], self.myNave.get_y()[1] + 8, False, 1, self.myNave.get_z()[0] + 10, 0) self.in_scene.append(new_shoot) self.in_scene.append(new_shoot2) self.in_scene.append(new_shoot3) self.sound_laser.play() else: new_shoot = self.bullets_queue.pop() new_shoot.load(self.img_tiro, position + adjust, self.myNave.get_y()[1], self.myNave.get_y()[1] + 8, False, 1, self.myNave.get_z()[0] + 10, 0) self.in_scene.append(new_shoot) self.sound_laser.play() self.elapsed_time_shoot = 0 # Checagem de colisao # adaptado com o eixo z def collide(self, A, B): A_colliding_B_in_x = (A.get_x()[1] >= B.get_x()[0] and A.get_x()[1] <= B.get_x()[1]) # or B_colliding_A_in_x = (B.get_x()[1] >= A.get_x()[0] and B.get_x()[1] <= A.get_x()[1]) A_colliding_B_in_y = (A.get_y()[1] >= B.get_y()[0] and A.get_y()[1] <= B.get_y()[1]) # or B_colliding_A_in_y = (B.get_y()[1] >= A.get_y()[0] and B.get_y()[1] <= A.get_y()[1]) A_colliding_B_in_z = (A.get_z()[1] >= B.get_z()[0] and A.get_z()[1] <= B.get_z()[1]) # or B_colliding_A_in_z = (B.get_z()[1] >= A.get_z()[0] and B.get_z()[1] <= A.get_z()[1]) return (A_colliding_B_in_x or B_colliding_A_in_x) and \ (A_colliding_B_in_y or B_colliding_A_in_y) and \ (A_colliding_B_in_z or B_colliding_A_in_z) def active_hack(self): self.hack = not self.hack # Reinicia o jogo, seta todas as variaveis para o inicio def reestart(self): self.reloc() self.started = False self.player_move_left = False self.player_move_right = False self.myNave = Nave(self.animation_propellant_enemy, 0) self.elapsed_time_shoot = 0 self.elapsed_time_asteroide = 0 self.elapsed_time_inimigo = 0 self.hack = False self.in_scene = [] self.in_scene.append(self.myNave) self.sound_inGame.stop() self.sound_inGame = QSound("sound/inGame.wav", self) self.sound_inGame.play() if self.myLogo_i.inited: self.ornaments.remove(self.myLogo_i) self.myLogo_i.inited = False if self.myLogo_e.inited: self.ornaments.remove(self.myLogo_e) self.myLogo_e.inited = False # Realoca os objetos atualmente na cena para suas respectivas filas def reloc(self): for obj in self.in_scene: if isinstance(obj, Enemy): self.enemy_queue.push(obj) self.in_scene.remove(obj) elif isinstance(obj, Asteroide): self.asteroid_queue.push(obj) self.in_scene.remove(obj) elif isinstance(obj, Shoot): self.bullets_queue.push(obj) self.in_scene.remove(obj) elif isinstance(obj, Explode): self.explosion_queue.push(obj) self.in_scene.remove(obj) elif isinstance(obj, Power_up): self.power_queue.push(obj) self.in_scene.remove(obj) for obj in self.ornaments: if isinstance(obj, Flor): self.flowers_queue.push(obj) self.ornaments.remove(obj) elif isinstance(obj, Planeta): self.planets_queue.push(obj) self.ornaments.remove(obj) # Para o jogo def stop(self): self.reloc() self.started = False self.sound_inGame.stop() self.sound_inGame = QSound("sound/startScene.wav", self) self.sound_inGame.play() self.in_scene = [] self.ornaments.append(self.myLogo_i) if self.myLogo_e.inited: self.ornaments.remove(self.myLogo_e) self.myLogo_e.inited = False self.myLogo_i.inited = True # Quando o jogador morre def dead(self): self.reloc() self.myNave.dead = True self.sound_inGame.stop() self.sound_inGame = QSound("sound/gameOver.wav", self) self.sound_death.play() if self.sound_death.isFinished(): self.sound_inGame.play() self.ornaments.append(self.myLogo_e) self.myLogo_e.inited = True
class GameWindow(QtWidgets.QMainWindow): def __init__(self, parent=None): super(GameWindow, self).__init__(parent) self.params = ParamsWindow(self) self.params.accepted.connect(self.create_lines_widget) self.params.show() self.connection = Connection() self.connection.hints_signal.connect(self.update_hint) self.best_score = QtWidgets.QPushButton('Scores', self) self.lcd = QtWidgets.QLCDNumber(self) self.lcd.setDigitCount(4) sound_file = filename = os.path.abspath( os.path.join(os.path.dirname(__file__), "Sound.wav")) self.player = QSound(sound_file, self) self.statusBar() self.menu_bar = self.menuBar() self.layout = QtWidgets.QGridLayout() self.layout.setSpacing(8) self.layout.addWidget(self.lcd, 0, 1) window = QtWidgets.QWidget() window.setLayout(self.layout) self.setCentralWidget(window) self.setWindowTitle("Lines") self.setStyleSheet("background-color: khaki") def create_lines_widget(self): next_colors = self.params.settings[1] self.linesWidget = LinesWidget(*self.params.settings, self) self.scores = ScoresDialog( (self.params.settings[0][0], self.params.settings[0][1]), self) self.scores.scoresWindow.get_scores() text = self.scores.scoresWindow.players[0][1] \ if self.scores.scoresWindow.players else '0' self.best_score.setText('Best Score: {}'.format(text)) self.best_score.clicked.connect(self.scores.show) self.hint = HintsWidget(20, next_colors, self) self.connection.hints_signal.emit() self.layout.addWidget(self.linesWidget, 1, 0, 1, 4) self.layout.addWidget(self.hint, 0, 0) self.layout.addWidget(self.best_score, 0, 2) self.resize(QSize(640, 640)) self.create_menu() self.update_window() self.resize(QSize(650, 650)) def update_window(self): self.norm_size = self.linesWidget.width() + 100, \ self.linesWidget.height() + 100 self.setMinimumSize(*self.norm_size) self.move(QtWidgets.QApplication.desktop().screen().rect().center() - self.rect().center()) self.show() def resizeEvent(self, event): if self.linesWidget: param1 = min(event.size().height(), event.size().width()) param2 = min(self.linesWidget.field.height - 1, self.linesWidget.field.width - 1) scale = (param1 - 150 - self.linesWidget.scale) // param2 self.linesWidget.scale = scale self.hint.scale = scale self.linesWidget.resize_widget() self.hint.resize_widget() self.resize(event.size()) def create_menu(self): self.blocker = QtWidgets.QAction('Turn ON Block cells', self) hint = QtWidgets.QAction('Show Hint', self) scores = QtWidgets.QAction('Show Scores', self) self.sound_action = QtWidgets.QAction('Play Music', self) scores_cheat = QtWidgets.QAction('Score cheat', self) self.blocker.triggered.connect(self.set_blocking_mode) hint.triggered.connect(self.switch_hints) scores.triggered.connect(self.scores.show) self.sound_action.triggered.connect(self.play_music) scores_cheat.triggered.connect( lambda: self.linesWidget.open_save_scores_dialog(True)) menu = self.menu_bar.addMenu('Menu') menu.addAction(self.blocker) menu.addAction(hint) menu.addAction(scores) menu.addAction(self.sound_action) asd = menu.addMenu('Cheats') asd.addAction(scores_cheat) def set_blocking_mode(self): if self.blocker.text() == 'Turn ON Block cells': self.linesWidget.blocking = True self.blocker.setText('Turn OFF Block cells') else: self.linesWidget.blocking = False self.blocker.setText('Turn ON Block cells') def play_music(self): if self.player.isFinished(): self.sound_action.setText('Stop Music') self.player.play() else: self.sound_action.setText('Play Music') self.player.stop() def update_hint(self): self.hint.next_colors = self.linesWidget.field.colors_to_spawn self.hint.update() def switch_hints(self): if self.hint.enabled and \ self.linesWidget.field.scores_coefficient != 1: self.linesWidget.field.scores_coefficient = 2 self.hint.enabled = False else: self.linesWidget.field.scores_coefficient = 1 self.hint.enabled = True self.hint.update() def closeEvent(self, *args, **kwargs): sys.exit(0)
class main(QtWidgets.QOpenGLWidget): ########### INITIALIZE AND CREATE VAR ################## def __init__(self, parent): QtWidgets.QOpenGLWidget.__init__(self, parent) self.started = False self.imageID_back = None self.in_scene = [] self.ornaments = [] self.moveSettings() self.player_x = 0 self.player2_x = 20 self.elapsed_time_shoot = 0 self.elapsed_time_asteroide = 0 self.elapsed_time_inimigo = 0 self.elapsed_time_flower = 500000000000 / 2 self.elapsed_time_planet = 920000000000 / 3 self.elapsed_time_stars = 0 self.hack = False ########## SOUNDS ################## self.sound_laser = QSound("sound/laser.wav", self) self.sound_laser_enemy = QSound("sound/laserenemy.wav", self) self.sound_explosion = QSound("sound/explos.wav", self) self.sound_1000pts = QSound("sound/1000pts.wav", self) self.sound_inGame = QSound("sound/startScene.wav", self) self.sound_death = QSound("sound/nooo.wav", self) ########### LISTS OBJECTS ################## self.enemy_queue = Queue_rotative() self.asteroid_queue = Queue_rotative() self.bullets_queue = Queue_rotative() self.flowers_queue = Queue_rotative() self.planets_queue = Queue_rotative() # self.stars_queue = Queue_rotative() self.explosion_queue = Queue_rotative() self.propellant_queue = Queue_rotative() self.animation_explosion = [None for i in range(EXPLOSION_FRAMES)] self.animation_propellant_enemy = [ None for i in range(PROPELLANT_FRAMES) ] self.img_nave_azul = None self.img_nave_amarela = None self.img_nave_preta = None self.img_tiro_azul = None self.img_tiro_preto = None self.img_tiro_amarelo = None self.img_tiro = None self.logo_init = None self.logo_end = None self.myLogo_i = Logo() self.myLogo_e = Logo() self.myNave = None self.myNave2 = None def init_queue(self): for i in range(10): new = Enemy() self.enemy_queue.push(new) for i in range(10): new = Asteroide() self.asteroid_queue.push(new) for i in range(50): new = Shoot() self.bullets_queue.push(new) for i in range(3): new = Flor() self.flowers_queue.push(new) for i in range(5): new = Planeta() self.planets_queue.push(new) for i in range(21): new = Explode() self.explosion_queue.push(new) for i in range(11): new = Propellant() self.propellant_queue.push(new) ########### KEYBOARD PLAYER FUNC ################## def moveSettings(self): self.shortcut_left = QShortcut(QtCore.Qt.Key_A, self) self.shortcut_left.activated.connect(self.move_left) self.shortcut_right = QShortcut(QtCore.Qt.Key_D, self) self.shortcut_right.activated.connect(self.move_right) self.shortcut_left_shoot = QShortcut(QtCore.Qt.Key_Q, self) self.shortcut_left_shoot.activated.connect(self.move_left_and_shoot) self.shortcut_right_shoot = QShortcut(QtCore.Qt.Key_E, self) self.shortcut_right_shoot.activated.connect(self.move_right_and_shoot) self.shortcut_up = QShortcut(QtCore.Qt.Key_W, self) self.shortcut_up.activated.connect(self.player_shoot) self.shortcut_hack = QShortcut(QtCore.Qt.Key_T, self) self.shortcut_hack.activated.connect(self.active_hack) self.shortcut_left = QShortcut(QtCore.Qt.Key_J, self) self.shortcut_left.activated.connect(self.move2_left) self.shortcut_right = QShortcut(QtCore.Qt.Key_L, self) self.shortcut_right.activated.connect(self.move2_right) self.shortcut_up = QShortcut(QtCore.Qt.Key_I, self) self.shortcut_up.activated.connect(self.player2_shoot) ########### PREPARING THE SCENE ################## def initializeGL(self): glClearColor(0.0, 0.0, 0.0, 0.0) glShadeModel(GL_SMOOTH) glEnable(GL_BLEND) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) glEnable(GL_ALPHA_TEST) glAlphaFunc(GL_NOTEQUAL, 0.0) glMatrixMode(GL_PROJECTION) glLoadIdentity() glOrtho(-50.0, 50.0, -50.0, 50.0, -1, 1) glMatrixMode(GL_MODELVIEW) glLoadIdentity() self.myNave = Nave(self.animation_propellant_enemy, self.player_x) self.in_scene.append(self.myNave) self.myNave2 = Nave(self.animation_propellant_enemy, self.player2_x) self.in_scene.append(self.myNave2) self.imageID_back = self.loadImage("img/Background.png") for i in range(EXPLOSION_FRAMES): self.animation_explosion[i] = self.loadImage("img/explosion/Comp" + str(i) + ".png") for i in range(PROPELLANT_FRAMES): self.animation_propellant_enemy[i] = self.loadImage( "img/fire/Comp" + str(i) + ".png") self.img_nave_amarela = self.loadImage("img/nave4.png") self.img_nave_azul = self.loadImage("img/nave1.png") self.img_nave_preta = self.loadImage("img/nave3.png") self.img_tiro_amarelo = self.loadImage("img/nave4_pow.png") self.img_tiro_preto = self.loadImage("img/nave3_pow.png") self.img_tiro_azul = self.loadImage("img/nave1_pow.png") self.img_tiro = self.loadImage("img/nave2_pow.png") self.logo_init = self.loadImage("img/SpaceCute.png") self.logo_end = self.loadImage("img/YouDied.png") self.myLogo_i.load("inicio", self.logo_init, self.logo_end) self.ornaments.append(self.myLogo_i) self.myLogo_i.inited = True self.myLogo_e.load("fim", self.logo_init, self.logo_end) self.init_queue() def loadImage(self, path): im = Image.open(path) ix, iy, image = im.size[0], im.size[1], im.tobytes() ID = glGenTextures(1) glBindTexture(GL_TEXTURE_2D, ID) glPixelStorei(GL_UNPACK_ALIGNMENT, 1) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, ix, iy, 0, GL_RGBA, GL_UNSIGNED_BYTE, image) return ID ########### PAINT FUNC ################## def paintGL(self): self.check_end_backm() self.update() if self.myNave.dead: self.started = False glClear(GL_COLOR_BUFFER_BIT) glLoadIdentity() ########### DRAW BACKGROUND ################## glColor3f(1.0, 1.0, 1.0) glDisable(GL_LIGHTING) glEnable(GL_TEXTURE_2D) glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE) glTexParameter(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) glTexParameter(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) glBindTexture(GL_TEXTURE_2D, self.imageID_back) glPushMatrix() glBegin(GL_QUADS) glTexCoord2f(0, 1) glVertex3f(50, -50, 1) glTexCoord2f(1, 1) glVertex3f(-50, -50, 1) glTexCoord2f(1, 0) glVertex3f(-50, 50, 1) glTexCoord2f(0, 0) glVertex3f(50, 50, 1) glEnd() glPopMatrix() glDisable(GL_TEXTURE_2D) self.update_time() self.spawn_flowers() self.spawn_planets() self.spawn_stars() ########### DRAW ORNAMENTS ################## for obj in self.ornaments: if not obj == None: if obj.dead: if isinstance(obj, Flor): self.flowers_queue.push(obj) self.ornaments.remove(obj) elif isinstance(obj, Planeta): self.planets_queue.push(obj) self.ornaments.remove(obj) elif isinstance(obj, Star): self.ornaments.remove(obj) obj.draw() obj.act() obj.check_dead() # print(self.bullets_queue.tam()) ########### VERIFY IF THE GAME HAS STARTED ################## if (not self.started): return ########### DRAW SCENE ################## for obj in self.in_scene: if not obj == None: if obj.dead: if isinstance(obj, Enemy): new_explosion = self.explosion_queue.pop() new_explosion.load(self.animation_explosion, obj.move_x + obj.position_x, obj.move_y + 6, "enemy") self.in_scene.append(new_explosion) self.enemy_queue.push(obj) self.in_scene.remove(obj) elif isinstance(obj, Asteroide): new_explosion = self.explosion_queue.pop() new_explosion.load(self.animation_explosion, obj.move_x + obj.position_x, obj.move_y + 5, "enemy") self.in_scene.append(new_explosion) self.asteroid_queue.push(obj) self.in_scene.remove(obj) elif isinstance(obj, Shoot): self.bullets_queue.push(obj) self.in_scene.remove(obj) elif isinstance(obj, Explode): obj.dead = False self.explosion_queue.push(obj) self.in_scene.remove(obj) obj.draw() obj.act() obj.check_dead() ########### COLLISION CHECK ################## for obj_A in self.in_scene: if isinstance(obj_A, Asteroide): for obj_B in self.in_scene: if not (obj_A == obj_B): if isinstance(obj_B, Nave) and self.collide( obj_B, obj_A): # obj_B.dead = True ui.down_life() obj_A.dead = True elif isinstance(obj_B, Shoot) and self.collide( obj_B, obj_A): if not obj_B.is_enemy: obj_A.dead = True if not self.hack: obj_B.dead = True self.sound_explosion.play() ui.up_point(10) if ui.score % 1000 == 0: self.sound_1000pts.play() elif isinstance(obj_A, Enemy): obj_A.elapsed_shoot_time += time() if obj_A.elapsed_shoot_time >= SHOOT_TIME_ENEMY: if obj_A.nave_type == 0: self.create_shoot(obj_A.move_x + obj_A.position_x, obj_A.move_y, obj_A.move_y + 6, True, obj_A.nave_type, obj_A.shoot_type, self.img_tiro_azul) elif obj_A.nave_type == 1: self.create_shoot(obj_A.move_x + obj_A.position_x, obj_A.move_y, obj_A.move_y + 6, True, obj_A.nave_type, obj_A.shoot_type, self.img_tiro_amarelo) elif obj_A.nave_type == 2: self.create_shoot(obj_A.move_x + obj_A.position_x, obj_A.move_y, obj_A.move_y + 6, True, obj_A.nave_type, obj_A.shoot_type, self.img_tiro_preto) obj_A.elapsed_shoot_time = 0 for obj_B in self.in_scene: if not (obj_A == obj_B): if isinstance(obj_B, Nave) and self.collide( obj_B, obj_A): # obj_B.dead = True ui.down_life() obj_A.dead = True elif isinstance(obj_B, Shoot) and self.collide( obj_B, obj_A): if not obj_B.is_enemy: obj_A.dead = True if self.hack: obj_B.dead = False else: obj_B.dead = True self.sound_explosion.play() ui.up_point(10) if ui.score % 1000 == 0: self.sound_1000pts.play() elif isinstance(obj_A, Shoot): if obj_A.is_enemy: for obj_B in self.in_scene: if not (obj_A == obj_B): if isinstance(obj_B, Nave) and self.collide( obj_B, obj_A): # obj_B.dead = True ui.down_life() obj_A.dead = True self.spawn_asteroide() self.spawn_inimigos() self.update() def check_end_backm(self): if self.sound_inGame.isFinished(): self.sound_inGame.play() def update_time(self): self.elapsed_time_shoot += time() self.elapsed_time_asteroide += time() self.elapsed_time_inimigo += time() self.elapsed_time_flower += time() self.elapsed_time_planet += time() self.elapsed_time_stars += time() def spawn_stars(self): if self.elapsed_time_stars >= SPANW_TIME_STARS: position = randint(-49, 49) scale = self.rand_tam_star() new_star = Star(position, scale) self.ornaments.append(new_star) self.elapsed_time_stars = 0 def spawn_planets(self): if self.elapsed_time_planet >= SPANW_TIME_PLANET: position = randint(-50, 50) scale = self.rand_tam() new_planet = self.planets_queue.pop() new_planet.load(position, scale) self.ornaments.append(new_planet) self.elapsed_time_planet = 0 def rand_tam(self): return float(str(randint(0, 2)) + "." + str(randint(1, 5))) def rand_tam_star(self): return float("0." + str(randint(1, 3))) def spawn_flowers(self): if self.elapsed_time_flower >= SPANW_TIME_FLOWER: position = randint(-50, 50) new_flower = self.flowers_queue.pop() new_flower.load(position) self.ornaments.append(new_flower) self.elapsed_time_flower = 0 ########### SPAWNING ASTEROIDE FUNCS ################# def spawn_asteroide(self): if self.elapsed_time_asteroide >= SPANW_TIME: new_aste = self.asteroid_queue.pop() new_aste.load(randint(-49, 43)) self.in_scene.append(new_aste) self.elapsed_time_asteroide = 0 ########### SPAWNING ASTEROIDE FUNCS ################# def spawn_inimigos(self): if self.elapsed_time_inimigo >= SPANW_TIME_ENEMY: self.create_inimigos() def create_inimigos(self): new_inimigo = self.enemy_queue.pop() new_inimigo.load(randint(-49, 43), self.animation_propellant_enemy, self.img_nave_azul, self.img_nave_amarela, self.img_nave_preta) self.in_scene.append(new_inimigo) self.elapsed_time_inimigo = 0 ########### MOVING PLAYER FUNCS ################# def move_left(self): if self.myNave.move_x + self.myNave.position_x - 4.0 >= -47: self.myNave.move_left() self.player_x -= 3 def move_left_and_shoot(self): if self.myNave.move_x + self.myNave.position_x - 4.0 >= -47: self.myNave.move_left() self.player_x -= 3 self.create_shoot(self.player_x) def move_right(self): if self.myNave.move_x + self.myNave.position_x + 4.0 <= 47: self.myNave.move_right() self.player_x += 3 def move_right_and_shoot(self): if self.myNave.move_x + self.myNave.position_x + 4.0 <= 47: self.myNave.move_right() self.player_x += 3 self.create_shoot(self.player_x) #############NEWS############################## def move2_left(self): if self.myNave2.move_x + self.myNave2.position_x - 4.0 >= -47: self.myNave2.move_left() self.player2_x -= 3 def move2_right(self): if self.myNave2.move_x + self.myNave2.position_x + 4.0 <= 47: self.myNave2.move_right() self.player2_x += 3 ########### SHOOT PLAYER FUNC ################## ########### CREATE THE BULLET ################## def player_shoot(self): self.create_shoot(self.player_x) def player2_shoot(self): self.create_shoot(self.player2_x) def create_shoot(self, position, position_y=None, position_y_2=None, is_enemy=False, type="player", qtd=None, tiro_respectivo=None): if is_enemy: if qtd == 1: new_shoot = self.bullets_queue.pop() new_shoot.load(tiro_respectivo, position, position_y, position_y_2, True, type) self.in_scene.append(new_shoot) elif qtd == 2: new_shoot = self.bullets_queue.pop() new_shoot.load(tiro_respectivo, position - 2.5, position_y, position_y_2, True, type) new_shoot2 = self.bullets_queue.pop() new_shoot2.load(tiro_respectivo, position + 2.5, position_y, position_y_2, True, type) self.in_scene.append(new_shoot) self.in_scene.append(new_shoot2) elif qtd == 3: new_shoot = self.bullets_queue.pop() new_shoot.load(tiro_respectivo, position - 5, position_y, position_y_2, True, type) new_shoot2 = self.bullets_queue.pop() new_shoot2.load(tiro_respectivo, position, position_y, position_y_2, True, type) new_shoot3 = self.bullets_queue.pop() new_shoot3.load(tiro_respectivo, position + 5, position_y, position_y_2, True, type) self.in_scene.append(new_shoot) self.in_scene.append(new_shoot2) self.in_scene.append(new_shoot3) self.sound_laser_enemy.play() return if self.elapsed_time_shoot >= SHOOT_TIME: if self.hack: new_shoot = self.bullets_queue.pop() new_shoot.load(self.img_tiro, position + 5, -46.0, -40.0, False, 1) new_shoot2 = self.bullets_queue.pop() new_shoot2.load(self.img_tiro, position - 5, -46.0, -40.0, False, 1) new_shoot3 = self.bullets_queue.pop() new_shoot3.load(self.img_tiro, position, -46.0, -40.0, False, 1) self.in_scene.append(new_shoot) self.in_scene.append(new_shoot2) self.in_scene.append(new_shoot3) else: new_shoot = self.bullets_queue.pop() new_shoot.load(self.img_tiro, position, -46.0, -40.0, False, 1) self.in_scene.append(new_shoot) self.elapsed_time_shoot = 0 self.sound_laser.play() ########### COLISION CHECK FUNC ################## def collide(self, A, B): A_colliding_B_in_x = (A.get_x()[1] >= B.get_x()[0] and A.get_x()[1] <= B.get_x()[1]) #or B_colliding_A_in_x = (B.get_x()[1] >= A.get_x()[0] and B.get_x()[1] <= A.get_x()[1]) A_colliding_B_in_y = (A.get_y()[1] >= B.get_y()[0] and A.get_y()[1] <= B.get_y()[1]) #or B_colliding_A_in_y = (B.get_y()[1] >= A.get_y()[0] and B.get_y()[1] <= A.get_y()[1]) return (A_colliding_B_in_x or B_colliding_A_in_x) and \ (A_colliding_B_in_y or B_colliding_A_in_y) def active_hack(self): self.hack = not self.hack def reestart(self): self.reloc() self.started = False self.in_scene = [] self.player_x = 0 self.player2_x = 20 self.myNave = Nave(self.animation_propellant_enemy, self.player_x) self.myNave2 = Nave(self.animation_propellant_enemy, self.player_x + 20) self.elapsed_time_shoot = 0 self.elapsed_time_asteroide = 0 self.elapsed_time_inimigo = 0 self.hack = False self.in_scene.append(self.myNave) self.in_scene.append(self.myNave2) self.sound_inGame.stop() self.sound_inGame = QSound("sound/inGame.wav", self) self.sound_inGame.play() if self.myLogo_i.inited: self.ornaments.remove(self.myLogo_i) self.myLogo_i.inited = False if self.myLogo_e.inited: self.ornaments.remove(self.myLogo_e) self.myLogo_e.inited = False def reloc(self): for obj in self.in_scene: if isinstance(obj, Enemy): self.enemy_queue.push(obj) self.in_scene.remove(obj) elif isinstance(obj, Asteroide): self.asteroid_queue.push(obj) self.in_scene.remove(obj) elif isinstance(obj, Shoot): self.bullets_queue.push(obj) self.in_scene.remove(obj) elif isinstance(obj, Explode): self.explosion_queue.push(obj) self.in_scene.remove(obj) for obj in self.ornaments: if isinstance(obj, Flor): self.flowers_queue.push(obj) self.ornaments.remove(obj) elif isinstance(obj, Planeta): self.planets_queue.push(obj) self.ornaments.remove(obj) def stop(self): self.reloc() self.started = False self.sound_inGame.stop() self.sound_inGame = QSound("sound/startScene.wav", self) self.sound_inGame.play() self.in_scene = [] self.ornaments.append(self.myLogo_i) if self.myLogo_e.inited: self.ornaments.remove(self.myLogo_e) self.myLogo_e.inited = False self.myLogo_i.inited = True def dead(self): self.myNave.dead = True self.sound_inGame.stop() self.sound_inGame = QSound("sound/gameOver.wav", self) self.sound_death.play() if self.sound_death.isFinished(): self.sound_inGame.play() self.ornaments.append(self.myLogo_e) self.myLogo_e.inited = True
class main(QtWidgets.QOpenGLWidget): # Cria as variaveis necessarias # self.started = Indica se o jogo foi iniciado ou nao # self.in_scene = Vetor para a cena (tudo que faz parte do jogo e sera desenhado) # self.ornaments = Vetor para a beleza da cena (tudo que sao apenas "flores") # # Temporizadores # self.elapsed_time_shoot = Tempo desde o ultimo tiro do player # self.elapsed_time_asteroide = Tempo desde o ultimo asteroide criado # self.elapsed_time_inimigo = Tempo desde o ultimo inimigo criado # self.elapsed_time_flower = Tempo desde a ultima flor criada # self.elapsed_time_planet = Tempo desde o ultimo planeta criado # self.elapsed_time_stars = = Tempo desde a ultima estrela criada # # Sons # self.sound_laser = Tiro do player # self.sound_laser_enemy = Tiro do inimigo # self.sound_explosion = Explosao # self.sound_1000pts = 1000 pontos alcancados # self.sound_inGame = Fundo do jogo # self.sound_death = Morte # # Filas para pre carregamento dos objetos # self.enemy_queue = Fila dos inimigos # self.asteroid_queue = Fila dos Asteroides # self.bullets_queue = Fila das balas # self.flowers_queue = Fila das flores # self.planets_queue = Fila dos planetas # self.explosion_queue = Fila das explosoes # self.propellant_queue = Fila dos propulsores # # Variaveis para pre carregamento das texturas # self.animation_explosion # self.animation_propellant_enemy # self.img_nave_azul # self.img_nave_amarela # self.img_nave_preta # self.img_tiro_azul # self.img_tiro_preto # self.img_tiro_amarelo # self.img_tiro # self.logo_init # self.logo_end # self.imageID_back # self.myLogo_i = Logo() # self.myLogo_e = Logo() # # self.myNave = Nave do jogador def __init__(self, parent): QtWidgets.QOpenGLWidget.__init__(self, parent) self.started = False self.imageID_back = None self.in_scene = [] self.ornaments = [] self.elapsed_time_shoot = 0 self.elapsed_time_asteroide = 0 self.elapsed_time_inimigo = 0 self.elapsed_time_flower = 500000000000 / 2 self.elapsed_time_planet = 920000000000 / 3 self.elapsed_time_stars = 0 self.elapsed_time_powers = 0 self.elapsed_time_power_shoot = 0 self.elapsed_time_power_speed = 0 self.hack = False self.speed = False self.sound_laser = QSound("sound/laser.wav", self) self.sound_laser_enemy = QSound("sound/laserenemy.wav", self) self.sound_explosion = QSound("sound/explos.wav", self) self.sound_1000pts = QSound("sound/1000pts.wav", self) self.sound_inGame = QSound("sound/startScene.wav", self) self.sound_death = QSound("sound/nooo.wav", self) self.sound_power = QSound("sound/powerUp.wav", self) self.enemy_queue = Queue_rotative() self.asteroid_queue = Queue_rotative() self.bullets_queue = Queue_rotative() self.flowers_queue = Queue_rotative() self.planets_queue = Queue_rotative() self.explosion_queue = Queue_rotative() self.propellant_queue = Queue_rotative() self.power_queue = Queue_rotative() self.animation_explosion = [None for i in range(EXPLOSION_FRAMES)] self.animation_propellant_enemy = [ None for i in range(PROPELLANT_FRAMES) ] self.img_planets = [None for i in range(10)] self.img_nave_azul = None self.img_nave_amarela = None self.img_nave_preta = None self.img_tiro_azul = None self.img_tiro_preto = None self.img_tiro_amarelo = None self.img_tiro = None self.logo_init = None self.logo_end = None self.power_up_vida = None self.power_up_shoot = None self.power_up_speed = None self.myLogo_i = Logo() self.myLogo_e = Logo() self.myNave = None # Inicializa as filas de pre carregamentos def init_queue(self): for i in range(20): new = Enemy() self.enemy_queue.push(new) for i in range(50): new = Asteroide() self.asteroid_queue.push(new) for i in range(100): new = Shoot() self.bullets_queue.push(new) for i in range(10): new = Flor() self.flowers_queue.push(new) for i in range(10): new = Planeta() self.planets_queue.push(new) for i in range(50): new = Explode() self.explosion_queue.push(new) for i in range(30): new = Propellant() self.propellant_queue.push(new) for i in range(20): new = Power_up() self.power_queue.push(new) # Prepara a cena e carrega as texturas def initializeGL(self): glClearColor(0.0, 0.0, 0.0, 0.0) glShadeModel(GL_SMOOTH) glEnable(GL_BLEND) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) glEnable(GL_ALPHA_TEST) glAlphaFunc(GL_NOTEQUAL, 0.0) glMatrixMode(GL_PROJECTION) glLoadIdentity() glOrtho(-50.0, 50.0, -50.0, 50.0, -1, 1) glMatrixMode(GL_MODELVIEW) glLoadIdentity() self.myNave = Nave(self.animation_propellant_enemy, 0) self.in_scene.append(self.myNave) self.imageID_back = self.loadImage("img/Background.png") for i in range(EXPLOSION_FRAMES): self.animation_explosion[i] = self.loadImage("img/explosion/Comp" + str(i) + ".png") for i in range(PROPELLANT_FRAMES): self.animation_propellant_enemy[i] = self.loadImage( "img/fire/Comp" + str(i) + ".png") for i in range(10): self.img_planets[i] = self.loadImage("img/planets/planeta" + str(i) + ".png") self.img_nave_amarela = self.loadImage("img/nave4.png") self.img_nave_azul = self.loadImage("img/nave1.png") self.img_nave_preta = self.loadImage("img/nave3.png") self.img_tiro_amarelo = self.loadImage("img/nave4_pow.png") self.img_tiro_preto = self.loadImage("img/nave3_pow.png") self.img_tiro_azul = self.loadImage("img/nave1_pow.png") self.img_tiro = self.loadImage("img/nave2_pow.png") self.logo_init = self.loadImage("img/SpaceCute.png") self.logo_end = self.loadImage("img/YouDied.png") self.power_up_vida = self.loadImage("img/power_up_life.png") self.power_up_shoot = self.loadImage("img/power_up_shot.png") self.power_up_speed = self.loadImage("img/power_up_speed.png") self.myLogo_i.load("inicio", self.logo_init, self.logo_end) self.ornaments.append(self.myLogo_i) self.myLogo_i.inited = True self.myLogo_e.load("fim", self.logo_init, self.logo_end) self.init_queue() # Arrumando erros de frict fix_p = self.propellant_queue.pop() fix_p.load(self.animation_propellant_enemy, 70, 70, "fix") self.ornaments.append(fix_p) new_explosion = self.explosion_queue.pop() new_explosion.load(self.animation_explosion, 70, 70, "fix") self.ornaments.append(new_explosion) # Funcao para carregar imagens a partir de um caminho def loadImage(self, path): im = Image.open(path) ix, iy, image = im.size[0], im.size[1], im.tobytes() ID = glGenTextures(1) glBindTexture(GL_TEXTURE_2D, ID) glPixelStorei(GL_UNPACK_ALIGNMENT, 1) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, ix, iy, 0, GL_RGBA, GL_UNSIGNED_BYTE, image) return ID # funcoes para acoes no teclado # A = move para esquerda # D = move para direita # W = atira def keyPressEvent(self, event): if event.key() == QtCore.Qt.Key_Left: self.myNave.moving_left = True if event.key() == QtCore.Qt.Key_A: self.myNave.moving_left = True if event.key() == QtCore.Qt.Key_Right: self.myNave.moving_right = True if event.key() == QtCore.Qt.Key_D: self.myNave.moving_right = True if event.key() == QtCore.Qt.Key_Up: self.myNave.shooting = True if event.key() == QtCore.Qt.Key_W: self.myNave.shooting = True # if event.key() == QtCore.Qt.Key_T: # self.hack = True def keyReleaseEvent(self, event): if event.key() == QtCore.Qt.Key_Left: self.myNave.moving_left = False if event.key() == QtCore.Qt.Key_A: self.myNave.moving_left = False if event.key() == QtCore.Qt.Key_Right: self.myNave.moving_right = False if event.key() == QtCore.Qt.Key_D: self.myNave.moving_right = False if event.key() == QtCore.Qt.Key_Up: self.myNave.shooting = False if event.key() == QtCore.Qt.Key_W: self.myNave.shooting = False if event.key() == QtCore.Qt.Key_T: self.hack = False # Funcao de desenhar a cena def paintGL(self): # Checa se a musica de fundo acabou e reinicia self.check_end_backm() self.update() # Se o player morreu, entao o jogo acaba if self.myNave.dead: self.started = False glClear(GL_COLOR_BUFFER_BIT) glLoadIdentity() # Desenha o background ''''' Inicio do background ''' '' glColor3f(1.0, 1.0, 1.0) glDisable(GL_LIGHTING) glEnable(GL_TEXTURE_2D) glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE) glTexParameter(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) glTexParameter(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) glBindTexture(GL_TEXTURE_2D, self.imageID_back) glPushMatrix() glBegin(GL_QUADS) glTexCoord2f(0, 1) glVertex3f(50, -50, 1) glTexCoord2f(1, 1) glVertex3f(-50, -50, 1) glTexCoord2f(1, 0) glVertex3f(-50, 50, 1) glTexCoord2f(0, 0) glVertex3f(50, 50, 1) glEnd() glPopMatrix() glDisable(GL_TEXTURE_2D) ''''' Fim do background ''' '' self.update_time() self.spawn_flowers() self.spawn_planets() self.spawn_stars() # Desenha os ornamentos ( "Flores" ) # e retira os objetos "mortos" retornando eles para a fila for obj in self.ornaments: if not obj == None: if obj.dead: if isinstance(obj, Flor): self.flowers_queue.push(obj) self.ornaments.remove(obj) elif isinstance(obj, Planeta): self.planets_queue.push(obj) self.ornaments.remove(obj) elif isinstance(obj, Star): self.ornaments.remove(obj) elif isinstance(obj, Explode): self.explosion_queue.push(obj) self.ornaments.remove(obj) elif isinstance(obj, Propellant): self.propellant_queue.push(obj) self.ornaments.remove(obj) obj.draw() obj.act() obj.check_dead() # print (self.enemy_queue.tam()) # Verifica se o jogo foi iniciado if (not self.started): return # Desenha a cena # e retira os objetos mortos retornando ele para a fila # e instancia uma explosao no lugar for obj in self.in_scene: if not obj == None: if obj.dead: if isinstance(obj, Enemy): new_explosion = self.explosion_queue.pop() new_explosion.load(self.animation_explosion, obj.move_x + obj.position_x, obj.move_y + 6, "enemy") self.in_scene.append(new_explosion) self.enemy_queue.push(obj) self.in_scene.remove(obj) elif isinstance(obj, Asteroide): new_explosion = self.explosion_queue.pop() new_explosion.load(self.animation_explosion, obj.move_x + obj.position_x, obj.move_y + 5, "enemy") self.in_scene.append(new_explosion) self.asteroid_queue.push(obj) self.in_scene.remove(obj) elif isinstance(obj, Shoot): self.bullets_queue.push(obj) self.in_scene.remove(obj) elif isinstance(obj, Explode): obj.dead = False self.explosion_queue.push(obj) self.in_scene.remove(obj) elif isinstance(obj, Power_up): self.power_queue.push(obj) self.in_scene.remove(obj) if isinstance(obj, Nave): if obj.shooting: self.create_shoot(obj.move_x + obj.position_x) obj.draw() obj.act() obj.check_dead() # Testa as colisoes e aplica os efeitos (ganhar pontos, ou perder vida) for obj_A in self.in_scene: if isinstance(obj_A, Asteroide): for obj_B in self.in_scene: if not (obj_A == obj_B): if isinstance(obj_B, Nave) and self.collide( obj_B, obj_A): ui.down_life() obj_A.dead = True elif isinstance(obj_B, Shoot) and self.collide( obj_B, obj_A): if not obj_B.is_enemy: obj_A.dead = True if not self.hack: obj_B.dead = True self.sound_explosion.play() ui.up_point(10) if ui.score % 1000 == 0: self.sound_1000pts.play() elif isinstance(obj_A, Enemy): obj_A.elapsed_shoot_time += time() if obj_A.elapsed_shoot_time >= SHOOT_TIME_ENEMY: if obj_A.nave_type == 0: self.create_shoot(obj_A.move_x + obj_A.position_x, obj_A.move_y, obj_A.move_y + 6, True, obj_A.nave_type, obj_A.shoot_type, self.img_tiro_azul) elif obj_A.nave_type == 1: self.create_shoot(obj_A.move_x + obj_A.position_x, obj_A.move_y, obj_A.move_y + 6, True, obj_A.nave_type, obj_A.shoot_type, self.img_tiro_amarelo) elif obj_A.nave_type == 2: self.create_shoot(obj_A.move_x + obj_A.position_x, obj_A.move_y, obj_A.move_y + 6, True, obj_A.nave_type, obj_A.shoot_type, self.img_tiro_preto) obj_A.elapsed_shoot_time = 0 for obj_B in self.in_scene: if not (obj_A == obj_B): if isinstance(obj_B, Nave) and self.collide( obj_B, obj_A): ui.down_life() obj_A.dead = True elif isinstance(obj_B, Shoot) and self.collide( obj_B, obj_A): if not obj_B.is_enemy: obj_A.dead = True if self.hack: obj_B.dead = False else: obj_B.dead = True self.sound_explosion.play() ui.up_point(10) if ui.score % 1000 == 0: self.sound_1000pts.play() elif isinstance(obj_A, Shoot): if obj_A.is_enemy: for obj_B in self.in_scene: if not (obj_A == obj_B): if isinstance(obj_B, Nave) and self.collide( obj_B, obj_A): ui.down_life() obj_A.dead = True elif isinstance(obj_A, Nave): if self.speed: obj_A.speed = 3 else: obj_A.speed = 0 for obj_B in self.in_scene: if not (obj_A == obj_B): if isinstance(obj_B, Power_up) and self.collide( obj_B, obj_A): obj_B.dead = True self.sound_power.play() if obj_B.skin == 0: ui.up_life() elif obj_B.skin == 1: self.hack = True self.elapsed_time_power_shoot = 0 elif obj_B.skin == 2: self.speed = True self.elapsed_time_power_speed = 0 self.spawn_asteroide() self.spawn_inimigos() self.spawn_powers() self.update() # Checa se a musica de fundo acabou e reinicia caso positivo def check_end_backm(self): if self.sound_inGame.isFinished(): self.sound_inGame.play() # Atualiza o tempo dos temporizadores def update_time(self): self.elapsed_time_shoot += time() self.elapsed_time_asteroide += time() self.elapsed_time_inimigo += time() self.elapsed_time_flower += time() self.elapsed_time_planet += time() self.elapsed_time_stars += time() self.elapsed_time_powers += time() if self.hack: self.elapsed_time_power_shoot += time() if self.elapsed_time_power_shoot >= POWER_UP_SHOOT: self.hack = False if self.speed: self.elapsed_time_power_speed += time() if self.elapsed_time_power_speed >= POWER_UP_SPEED: self.speed = False # Faz a criacao das estrelas, com uma posicao e escala aleatoria def spawn_stars(self): if self.elapsed_time_stars >= SPAWN_TIME_STARS: position = randint(-49, 49) scale = self.rand_tam_star() new_star = Star(position, scale) self.ornaments.append(new_star) self.elapsed_time_stars = 0 # Faz a criacao dos planetas, com uma posicao e escala aleatoria def spawn_planets(self): if self.elapsed_time_planet >= SPAWN_TIME_PLANET: position = randint(-50, 50) scale = self.rand_tam() new_planet = self.planets_queue.pop() new_planet.load(position, scale, self.img_planets) self.ornaments.append(new_planet) self.elapsed_time_planet = 0 # Retorna um tamanho aleatorio para os planetas def rand_tam(self): return float(str(randint(0, 2)) + "." + str(randint(1, 5))) # Retorna um tamanho aleatorio para as estrelas def rand_tam_star(self): return float("0." + str(randint(1, 3))) # Faz a criacao das flores, com uma posicao aleatoria def spawn_flowers(self): if self.elapsed_time_flower >= SPAWN_TIME_FLOWER: position = randint(-50, 50) new_flower = self.flowers_queue.pop() new_flower.load(position) self.ornaments.append(new_flower) self.elapsed_time_flower = 0 # Faz a criacao dos asteroides, com uma posicao aleatioria def spawn_asteroide(self): if self.elapsed_time_asteroide >= SPAWN_TIME: new_aste = self.asteroid_queue.pop() new_aste.load(randint(-49, 43)) self.in_scene.append(new_aste) self.elapsed_time_asteroide = 0 # Faz a criacao dos power ups, com uma posicao aleatioria def spawn_powers(self): if self.elapsed_time_powers >= POWER_UP_TIME: new_power = self.power_queue.pop() new_power.load(randint(-49, 43), 60, self.power_up_vida, self.power_up_shoot, self.power_up_speed) self.in_scene.append(new_power) self.elapsed_time_powers = 0 # Faz a criacao dos inimigos, com uma posicao aleatoria def spawn_inimigos(self): if self.elapsed_time_inimigo >= SPAWN_TIME_ENEMY: new_inimigo = self.enemy_queue.pop() new_inimigo.load(randint(-49, 43), self.animation_propellant_enemy, self.img_nave_azul, self.img_nave_amarela, self.img_nave_preta) self.in_scene.append(new_inimigo) self.elapsed_time_inimigo = 0 # Funcao para criacao dos tiros, tanto dos inimigos quanto do player def create_shoot(self, position, position_y=None, position_y_2=None, is_enemy=False, type="player", qtd=None, tiro_respectivo=None): if is_enemy: if qtd == 1: new_shoot = self.bullets_queue.pop() new_shoot.load(tiro_respectivo, position, position_y, position_y_2, True, type) self.in_scene.append(new_shoot) elif qtd == 2: new_shoot = self.bullets_queue.pop() new_shoot.load(tiro_respectivo, position - 2.5, position_y, position_y_2, True, type) new_shoot2 = self.bullets_queue.pop() new_shoot2.load(tiro_respectivo, position + 2.5, position_y, position_y_2, True, type) self.in_scene.append(new_shoot) self.in_scene.append(new_shoot2) elif qtd == 3: new_shoot = self.bullets_queue.pop() new_shoot.load(tiro_respectivo, position - 5, position_y, position_y_2, True, type) new_shoot2 = self.bullets_queue.pop() new_shoot2.load(tiro_respectivo, position, position_y, position_y_2, True, type) new_shoot3 = self.bullets_queue.pop() new_shoot3.load(tiro_respectivo, position + 5, position_y, position_y_2, True, type) self.in_scene.append(new_shoot) self.in_scene.append(new_shoot2) self.in_scene.append(new_shoot3) self.sound_laser_enemy.play() return if self.elapsed_time_shoot >= SHOOT_TIME: if self.hack: new_shoot = self.bullets_queue.pop() new_shoot.load(self.img_tiro, position + 5, -46.0, -40.0, False, 1) new_shoot2 = self.bullets_queue.pop() new_shoot2.load(self.img_tiro, position - 5, -46.0, -40.0, False, 1) new_shoot3 = self.bullets_queue.pop() new_shoot3.load(self.img_tiro, position, -46.0, -40.0, False, 1) self.in_scene.append(new_shoot) self.in_scene.append(new_shoot2) self.in_scene.append(new_shoot3) self.sound_laser.play() else: new_shoot = self.bullets_queue.pop() new_shoot.load(self.img_tiro, position, -46.0, -40.0, False, 1) self.in_scene.append(new_shoot) self.sound_laser.play() self.elapsed_time_shoot = 0 # Checagem de colisao def collide(self, A, B): A_colliding_B_in_x = (A.get_x()[1] >= B.get_x()[0] and A.get_x()[1] <= B.get_x()[1]) #or B_colliding_A_in_x = (B.get_x()[1] >= A.get_x()[0] and B.get_x()[1] <= A.get_x()[1]) A_colliding_B_in_y = (A.get_y()[1] >= B.get_y()[0] and A.get_y()[1] <= B.get_y()[1]) #or B_colliding_A_in_y = (B.get_y()[1] >= A.get_y()[0] and B.get_y()[1] <= A.get_y()[1]) return (A_colliding_B_in_x or B_colliding_A_in_x) and \ (A_colliding_B_in_y or B_colliding_A_in_y) def active_hack(self): self.hack = not self.hack # Reinicia o jogo, seta todas as variaveis para o inicio def reestart(self): self.reloc() self.started = False self.player_move_left = False self.player_move_right = False self.myNave = Nave(self.animation_propellant_enemy, 0) self.elapsed_time_shoot = 0 self.elapsed_time_asteroide = 0 self.elapsed_time_inimigo = 0 self.hack = False self.in_scene = [] self.in_scene.append(self.myNave) self.sound_inGame.stop() self.sound_inGame = QSound("sound/inGame.wav", self) self.sound_inGame.play() if self.myLogo_i.inited: self.ornaments.remove(self.myLogo_i) self.myLogo_i.inited = False if self.myLogo_e.inited: self.ornaments.remove(self.myLogo_e) self.myLogo_e.inited = False # Realoca os objetos atualmente na cena para suas respectivas filas def reloc(self): for obj in self.in_scene: if isinstance(obj, Enemy): self.enemy_queue.push(obj) self.in_scene.remove(obj) elif isinstance(obj, Asteroide): self.asteroid_queue.push(obj) self.in_scene.remove(obj) elif isinstance(obj, Shoot): self.bullets_queue.push(obj) self.in_scene.remove(obj) elif isinstance(obj, Explode): self.explosion_queue.push(obj) self.in_scene.remove(obj) elif isinstance(obj, Power_up): self.power_queue.push(obj) self.in_scene.remove(obj) for obj in self.ornaments: if isinstance(obj, Flor): self.flowers_queue.push(obj) self.ornaments.remove(obj) elif isinstance(obj, Planeta): self.planets_queue.push(obj) self.ornaments.remove(obj) # Para o jogo def stop(self): self.reloc() self.started = False self.sound_inGame.stop() self.sound_inGame = QSound("sound/startScene.wav", self) self.sound_inGame.play() self.in_scene = [] self.ornaments.append(self.myLogo_i) if self.myLogo_e.inited: self.ornaments.remove(self.myLogo_e) self.myLogo_e.inited = False self.myLogo_i.inited = True # Quando o jogador morre def dead(self): self.reloc() self.myNave.dead = True self.sound_inGame.stop() self.sound_inGame = QSound("sound/gameOver.wav", self) self.sound_death.play() if self.sound_death.isFinished(): self.sound_inGame.play() self.ornaments.append(self.myLogo_e) self.myLogo_e.inited = True
class Ui_Printing(object): def __init__(self, change_screen): self.change_screen = change_screen self.sound_effect = QSound(":/sounds/3d printer sounds.wav") self.playing = False def toggle_sound_effect(self): if self.sound_effect.isFinished(): self.playing = False if not self.playing: self.sound_effect.play() self.playing = True else: self.sound_effect.stop() self.playing = False def stop_sound_effect(self): if self.playing: self.sound_effect.stop() self.playing = False def add_buttons(self): self.pushButton.clicked.connect(lambda: self.change_screen.open_uses()) self.pushButton.clicked.connect(lambda: self.stop_sound_effect()) self.pushButton_2.clicked.connect( lambda: self.change_screen.open_plastics()) self.pushButton_2.clicked.connect(lambda: self.stop_sound_effect()) self.pushButton_3.clicked.connect(lambda: self.toggle_sound_effect()) def setupUi(self, Printing): Printing.setObjectName("Printing") Printing.resize(402, 300) self.verticalLayout = QtWidgets.QVBoxLayout(Printing) self.verticalLayout.setObjectName("verticalLayout") self.label = QtWidgets.QLabel(Printing) # self.label.setPixmap(QtGui.QPixmap(":/sounds/3d printer sounds.wav")) self.label.setAlignment(QtCore.Qt.AlignCenter) self.label.setWordWrap(True) self.label.setObjectName("main_label") self.verticalLayout.addWidget(self.label) self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setContentsMargins(20, 20, 20, 20) self.horizontalLayout.setSpacing(50) self.horizontalLayout.setObjectName("horizontalLayout") self.pushButton = QtWidgets.QPushButton(Printing) self.pushButton.setObjectName("pushButton") self.horizontalLayout.addWidget(self.pushButton) self.pushButton_2 = QtWidgets.QPushButton(Printing) self.pushButton_2.setEnabled(True) self.pushButton_2.setObjectName("pushButton_2") self.horizontalLayout.addWidget(self.pushButton_2) self.verticalLayout.addLayout(self.horizontalLayout) self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName("horizontalLayout_2") spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_2.addItem(spacerItem) self.pushButton_3 = QtWidgets.QPushButton(Printing) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.pushButton_3.sizePolicy().hasHeightForWidth()) self.pushButton_3.setSizePolicy(sizePolicy) self.pushButton_3.setObjectName("pushButton_3") self.horizontalLayout_2.addWidget(self.pushButton_3) spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_2.addItem(spacerItem1) self.verticalLayout.addLayout(self.horizontalLayout_2) self.retranslateUi(Printing) self.add_buttons() QtCore.QMetaObject.connectSlotsByName(Printing) def retranslateUi(self, Printing): _translate = QtCore.QCoreApplication.translate Printing.setWindowTitle(_translate("Printing", "Form")) self.label.setText( _translate( "Printing", "3D printing is cool. This app, which has taken 3.2 billion man-hours and $87 trillion USD to develop, will teach you literally everything you need to know about it." )) self.pushButton.setText(_translate("Printing", "Uses")) self.pushButton_2.setText(_translate("Printing", "Plastics")) self.pushButton_3.setText( _translate("Printing", "Listen to a 3D printer"))
class MainWindow(QDialog, mainwindow_ui.Ui_Dialog): def __init__(self): super().__init__() self.setupUi(self) self._game_finished = False self._moves_made = None self._o_turn = None self._o_pixmap = QPixmap("resources/images/o.png") self._x_pixmap = QPixmap("resources/images/x.png") self._pixmap_game_over = QPixmap("resources/images/game_over_2.png") self._sound_invalid_move = QSound("resources/sounds/invalid_move.wav") self._sound_placed_token = QSound("resources/sounds/place_token_2.wav") self._position_labels = [ self.position_top_left, self.position_top_center, self.position_top_right, self.position_middle_left, self.position_middle_center, self.position_middle_right, self.position_bottom_left, self.position_bottom_center, self.position_bottom_right ] helpers.connect_position_label_clicked_signals( self._position_labels, self._label_clicked_handler) helpers.connect_position_label_enter_signals(self._position_labels, self._label_enter_handler) helpers.connect_position_label_leave_signals(self._position_labels, self._label_leave_handler) self._game_grid = self._new_game_grid() self._new_game() self.show() def keyReleaseEvent(self, event: QtGui.QKeyEvent) -> None: if event.key() == Qt.Key_N: self._new_game() else: super().keyReleaseEvent(event) def _check_for_winner(self, player): draw = 0 combos = [ slice(0, 3), slice(3, 6), slice(6, 9), slice(0, 9, 3), slice(1, 9, 3), slice(2, 9, 3), slice(0, 9, 4), slice(2, 9, 2) ] for combination in combos: positions = self._game_grid[combination][0:3] if positions == [player, player, player]: return player if all(positions): draw += 1 if draw == 8: return "draw" return None def _clear_display_grid(self): for label in [ child for child in self.grid_container.children() if isinstance(child, CustomLabel) ]: label.reset() def _game_over(self, winner_pixmap, draw=False): dialog = WinnerDialog(self, winner_pixmap, draw) dialog.exec() self._game_finished = True self._new_game() def _label_enter_handler(self, label: CustomLabel): if not label.pixmap(): pixmap = self._o_pixmap if self._o_turn else self._x_pixmap label.setPixmap(pixmap) @staticmethod def _label_leave_handler(label: CustomLabel): if label.pixmap() and not label.player_image_set: label.clear() def _label_clicked_handler(self, label: CustomLabel, index: int) -> None: if not self._game_finished: if self._o_turn: self._process_turn(label, "O", index) else: self._process_turn(label, "X", index) def _new_game(self): self._clear_display_grid() self._game_grid = self._new_game_grid() self._o_turn = False self._game_finished = False @staticmethod def _new_game_grid(): return [""] * 9 def _process_turn(self, label: CustomLabel, player: str, index: int): if not self._is_valid_move(index): if self._sound_invalid_move.isFinished(): self._sound_invalid_move.play() return self._sound_placed_token.play() self._game_grid[index] = player pixmap = self._o_pixmap if player == "O" else self._x_pixmap label.set_player_pixmap(pixmap) # check and/or report result of player move result = self._check_for_winner(player) if result == player: QTimer.singleShot(100, lambda: self._game_over(pixmap)) elif result == "draw": self._game_over(self._pixmap_game_over, draw=True) # let the other guy have a turn self._o_turn = not self._o_turn def _is_valid_move(self, index: int): return self._game_grid[index] == ""