import arcade import random SCREEN_WIDTH = 950 SCREEN_HEIGHT = 760 levels = [ ["Level1", True, 15, 25, 2], ["Level2", False, 18, 30, 3], ["level3", False, 22, 38, 2], ["Level4", False, 25, 48, 1], ["level5", False, 28, 50, 2], ["Level6", False, 30, 55, 3], ["Level7", False, 28, 60, 2] ] meteors = [":resources:images/space_shooter/meteorGrey_big2.png", ":resources:images/space_shooter/meteorGrey_big1.png", ":resources:images/space_shooter/meteorGrey_med1.png", ":resources:images/space_shooter/meteorGrey_small2.png", ":resources:images/space_shooter/meteorGrey_med2.png", ] skins = [ [" калисто( обычный ) ", ":resources:images/space_shooter/playerShip1_green.png", 0, True], ["моряк ( обычный )", ":resources:images/space_shooter/playerShip1_blue.png", 10, False], [" солнечный корабль ( необычный )", ":resources:images/space_shooter/playerShip1_orange.png", 40, False], [" корабль с марса( редкий )", ":resources:images/space_shooter/playerShip3_orange.png", 128, False], [" квадратус ( ультраредкий )", ":resources:images/enemies/slimeBlock.png", 200, False], [" космическая станция ( эпический )", ":resources:images/topdown_tanks/tankBody_huge.png", 250, False, ], [" корабль из будущего ( легендарный )", ":resources:images/topdown_tanks/tankBody_darkLarge_outline.png", 310, False, ], ] Total_coins = 5 current_skin = ":resources:images/space_shooter/playerShip1_green.png" class StartMenu(arcade.View): def on_show(self): """ Вызывается один раз, когда мы переключаемся на это окно """ arcade.set_background_color(arcade.csscolor.BLACK) arcade.set_viewport(0, SCREEN_WIDTH - 1, 0, SCREEN_HEIGHT - 1) def on_draw(self): arcade.start_render() arcade.draw_lrwh_rectangle_textured(-200, 0, SCREEN_WIDTH * 3, SCREEN_HEIGHT, arcade.load_texture(":resources:images/backgrounds/stars.png")) arcade.draw_text("Битва в космосе", SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2, arcade.color.WHITE, font_size=70, anchor_x="center") arcade.draw_text("нажмите ENTER что бы начать игру", SCREEN_WIDTH / 2, 300, arcade.color.WHITE, font_size=35, anchor_x="center") arcade.draw_text("нажмите S что бы ознакомиться с управлением", SCREEN_WIDTH / 2, 250, arcade.color.WHITE, font_size=25, anchor_x="center") def on_key_press(self, key, modifiers): """Вызывается всякий раз, когда нажимается кнопка """ if key == arcade.key.ENTER: level_menu = LevelMenu() # lvl_menu.setup() self.window.show_view(level_menu) if key == arcade.key.S: control_menu = ControlView() # lvl_menu.setup() self.window.show_view(control_menu) elif key == arcade.key.F: shop_menu = ShopMenu() # lvl_menu.setup() self.window.show_view(shop_menu) class ControlView(arcade.View): def on_show(self): """ Вызывается один раз, когда мы переключаемся на это окно """ arcade.set_background_color(arcade.csscolor.BLACK) arcade.set_viewport(0, SCREEN_WIDTH - 1, 0, SCREEN_HEIGHT - 1) def on_draw(self): arcade.start_render() arcade.draw_lrwh_rectangle_textured(-200, 0, SCREEN_WIDTH * 3, SCREEN_HEIGHT, arcade.load_texture(":resources:images/backgrounds/stars.png")) arcade.draw_text("нажмите на правую кнопку мыши чтобы выстрелить вниз", SCREEN_WIDTH / 2, SCREEN_HEIGHT - 50, arcade.color.WHITE, font_size=20, anchor_x="center") arcade.draw_text("нажмите на левую кнопку мыши чтобы выстрелить вверх", SCREEN_WIDTH / 2, 600, arcade.color.WHITE, font_size=20, anchor_x="center") arcade.draw_text("нажмите F чтобы открыть магазин", SCREEN_WIDTH / 2, 580, arcade.color.WHITE, font_size=20, anchor_x="center") arcade.draw_text("нажмите S чтобы выйти в главное меню ", SCREEN_WIDTH / 2, 500, arcade.color.WHITE, font_size=20, anchor_x="center") def on_key_press(self, key, modifiers): if key == arcade.key.S: start_menu = StartMenu() # lvl_menu.setup() self.window.show_view(start_menu) class LevelMenu(arcade.View): def on_show(self): """ Вызывается один раз, когда мы переключаемся на это окно """ arcade.set_background_color(arcade.csscolor.BLACK) arcade.set_viewport(0, SCREEN_WIDTH - 1, 0, SCREEN_HEIGHT - 1) def on_draw(self): arcade.start_render() arcade.draw_lrwh_rectangle_textured(-200, 0, SCREEN_WIDTH * 3, SCREEN_HEIGHT, arcade.load_texture(":resources:images/backgrounds/stars.png")) arcade.draw_text("Выберите уровень ( нажмите цифру на клавиатуре )", SCREEN_WIDTH / 2, SCREEN_HEIGHT - 50, arcade.color.WHITE, font_size=20, anchor_x="center") offset = 0 for level in levels: arcade.draw_text(level[0], SCREEN_WIDTH / 2, (SCREEN_HEIGHT - 100) - offset, arcade.color.WHITE, font_size=20, anchor_x="center") offset = offset + 50 def on_key_press(self, key, modifiers): if key == arcade.key.KEY_1 and levels [0][1] == True: game_view = GameView(levels[0][2], levels[0][3],levels[0][4], 1) # lvl_menu.setup() self.window.show_view(game_view) elif key == arcade.key.KEY_2 and levels [1][1] == True: game_view = GameView(levels[1][2], levels[1][3],levels[1][4], 2) # lvl_menu.setup() self.window.show_view(game_view) elif key == arcade.key.KEY_3 and levels [2][1] == True: game_view = GameView(levels[2][2], levels[2][3],levels[2][4], 3) # lvl_menu.setup() self.window.show_view(game_view) elif key == arcade.key.KEY_4 and levels [3][1] == True: game_view = GameView(levels[3][2], levels[3][3],levels[3][4], 4) # lvl_menu.setup() self.window.show_view(game_view) elif key == arcade.key.KEY_5 and levels [4][1] == True: game_view = GameView(levels[4][2], levels[4][3],levels[4][4], 5) # lvl_menu.setup() self.window.show_view(game_view) elif key == arcade.key.KEY_6 and levels[5][1] == True: game_view = GameView(levels[5][2], levels[5][3], levels[5][4], 6) #lvl_menu.setup() self.window.show_view(game_view) elif key == arcade.key.KEY_7 and levels[6][1] == True: game_view = GameView(levels[6][2], levels[6][3],levels[6][4], 7) #lvl_menu.setup() self.window.show_view(game_view) elif key == arcade.key.F: shop_menu = ShopMenu() # lvl_menu.setup() self.window.show_view(shop_menu) class ShopMenu(arcade.View): def __init__(self): super().__init__() self.skin_list = arcade.SpriteList() self.window.set_mouse_visible(True) def setup(self): for skin in skins: print(skin) def on_show(self): arcade.set_background_color(arcade.csscolor.BLACK) def on_draw(self): global current_skin arcade.start_render() arcade.draw_lrwh_rectangle_textured(-200, 0, SCREEN_WIDTH * 2, SCREEN_HEIGHT * 2, arcade.load_texture(":resources:images/backgrounds/stars.png")) offset = 0 i = 0 for skin in skins: arcade.draw_text(skin[0], SCREEN_WIDTH / 2, (SCREEN_HEIGHT - 100) - offset, arcade.color.WHITE, font_size=20, anchor_x="center") if skin[3] == True and current_skin == skin[1]: arcade.draw_text(f"Выбрано", SCREEN_WIDTH / 2, (SCREEN_HEIGHT - 130) - offset, arcade.color.WHITE, font_size=20, anchor_x="center") elif skin[3] == True: arcade.draw_text("Купленно", SCREEN_WIDTH / 2, (SCREEN_HEIGHT - 130) - offset, arcade.color.WHITE, font_size=20, anchor_x="center") else: arcade.draw_text(f"✰ {skin[2]}", SCREEN_WIDTH / 2, (SCREEN_HEIGHT - 130) - offset, arcade.color.WHITE, font_size=20, anchor_x="center") arcade.draw_text("у вас звёзд", 800, 30, arcade.color.WHITE, font_size=25, anchor_x="center") arcade.draw_text(Total_coins, 920,30, arcade.color.WHITE, font_size=25, anchor_x="center") skin_sprite = arcade.Sprite(skin[1]) skin_sprite.center_x = SCREEN_WIDTH / 4 skin_sprite.center_y = (SCREEN_HEIGHT - 100) - offset skin_sprite.index = i self.skin_list.append(skin_sprite) offset = offset + 100 i += 1 self.skin_list.draw() def on_key_press(self, key, modifiers): """Вызывается всякий раз, когда нажимается кнопка """ if key == arcade.key.F: start_menu = StartMenu() # lvl_menu.setup() self.window.show_view(start_menu) def on_mouse_press(self, x: int, y: int, button: int, modifiers: int): skin = arcade.get_sprites_at_point((x, y), self.skin_list) global Total_coins global current_skin if len(skin) > 0: if Total_coins >= skins[skin[-1].index][2] and skins[skin[-1].index][3] == False: skins[skin[-1].index][3] = True Total_coins -= skins[skin[-1].index][2] if skins[skin[-1].index][3] == True: current_skin = skins[skin[-1].index][1] print("Skin equiped") class GameOver(arcade.View): def on_show(self): """ Вызывается один раз, когда мы переключаемся на это окно """ arcade.set_background_color(arcade.csscolor.BLACK) arcade.set_viewport(0, SCREEN_WIDTH - 1, 0, SCREEN_HEIGHT - 1) def on_draw(self): arcade.start_render() arcade.draw_lrwh_rectangle_textured(-200, 0, SCREEN_WIDTH * 3, SCREEN_HEIGHT, arcade.load_texture(":resources:images/backgrounds/stars.png")) arcade.draw_text("Вы проиграли", SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2, arcade.color.WHITE, font_size=70, anchor_x="center") def on_key_press(self, key, modifiers): """Вызывается всякий раз, когда нажимается кнопка """ if key == arcade.key.ENTER: start_menu = StartMenu() # lvl_menu.setup() self.window.show_view(start_menu) class WinMenu(arcade.View): def __init__(self, level, coins): super().__init__() self.level = level self.coins = coins def on_show(self): arcade.set_background_color(arcade.csscolor.BLACK) def on_draw(self): arcade.start_render() arcade.draw_lrwh_rectangle_textured(-200, 0, SCREEN_WIDTH * 2, SCREEN_HEIGHT * 2, arcade.load_texture(":resources:images/backgrounds/stars.png")) arcade.draw_text(f"Уровень {self.level} пройден!", SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2, arcade.color.WHITE, font_size=40, anchor_x="center") arcade.draw_text(f"Вам засчитались {self.coins} монет!", SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2 - 75, arcade.color.WHITE, font_size=20, anchor_x="center") def on_key_press(self, key, modifiers): """Вызывается всякий раз, когда нажимается кнопка """ if key == arcade.key.ENTER: self.finish_level() level_menu = LevelMenu() #level_menu.setup() self.window.show_view(level_menu) def finish_level(self): # Unlock level global levels if self.level < len(levels): levels[self.level][1] = True # Add coins global Total_coins Total_coins = Total_coins + self.coins class GameView(arcade.View): def __init__(self, number_enemies, number_coins, number_bril, level_number): super().__init__() self.window.set_mouse_visible(False) self.number_enemies = number_enemies self.number_coins = number_coins self.number_bril = number_bril self.player_list = arcade.SpriteList() self.coin_list = arcade.SpriteList() self.enemies_list = arcade.SpriteList() self.batel_list = arcade.SpriteList() self.bril_list = arcade.SpriteList() self.level_number = level_number self.coin_sound = arcade.load_sound(":resources:sounds/coin3.wav") self.enemy_sound = arcade.load_sound(":resources:sounds/hurt4.wav") self.batel_sound = arcade.load_sound(":resources:sounds/hit5.wav") self.bril_sound = arcade.load_sound(":resources:sounds/upgrade5.wav") self.counter = 0 self.live = 3 # Setup sprites self.player_sprite = arcade.Sprite(current_skin , 0.7) self.player_sprite.center_x = 100 self.player_sprite.center_y = 100 self.player_list.append(self.player_sprite) for i in range(number_coins): self.coin = arcade.Sprite(":resources:images/items/star.png", 0.5) self.coin.center_x = random.randrange(SCREEN_WIDTH) self.coin.center_y = random.randrange(SCREEN_HEIGHT) self.coin.velocity = (0, -1*random.randrange(1, 5)) self.coin_list.append(self.coin) for i in range(number_bril): self.bril = arcade.Sprite(":resources:images/items/gemYellow.png", 0.5) self.bril.center_x = random.randrange(SCREEN_WIDTH) self.bril.center_y = random.randrange(SCREEN_HEIGHT) self.bril.velocity = (0, -1*random.randrange(1, 5)) self.bril_list.append(self.bril) for i in range(number_enemies): self.enemy = arcade.Sprite(random.choice(meteors), 0.5) self.enemy.center_x = random.randrange(SCREEN_WIDTH) self.enemy.center_y = random.randrange(SCREEN_HEIGHT) self.enemy.velocity = (0, -1 * random.randrange(1, 5)) self.enemies_list.append(self.enemy) def on_show(self): arcade.set_background_color(arcade.csscolor.BLACK) def on_draw(self): arcade.start_render() arcade.draw_lrwh_rectangle_textured(-200, 0, SCREEN_WIDTH * 2, SCREEN_HEIGHT * 2, arcade.load_texture(":resources:images/backgrounds/stars.png")) lives_text = "♥" * self.live arcade.draw_text( lives_text, SCREEN_WIDTH - 10, 10, arcade.csscolor.CRIMSON, 25, anchor_x="right" ) self.player_list.draw() self.coin_list.draw() self.enemies_list.draw() self.batel_list.draw() self.bril_list.draw() def update(self, delta_time): self.coin_list.update() self.enemies_list.update() self.batel_list.update() self.bril_list.update() for i in self.coin_list: if i.center_y < 0: i.center_y = SCREEN_HEIGHT for i in self.enemies_list: if i.center_y < 0: i.center_y = SCREEN_HEIGHT for i in self.bril_list: if i.center_y < 0: i.center_y = SCREEN_HEIGHT coins_hit_list = self.player_sprite.collides_with_list(self.coin_list) for coin in coins_hit_list: coin.remove_from_sprite_lists() # метод, который удаляет прайт из списка self.counter += 1 arcade.play_sound(self.coin_sound) enemies_hit_list = self.player_sprite.collides_with_list(self.enemies_list) for enemy in enemies_hit_list: enemy.remove_from_sprite_lists() self.live -= 1 brils_hit_list = self.player_sprite.collides_with_list(self.bril_list) for bril in brils_hit_list: bril.remove_from_sprite_lists() self.live += 1 arcade.play_sound(self.bril_sound) if self.live == 0: gameover_menu = GameOver() # lvl_menu.setup() self.window.show_view(gameover_menu) for i in self.batel_list: enemies_hit_list2 = i.collides_with_list(self.enemies_list) for j in enemies_hit_list2: j.remove_from_sprite_lists() if len(enemies_hit_list2) > 0: i.remove_from_sprite_lists() if len(self.coin_list) <= 0: self.window.show_view(WinMenu(self.level_number, self.counter)) def on_mouse_motion(self, x, y, dx, dy): """ Обработка движения мыши """ # Перемещаем центр спрайта игрока в соответствии с положением мыши по осям x и y. self.player_sprite.center_x = x self.player_sprite.center_y = y def on_mouse_press(self, x, y, button, modifiers): if button == arcade.MOUSE_BUTTON_LEFT: batel = arcade.Sprite(":resources:images/space_shooter/laserRed01.png", 1) batel.center_x = x batel.center_y = y batel.velocity = (0, 10) self.batel_list.append(batel) arcade.play_sound(self.batel_sound) self.bulet = self.bulet - 1 if button == arcade.MOUSE_BUTTON_RIGHT: batel = arcade.Sprite(":resources:images/space_shooter/laserRed01.png", 1) batel.center_x = x batel.center_y = y batel.velocity = (0, -10) self.batel_list.append(batel) arcade.play_sound(self.batel_sound) def main(): window = arcade.Window(SCREEN_WIDTH, SCREEN_HEIGHT, "Битва в космосе") window.show_view(StartMenu()) arcade.run() main()