class Game: def __init__(self): self.gameName = "Dungeons & Pythons" self._image_library = {} self.screen = pygame.display.set_mode((900, 750)) self.gameOver = False self.clock = pygame.time.Clock() self.roundNumber = 0 self.player = Player(100, "Hero", 25, 50, 125, "assets/player/player.png") self.boss = Enemy(100, "The BOSS: Dragon", 20, 550, 100, "assets/monsters/boss.png", 300, 200) self.enemies = [Enemy(50, "Cloud ashes", 10, 550, 100, "assets/monsters/ashesSnake.png", 50, 10), Enemy(50, "Yaretzi", 15, 550, 100, "assets/monsters/aztecaSnake.png", 50, 15), Enemy(40, "Konoha", 7, 550, 100, "assets/monsters/fireFairy.png", 40, 10), Enemy(35, "Fire spliter", 10, 550, 100, "assets/monsters/fireLizard.png", 35, 10), Enemy(40, "Duchy", 7, 550, 100, "assets/monsters/groundFairy.png", 40, 10), Enemy(45, "Medusa's daughter", 13, 550, 100, "assets/monsters/groundSnake.png", 45, 13), Enemy(40, "Imperial", 12, 550, 100, "assets/monsters/imperialBird.png", 40, 12), Enemy(35, "Scissors", 9, 550, 100, "assets/monsters/scorpio.png", 35, 10), Enemy(20, "Awesome bats", 8, 550, 100, "assets/monsters/triBats.png", 20, 10), Enemy(45, "Hydra", 14, 550, 100, "assets/monsters/triHead.png", 45, 14), Enemy(25, "The python brothers", 5, 550, 100, "assets/monsters/triSnakes.png", 25, 10), Enemy(40, "Amega", 7, 550, 100, "assets/monsters/waterFairy.png", 40, 7)] self.currentEnemy = self.getRandomRegularEnemy() self.actionSelected = False self.arrowMenuPosition = Position.TOPLEFT def run(self): pygame.init() pygame.display.set_caption(self.gameName) while not self.gameOver: for event in pygame.event.get(): if event.type == pygame.QUIT: self.gameOver = True self.keyEvents(event) self.screen.fill((0, 0, 0)) self.buildGUI(self.screen) pygame.display.flip() self.clock.tick(60) pygame.quit() def keyEvents(self, event): if event.type == 3: #key down if event.key == 274: if self.arrowMenuPosition == Position.TOPLEFT: self.arrowMenuPosition = Position.BOTTOMLEFT elif self.arrowMenuPosition == Position.TOPRIGHT: self.arrowMenuPosition = Position.BOTTOMRIGHT #key up elif event.key == 273: if self.arrowMenuPosition == Position.BOTTOMLEFT: self.arrowMenuPosition = Position.TOPLEFT elif self.arrowMenuPosition == Position.BOTTOMRIGHT: self.arrowMenuPosition = Position.TOPRIGHT #key left elif event.key == 276: if self.arrowMenuPosition == Position.TOPRIGHT: self.arrowMenuPosition = Position.TOPLEFT elif self.arrowMenuPosition == Position.BOTTOMRIGHT: self.arrowMenuPosition = Position.BOTTOMLEFT #key right elif event.key == 275: if self.arrowMenuPosition == Position.TOPLEFT: self.arrowMenuPosition = Position.TOPRIGHT elif self.arrowMenuPosition == Position.BOTTOMLEFT: self.arrowMenuPosition = Position.BOTTOMRIGHT #key enter elif event.key == 13: self.playAction() def buildGUI(self, view): #background displayImage(view, 'assets/recources/bg.png', 0, 0) #bottom panel displayImage(view, 'assets/recources/panel.png', 0, 475) #palyer self.player.draw(view) #enemy self.currentEnemy.draw(view) #buttons self.drawButtons(view) #player information self.drawPlayerInfo(view) #menu arrow self.drawArrowMenu(view) #armor self.drawArmor(view) #enemy info self.drawEnemyLife(view) def playAction(self): if self.arrowMenuPosition == Position.TOPLEFT: self.attackAction() elif self.arrowMenuPosition == Position.TOPRIGHT: self.healAction() elif self.arrowMenuPosition == Position.BOTTOMLEFT: self.armorAction() elif self.arrowMenuPosition == Position.BOTTOMRIGHT: self.exitGame() def exitGame(self): self.gameOver = True def attackAction(self): self.player.attack(self.currentEnemy) if self.currentEnemy.isDead(): self.nextRound() else: self.currentEnemy.attack(self.player) if self.player.isDead(): self.exitGame() def healAction(self): self.player.heal() def armorAction(self): self.player.addArmor() def drawButtons(self, view): #attack button self.drawButton(view,'ATTACK', 65, 533, 'assets/ui/button.png') #heal button self.drawHealButton(view) #armor button self.drawArmorButton(view) #exit button self.drawButton(view,'EXIT', 450, 618, 'assets/ui/button.png') def drawButton(self, view, text, x, y, buttonSprite, textColor = (255, 255, 255)): displayImage(view, buttonSprite, x, y) displayTextCentered(view, text, x, y, textColor) def drawHealButton(self, view): textColor = (255, 255, 255) if self.player.canHeal() else (149, 129, 115) buttonSprite = 'assets/ui/button.png' if self.player.canHeal() else 'assets/ui/button_disable.png' self.drawButton(view, 'HEAL(20C)', 450, 533, buttonSprite, textColor) def drawArmorButton(self, view): textColor = (255, 255, 255) if self.player.canAddArmor() else (149, 129, 115) buttonSprite = 'assets/ui/button.png' if self.player.canAddArmor() else 'assets/ui/button_disable.png' armorCost = self.player.getArmorCost() buttonText = 'ARMOR('+str(armorCost)+'C)' if self.player.armor < self.player.MAX_ARMOR else 'MAX ARMOR' self.drawButton(view, buttonText, 65, 618, buttonSprite, textColor) def drawPlayerInfo(self, view): #heal Poins lifePercent = self.getPercentPoints(self.player.health, self.player.healthMax, 460) pygame.draw.rect(view, (255,0,0), (50, 405, lifePercent, 49)) #heal GUI displayImage(view, 'assets/ui/hp_bar.png', 30, 405) #experience points expPercent = self.getPercentPoints(self.player.level.experience, self.player.level.experienceNextLevel, 336) pygame.draw.rect(view, (255,192,0), (65, 30, expPercent, 10)) #experience GUI displayImage(view, 'assets/ui/experience.png', 10, 10) #level displayTextCentered(view, str(self.player.level.level), 22, 22, width=25, height=25, fontSize=30) #money moneyStrSizes = get_text(str(self.player.money), (255, 255, 255), 45).get_rect() displayText(view, str(self.player.money), (900 - moneyStrSizes.width - 20), 20) displayImage(view, 'assets/ui/coin.png', (900 - moneyStrSizes.width - 78), 15) #round roundStrSizes = get_text(str(self.roundNumber), (255, 255, 255), 45).get_rect() displayText(view, str(self.roundNumber), (900 - roundStrSizes.width - 20), 80) displayImage(view, 'assets/ui/kills.png', (900 - roundStrSizes.width - 78), 75) def drawEnemyLife(self, view): lifePercent = self.getPercentPoints(self.currentEnemy.health, self.currentEnemy.healthMax, 138) pygame.draw.rect(view, (255,0,0), (603, 400, lifePercent, 15)) displayImage(view, 'assets/ui/enemy_hp_bar.png', 600, 400) def drawArrowMenu(self, view): if self.arrowMenuPosition == Position.TOPLEFT: displayImage(view, 'assets/ui/menu_arrow.png', 42, 540) elif self.arrowMenuPosition == Position.TOPRIGHT: displayImage(view, 'assets/ui/menu_arrow.png', 430, 540) elif self.arrowMenuPosition == Position.BOTTOMLEFT: displayImage(view, 'assets/ui/menu_arrow.png', 42, 628) elif self.arrowMenuPosition == Position.BOTTOMRIGHT: displayImage(view, 'assets/ui/menu_arrow.png', 430, 628) def drawArmor(self, view): if self.player.armor > 0: displayImage(view, 'assets/ui/armor.png', 480, 350) if self.player.armor > 1: displayImage(view, 'assets/ui/armor.png', 428, 350) if self.player.armor > 2: displayImage(view, 'assets/ui/armor.png', 376, 350) if self.player.armor > 3: displayImage(view, 'assets/ui/armor.png', 324, 350) if self.player.armor > 4: displayImage(view, 'assets/ui/armor.png', 272, 350) def getPercentPoints(self, points, maxPoints, maxPercent): if points <= 0: return 0 else: points = (points*maxPercent)/maxPoints return int(points) def nextRound(self): self.roundNumber += 1 self.player.money += self.currentEnemy.moneyWhenDying self.player.level.addExperience(self.currentEnemy.experienceWhenDying) self.setCurrentEnemy() def setCurrentEnemy(self): if self.roundNumber % 10 == 0: self.currentEnemy = self.getBossEnemy() else: self.currentEnemy = self.getRandomRegularEnemy() self.currentEnemy.upgradeStatsAcordingLevel(self.roundNumber) def getRandomRegularEnemy(self): randomIndex = random.randint(0, len(self.enemies)-1) enemy = self.enemies[randomIndex] return enemy def getBossEnemy(self): enemy = self.boss return enemy
class Game: def __init__(self): pyxel.init(256, 150, caption='Corong', fps=60) self.virus = Virus() self.state = STATES['0'] self.player1 = Player('p1') self.player2 = Player('p2') self.score = Score(self.player1, self.player2) pyxel.load('assets/sprites.pyxres') pyxel.run(self.update, self.draw) def update(self): self.player1.update() self.player2.update() self.virus.update() self.check_state() self.check_screen_border() if self.virus.speed_x > 0: if self.check_colision(self.player2): self.virus.update_speed(self.player2) elif self.virus.speed_x < 0: if self.check_colision(self.player1): self.virus.update_speed(self.player1) def draw(self): pyxel.cls(0) self.player1.draw() self.player2.draw() self.virus.draw() self.score.draw() def check_state(self): if self.state == STATES['0']: if pyxel.btn(pyxel.KEY_SPACE): self.set_state('1') def check_screen_border(self): virus = self.virus if virus.pos_y <= 0 or virus.pos_y >= pyxel.height - virus.height: virus.invert_speed_y_direction() elif virus.pos_x <= 0: self.score.increase_score(self.player2) self.set_state('0') elif virus.pos_x >= pyxel.width - virus.width: self.score.increase_score(self.player1) self.set_state('0') def check_colision(self, player): for s_hbox in player.syringe.hitbox: if player.name == 'p1': v_hitbox = self.virus.hitbox[0] if v_hitbox[0] > float(s_hbox[0]): continue elif player.name == 'p2': v_hitbox = self.virus.hitbox[1] if v_hitbox[0] < float(s_hbox[0]): continue for v_hb in range(round(v_hitbox[1][0]), round(v_hitbox[1][1])): if s_hbox[1][0] <= v_hb <= s_hbox[1][1]: return True return False def set_state(self, state): self.state = STATES[state] if state == '0': self.virus = Virus() elif state == '1': player = self.score.last_to_score or random.choice( [self.player1, self.player2]) self.virus.throw_virus(player)
class Game(): """ TODO: Сделать так, чтобы pygame и прочие запускались из папки lib Это экземпляр класса, в конструкторе которого будет запускаться игра """ def __init__(self): self.WIDTHSCREEN = WIDTHSCREEN self.HEIGHTSCREEN = HEIGHTSCREEN #переменные фокуса self.focus = GVector() #зазор для фокуса self.focusMargin = int(self.HEIGHTSCREEN / 4) self.MAINCOLOR = hexToTuple('B6F788') self.fps = 60 self.fpsClock = pygame.time.Clock() self.player = Player(self.WIDTHSCREEN / 2, self.HEIGHTSCREEN / 2, self.focus) #добавляем подложки self.pods = [] for i in [-1, 0, 1]: for j in [0, -1, 1]: self.pods.append( Pod(i * self.WIDTHSCREEN, j * self.HEIGHTSCREEN, self.WIDTHSCREEN, self.HEIGHTSCREEN, self.focus)) self.objects = {'player': [self.player], 'pods': self.pods} self.run() def drawWorld(self): """ Вот эта вот замечательная функция будет отрисовывать мир. По идее, она должна выполняться отдельным потоком, или с помощью модуля acyncio""" self.screen.fill(self.MAINCOLOR) #рисуем подложку for obj in self.objects['pods']: obj.draw(self.screen) #рисуем игрока self.player.draw(self.screen) pygame.display.update() def moveWorld(self, dt): """ Все действия, связаанные с изменением параметров мира делаются в этой функции. Так же, выполняется с помощью потоков или asyncio""" #self.player.move(dt) for key in self.objects: for obj in self.objects[key]: obj.move(dt) def run(self): pygame.init() self.screen = pygame.display.set_mode( (self.WIDTHSCREEN, self.HEIGHTSCREEN), 0, 32) self.running = True dt = 0 #обрабатываем события while self.running: self.moveWorld(dt) #пересчитываем фокус px, py = self.player.initPoint.get() if px < self.focus[0] + self.focusMargin: self.focus[0] = px - self.focusMargin if px > self.focus[0] + self.WIDTHSCREEN - self.focusMargin: self.focus[0] = px - self.WIDTHSCREEN + self.focusMargin if py < self.focus[1] + self.focusMargin: self.focus[1] = py - self.focusMargin if py > self.focus[1] + self.HEIGHTSCREEN - self.focusMargin: self.focus[1] = py - self.HEIGHTSCREEN + self.focusMargin self.drawWorld() #<- пока тут, потом в поток занесу pressedKeys = pygame.key.get_pressed() #вперед if ((pressedKeys[K_UP] or pressedKeys[K_w]) and not (pressedKeys[K_DOWN] or pressedKeys[K_s])): self.player.goUp() #наэад elif ((pressedKeys[K_DOWN] or pressedKeys[K_s]) and not (pressedKeys[K_UP] or pressedKeys[K_w])): self.player.goDown() #направо if ((pressedKeys[K_RIGHT] or pressedKeys[K_d]) and not (pressedKeys[K_LEFT] or pressedKeys[K_a])): self.player.goRight() #налево if ((pressedKeys[K_LEFT] or pressedKeys[K_a]) and not (pressedKeys[K_RIGHT] or pressedKeys[K_d])): self.player.goLeft() #выход из игры if pressedKeys[K_ESCAPE]: self.running = False for event in pygame.event.get(): if event.type == QUIT: #выходим по нажатию на крестик self.running = False # elif event.type==KEYDOWN: # if (event.key==K_UP or event.key==K_w): # self.player.goUp() # elif event.key==K_ESCAPE: # self.running = False #обработали--- dt = (self.fpsClock.tick(self.fps)) / 1000 exit()
#scoreboard = ScoreBoard(gamearea) #map.addenemygroup(ScobotGroup(1000,300,5)) #colidegroup = pygame.sprite.Group(collidable) #group containing player and platforms #platformsandplayer = pygame.sprite.Group(platform1, platform2, ship) #enemies sprite group #enemies = pygame.sprite.Group(alien1) #shootLoop = 0 #bullets = [] run = True totalscore = 0 xoffset = ship.calculatexoffset(screen,gamearea) yoffset = ship.calculateyoffset(screen,gamearea) win.blit(view, (0,0)) ship.draw(win) #mainloop #testcount = 0 while run: clock.tick(27) #testcount += 1 #print("Running",testcount) for event in pygame.event.get(): if event.type == pygame.QUIT: run = False keys = pygame.key.get_pressed()