diff --git a/character.py b/character.py index 6cb840f..e6e79c3 100644 --- a/character.py +++ b/character.py @@ -2,6 +2,7 @@ from common_class import Position from weapons import RPG7 + class Team: def __init__(self, id, nb_viking): self.id = id @@ -11,25 +12,32 @@ def __init__(self, id, nb_viking): class Viking: - def __init__(self, id, name="", health=100, image_path="", flipped=False): - self.falling = False + def __init__(self, id, name="", health=100, image_path="", flipped=False, speed_x=10): self.id = id self.name = name self.health = health - self.position = Position(0, 0) + + self.position = Position(0, 0, speed_x=speed_x) self.flipped = flipped self.jumping = False - self.isMoving = False + self.falling = False + self.there_was_ground = False self.jump_height = 100 self.jump_velocity = 0 - self.initialY = 0 + self.initial_y = 0 + + self.gravity = GRAVITY + self.initial_time = 0 + + self.rpg7 = RPG7(self.position.x - 10, self.position.y - 30) self.rpg7_visible = False - self.raw_image = pygame.image.load(image_path) - self.image = pygame.transform.scale(self.raw_image, (int(self.raw_image.get_width() * SCALE_VIKING), int(self.raw_image.get_height() * SCALE_VIKING))) + + self.original_image = pygame.image.load(image_path) + self.image = pygame.transform.scale(self.original_image, + (int(self.original_image.get_width() * SCALE_VIKING), int(self.original_image.get_height() * SCALE_VIKING))) self.image = pygame.transform.flip(self.image, True, False) if self.flipped else self.image self.rect = self.image.get_rect() - def draw(self): screen.blit(self.image, (self.position.x, self.position.y - self.rect.height)) @@ -50,15 +58,15 @@ def capXandY(self): self.position.y = 1 self.health = 0 # - def doMath(self, map): # not meth + + def doMath(self, map): # not meth self.capXandY() # falling calculations - if map[int(self.position.x + int(self.rect.width/2))][int(self.position.y+1)] == 0 and not self.jumping: + if map[int(self.position.x + int(self.rect.width / 2))][int(self.position.y + 1)] == 0 and not self.jumping: if not self.falling: - print('start falling') self.setupFalling(self.position.y) - time = (pygame.time.get_ticks() - self.initialTime) / 1000 - self.position.y = int((-0.5 * self.gravity) * (time * time) + (self.position.y * time) + self.initialY) + time = (pygame.time.get_ticks() - self.initial_time) / 1000 + self.position.y = int((-0.5 * self.gravity) * (time * time) + (self.position.y * time) + self.initial_y) # self.capXandY() # go above the ground @@ -67,88 +75,65 @@ def doMath(self, map): # not meth # self.capXandY() # stop the fall - if map[int(self.position.x + int(self.rect.width / 2))][int(self.position.y + 1)] == 1 and self.falling and not self.jumping: + if map[int(self.position.x + int(self.rect.width / 2))][ + int(self.position.y + 1)] == 1 and self.falling and not self.jumping: self.falling = False - print('stop falling') - - def setupFalling(self, initialY): + def setupFalling(self, initial_y): self.falling = True self.gravity = GRAVITY - self.initialY = initialY - self.initialTime = pygame.time.get_ticks() - - # def shoot(self): - # if self.stock_rocket > 0: - # self.stock_rocket -= 1 - # else: - # print(f"{self.name} has no rocket") - - # def takeDamage(self, damage): - # self.health -= damage - # if self.health <= 0: - # print(f"{self.name} died") - # else: - # print(f"{self.name} has lost {damage} health") - - # def reload(self): - # self.stock_rocket = 5 + self.initial_y = initial_y + self.initial_time = pygame.time.get_ticks() def getFlipped(self, flipped): self.flipped = flipped self.image = pygame.transform.flip(self.image, True, False) - def move(self, key, delta_time, timer, bitMap, rocketSelected): + def move(self, key, delta_time, timer, bit_map, rocket_selected): left_movement = key[pygame.K_q] right_movement = key[pygame.K_d] - take_rpg = key[pygame.K_UP] - - self.isMoving = False - speed_x = self.position.speed_x if not timer <= 0: if left_movement: - self.position.x -= speed_x * delta_time - self.isMoving: True + self.position.x -= self.position.speed_x * delta_time if self.flipped: self.getFlipped(False) + self.rpg7.getFlipped(False) if right_movement: - self.position.x += speed_x * delta_time - self.isMoving: True + self.position.x += self.position.speed_x * delta_time if not self.flipped: self.getFlipped(True) + self.rpg7.getFlipped(True) if key[pygame.K_SPACE] and not self.jumping and not self.falling: - self.isMoving: True - print(self.falling) - print('start jumping') self.setupJump(self.position.y, -50) if self.jumping: - self.isMoving: True - time = (pygame.time.get_ticks() - self.initialTime)/100 - self.position.y = int((-0.5 * self.gravity) * (time * time) + (self.jump_velocity * time) + self.initialY) - if not int(self.position.x + self.image.get_width()/2) >= int(SCREEN_WIDTH/TILE_SIZE)-1 and not int(self.position.x + self.image.get_width()/2) < 0 and not int(self.position.y+2) >= int(SCREEN_HEIGHT/TILE_SIZE)-1 and not bitMap[int(self.position.x + self.image.get_width()/2)][int(self.position.y+2)] == 1: - self.thereWasGround = False - - - if not self.position.y > int(SCREEN_HEIGHT/TILE_SIZE) and not self.position.y < 0 and not self.thereWasGround: - if bitMap[int(self.position.x + self.image.get_width()/2)][int(self.position.y+2)] == 1: - print('stop jumping') + time = (pygame.time.get_ticks() - self.initial_time) / 100 + self.position.y = int((-0.5 * self.gravity) * (time * time) + (self.jump_velocity * time) + self.initial_y) + if not int(self.position.x + self.image.get_width() / 2) >= int(SCREEN_WIDTH / TILE_SIZE) - 1 and not int( + self.position.x + self.image.get_width() / 2) < 0 and not int(self.position.y + 2) >= int( + SCREEN_HEIGHT / TILE_SIZE) - 1 and not bit_map[int(self.position.x + self.image.get_width() / 2)][ + int(self.position.y + 2)] == 1: + self.there_was_ground = False + + if not self.position.y > int( + SCREEN_HEIGHT / TILE_SIZE) and not self.position.y < 0 and not self.there_was_ground: + if bit_map[int(self.position.x + self.image.get_width() / 2)][int(self.position.y + 2)] == 1: self.jumping = False - if rocketSelected: + if rocket_selected: self.draw_RPG7() def draw_RPG7(self): - LaunchRPG7 = RPG7(self.position.x, self.position.y-40) - LaunchRPG7.draw() + self.rpg7.position.x = self.position.x - 10 + self.rpg7.position.y = self.position.y - 30 + self.rpg7.draw() - def setupJump(self, initialY, jump_velocity): - self.thereWasGround = True + def setupJump(self, initial_y, jump_velocity): + self.there_was_ground = True self.jumping = True - self.initialY = initialY - self.initialTime = pygame.time.get_ticks() + self.initial_y = initial_y + self.initial_time = pygame.time.get_ticks() self.gravity = GRAVITY self.jump_velocity = jump_velocity - diff --git a/images/asset/sky_win.png b/images/asset/sky_win.png new file mode 100644 index 0000000..d4fc1c5 Binary files /dev/null and b/images/asset/sky_win.png differ diff --git a/images/asset/title_screen.png b/images/asset/title_screen.png new file mode 100644 index 0000000..626a180 Binary files /dev/null and b/images/asset/title_screen.png differ diff --git a/main.py b/main.py index b800c4d..1017535 100644 --- a/main.py +++ b/main.py @@ -3,115 +3,24 @@ from setting import * from terrain_generation import genWorldDestructible, drawDestructibleWorldFullOptimized from character import Team -from weapons import Rocket, Grenade, get_angle - - -def loadMainMenu(teams, vikings): - running_menu = True - - up_pressed = False - down_pressed = False - right_pressed = False - left_pressed = False - - opacity_up = True - opacity = 0 - while running_menu: - - if opacity_up and opacity < 1: - opacity += 0.005 - elif not opacity_up and opacity > 0: - opacity -= 0.005 - elif opacity_up and opacity >= 1: - opacity = 1 - opacity_up = False - elif not opacity_up and opacity <= 0: - opacity = 0 - opacity_up = True - - screen.blit(SKY_BG_MENU, SKY_BG_MENU.get_rect()) - - font = pygame.font.SysFont('', 70) - - line1 = font.render(f"équipes: {teams} ", True, Colors.BLACK) - line2 = font.render(f"vikings par équipes: {vikings} ", True, Colors.BLACK) - line3 = font.render('Appuyez sur ENTRER pour commencer', True, - (Colors.WHITE[0] * opacity, Colors.WHITE[1] * opacity, Colors.WHITE[2] * opacity)) - - screen.blit(line1, - ((SCREEN_WIDTH / 2) - (line1.get_width() / 2) - 50, (SCREEN_HEIGHT / 2) - (line1.get_height()))) - screen.blit(UP_ARROW, - ((SCREEN_WIDTH / 2) + (line1.get_width() / 2), (SCREEN_HEIGHT / 2) - (line1.get_height() * 1.5))) - screen.blit(DOWN_ARROW, - ((SCREEN_WIDTH / 2) + (line1.get_width() / 2), (SCREEN_HEIGHT / 2) - (line1.get_height() / 1.5))) - - screen.blit(line2, ((SCREEN_WIDTH / 2) - (line2.get_width() / 2), (SCREEN_HEIGHT / 2) + (line2.get_height()))) - screen.blit(LEFT_ARROW, - ((SCREEN_WIDTH / 2) + (line2.get_width() / 2), (SCREEN_HEIGHT / 2) + (line2.get_height()))) - screen.blit(RIGHT_ARROW, - ((SCREEN_WIDTH / 2) + (line2.get_width() / 2) + 50, (SCREEN_HEIGHT / 2) + (line2.get_height()))) - - screen.blit(line3, - ((SCREEN_WIDTH / 2) - (line3.get_width() / 2), (SCREEN_HEIGHT / 2) + (line3.get_height() * 3))) - - key = pygame.key.get_pressed() - - # Team Selection - if key[pygame.K_UP] and not up_pressed: - up_pressed = True - teams += 1 - if teams > MAX_TEAMS: - teams = MAX_TEAMS - elif key[pygame.K_DOWN] and not down_pressed: - down_pressed = True - teams -= 1 - if teams < 2: - teams = 2 - if not key[pygame.K_UP]: - up_pressed = False - if not key[pygame.K_DOWN]: - down_pressed = False - - # Viking Selection - if key[pygame.K_RIGHT] and not right_pressed: - right_pressed = True - vikings += 1 - if vikings > MAX_VIKINGS_PER_TEAM: - vikings = MAX_VIKINGS_PER_TEAM - elif key[pygame.K_LEFT] and not left_pressed: - left_pressed = True - vikings -= 1 - if vikings < 1: - vikings = 1 - if not key[pygame.K_RIGHT]: - right_pressed = False - if not key[pygame.K_LEFT]: - left_pressed = False - - if key[pygame.K_RETURN]: - running_menu = False - - for event in pygame.event.get(): - if event.type == pygame.QUIT: - pygame.quit() - pygame.display.update() - return teams, vikings +from weapons import Rocket, Grenade, getAngle +from menu import titleScreen, loadMainMenu, winScreen def createTeams(teams, vikings): all_teams = [] + for i in range(teams): team = Team(i, vikings) - for j in range(vikings): - team.vikings[j].position.y = 500 all_teams.append(team) return all_teams def placeVikings(teams): min_distance_between_players = 50 - occupied_positions = [] + low_number_viking = False + failed_pos = 0 all_vikings = [] @@ -119,39 +28,51 @@ def placeVikings(teams): for viking in team.vikings: all_vikings.append(viking) + if len(all_vikings) <= 4: + low_number_viking = True + for viking in all_vikings: while True: player_x = random.randint(0, SCREEN_WIDTH - viking.rect.width) + player_y = 500 valid_position = True for pos in occupied_positions: if abs(player_x - pos) < min_distance_between_players: valid_position = False - break + failed_pos = failed_pos + 1 + if failed_pos > 50: + valid_position = True if valid_position: + failed_pos = 0 + if low_number_viking: + viking.position.speed_x = 40 player_x = min(player_x, SCREEN_WIDTH - viking.rect.width) occupied_positions.append(player_x) viking.position.x = player_x + viking.position.y = player_y + break if random.choice([True, False]): viking.getFlipped(True) + viking.rpg7.getFlipped(True) -def perforateBitMap(center, bitMap): +def perforateBitMap(center, bit_map): for i in range(EXPLOSION_RADIUS): - bresenham_circle(center[0] + PERFORATION_OFFSET, center[1], i, bitMap) - bresenham_circle(center[0] - PERFORATION_OFFSET, center[1], i, bitMap) - bresenham_circle(center[0], center[1] + PERFORATION_OFFSET, i, bitMap) - bresenham_circle(center[0], center[1] - PERFORATION_OFFSET, i, bitMap) - bresenham_circle(center[0] - PERFORATION_OFFSET, center[1] - PERFORATION_OFFSET, i, bitMap) - bresenham_circle(center[0] + PERFORATION_OFFSET, center[1] + PERFORATION_OFFSET, i, bitMap) - bresenham_circle(center[0] - PERFORATION_OFFSET, center[1] + PERFORATION_OFFSET, i, bitMap) - bresenham_circle(center[0] + PERFORATION_OFFSET, center[1] - PERFORATION_OFFSET, i, bitMap) - bresenham_circle(center[0], center[1], i, bitMap) - - -def bresenham_circle(x0, y0, radius, bitMap): + bresenhamCircle(center[0] + PERFORATION_OFFSET, center[1], i, bit_map) + bresenhamCircle(center[0] - PERFORATION_OFFSET, center[1], i, bit_map) + bresenhamCircle(center[0], center[1] + PERFORATION_OFFSET, i, bit_map) + bresenhamCircle(center[0], center[1] - PERFORATION_OFFSET, i, bit_map) + bresenhamCircle(center[0] - PERFORATION_OFFSET, center[1] - PERFORATION_OFFSET, i, bit_map) + bresenhamCircle(center[0] + PERFORATION_OFFSET, center[1] + PERFORATION_OFFSET, i, bit_map) + bresenhamCircle(center[0] - PERFORATION_OFFSET, center[1] + PERFORATION_OFFSET, i, bit_map) + bresenhamCircle(center[0] + PERFORATION_OFFSET, center[1] - PERFORATION_OFFSET, i, bit_map) + bresenhamCircle(center[0], center[1], i, bit_map) + + +def bresenhamCircle(x0, y0, radius, bit_map): x = radius y = 0 err = 0 @@ -159,28 +80,28 @@ def bresenham_circle(x0, y0, radius, bitMap): while x >= y: if not x0 + x < 0 and not x0 + x >= int(SCREEN_WIDTH / TILE_SIZE) and not y0 + y < 0 and not y0 + y >= int( SCREEN_HEIGHT / TILE_SIZE): - bitMap[int(x0 + x)][int(y0 + y)] = 0 + bit_map[int(x0 + x)][int(y0 + y)] = 0 if not x0 + y < 0 and not x0 + y >= int(SCREEN_WIDTH / TILE_SIZE) and not y0 + x < 0 and not y0 + x >= int( SCREEN_HEIGHT / TILE_SIZE): - bitMap[int(x0 + y)][int(y0 + x)] = 0 + bit_map[int(x0 + y)][int(y0 + x)] = 0 if not x0 - y < 0 and not x0 - y >= int(SCREEN_WIDTH / TILE_SIZE) and not y0 + x < 0 and not y0 + x >= int( SCREEN_HEIGHT / TILE_SIZE): - bitMap[int(x0 - y)][int(y0 + x)] = 0 + bit_map[int(x0 - y)][int(y0 + x)] = 0 if not x0 - x < 0 and not x0 - x >= int(SCREEN_WIDTH / TILE_SIZE) and not y0 + y < 0 and not y0 + y >= int( SCREEN_HEIGHT / TILE_SIZE): - bitMap[int(x0 - x)][int(y0 + y)] = 0 + bit_map[int(x0 - x)][int(y0 + y)] = 0 if not x0 - x < 0 and not x0 - x >= int(SCREEN_WIDTH / TILE_SIZE) and not y0 - y < 0 and not y0 - y >= int( SCREEN_HEIGHT / TILE_SIZE): - bitMap[int(x0 - x)][int(y0 - y)] = 0 + bit_map[int(x0 - x)][int(y0 - y)] = 0 if not x0 - y < 0 and not x0 - y >= int(SCREEN_WIDTH / TILE_SIZE) and not y0 - x < 0 and not y0 - x >= int( SCREEN_HEIGHT / TILE_SIZE): - bitMap[int(x0 - y)][int(y0 - x)] = 0 + bit_map[int(x0 - y)][int(y0 - x)] = 0 if not x0 + y < 0 and not x0 + y >= int(SCREEN_WIDTH / TILE_SIZE) and not y0 - x < 0 and not y0 - x >= int( SCREEN_HEIGHT / TILE_SIZE): - bitMap[int(x0 + y)][int(y0 - x)] = 0 + bit_map[int(x0 + y)][int(y0 - x)] = 0 if not x0 + x < 0 and not x0 + x >= int(SCREEN_WIDTH / TILE_SIZE) and not y0 - x < 0 and not y0 - x >= int( SCREEN_HEIGHT / TILE_SIZE): - bitMap[int(x0 + x)][int(y0 - x)] = 0 + bit_map[int(x0 + x)][int(y0 - x)] = 0 y += 1 err += 1 + 2 * y @@ -189,227 +110,198 @@ def bresenham_circle(x0, y0, radius, bitMap): err += 1 - 2 * x -def explosion(teams, weapon, holesCoordinates): +def explosion(holes_coordinates, weapon, teams, map): perforateBitMap((weapon.position.x, weapon.position.y), map) - holesCoordinates.append((weapon.position.x, weapon.position.y)) + holes_coordinates.append((weapon.position.x, weapon.position.y)) for vikings2 in teams: for viking2 in vikings2.vikings: - if abs(viking2.position.x - weapon.position.x) < (EXPLOSION_RADIUS + PERFORATION_OFFSET) and abs( - viking2.position.y - weapon.position.y) < EXPLOSION_RADIUS: - viking2.health -= (100 - int( - (abs(viking2.position.x - weapon.position.x) + abs(viking2.position.y - weapon.position.y)) / 2)) - return holesCoordinates + if (abs(viking2.position.x - weapon.position.x) < (EXPLOSION_RADIUS + PERFORATION_OFFSET) and + abs(viking2.position.y - weapon.position.y) < EXPLOSION_RADIUS): + viking2.position.x = viking2.position.x + ((viking2.position.x - weapon.position.x) * 2.5) + viking2.position.y = viking2.position.y + ((viking2.position.y - weapon.position.y) * 2.5) + viking2.health -= abs((weapon.damage - int( + (abs(viking2.position.x - weapon.position.x) + abs( + viking2.position.y - weapon.position.y)) / 2))) + return holes_coordinates def winCheck(number_teams, number_vikings, teams): - lastTeamAlive = None - teamCount = [] + last_team_alive = None + team_count = [] for i in range(number_teams): count = 0 for j in range(number_vikings): if teams[i].vikings[j].health > 0: count += 1 - teamCount.append(count) - teamsLasting = 0 + team_count.append(count) + teams_lasting = 0 for i in range(number_teams): - if teamCount[i] > 0: - teamsLasting += 1 - if teamsLasting == 1: + if team_count[i] > 0: + teams_lasting += 1 + if teams_lasting == 1: for i in range(number_teams): - if teamCount[i] > 0: - lastTeamAlive = teams[i] - return lastTeamAlive - - -def winScreen(team): - runningWinScreen = True - - while runningWinScreen: - screen.fill(Colors.BLACK) - font = pygame.font.SysFont('', 70) - text = font.render("GG Team " + str(team.id + 1), True, Colors.GREEN) - text2 = font.render("Play again ? [SPACE]", True, Colors.GREEN) - text3 = font.render("Stop ? [DEL]", True, Colors.GREEN) - screen.blit(text, - (int(SCREEN_WIDTH / 2) - int(text.get_width() / 2), int(SCREEN_HEIGHT / 2) - text.get_height() * 2)) - screen.blit(text2, (int(SCREEN_WIDTH / 2) - int(text2.get_width() / 2), int(SCREEN_HEIGHT / 2))) - screen.blit(text3, ( - int(SCREEN_WIDTH / 2) - int(text3.get_width() / 2), int(SCREEN_HEIGHT / 2) + text3.get_height() * 2)) - - key = pygame.key.get_pressed() - - if key[pygame.K_SPACE]: - runningWinScreen = False - - for event in pygame.event.get(): - if key[pygame.K_DELETE]: - pygame.quit() - if event.type == pygame.QUIT: - pygame.quit() - pygame.display.update() + if team_count[i] > 0: + last_team_alive = teams[i] + return last_team_alive def loadGame(number_teams, number_vikings): map = genWorldDestructible() polygone_map = drawDestructibleWorldFullOptimized(map) - holesCoordinates = [] + holes_coordinates = [] created_teams = createTeams(number_teams, number_vikings) placeVikings(created_teams) vikings = [viking for team in created_teams for viking in team.vikings] - teamPlaying = 0 + team_playing = 0 - movingStartTime = 0 - timerStarted = False + moving_start_time = 0 + timer_started = False - selectedWorm = 0 + selected_viking = 0 - rightPressed = False - leftPressed = False + right_pressed = False + left_pressed = False if DEBUG_ENABLED: - mouse0Pressed = False + mouse0_pressed = False last_time = pygame.time.get_ticks() running_game = True - rocketSelected = False + rocket_selected = False - rocketLaunched = False - grenadeLaunched = False - aimGrenadeLaunched = False + rocket_launched = False + grenade_launched = False + aim_grenade_launched = False - endRound = False + end_round = False while running_game: - - mousePressed = pygame.mouse.get_pressed(num_buttons=3) - if mousePressed: + mouse_pressed = pygame.mouse.get_pressed(num_buttons=3) + if mouse_pressed: mouse_position = pygame.mouse.get_pos() - angle = get_angle((created_teams[teamPlaying].vikings[selectedWorm].position.x, - created_teams[teamPlaying].vikings[selectedWorm].position.y), mouse_position) - - if mousePressed[0] and not rocketLaunched and not grenadeLaunched and rocketSelected and not endRound: - - rocket = Rocket(created_teams[teamPlaying].vikings[selectedWorm].position.x, - created_teams[teamPlaying].vikings[selectedWorm].position.y - - created_teams[teamPlaying].vikings[selectedWorm].image.get_height(), angle + 180, - 20, 9.8, 2, 0.75) - rocketLaunched = True - - elif mousePressed[0] and not rocketLaunched and not grenadeLaunched and not rocketSelected and not endRound: - grenade = Grenade(created_teams[teamPlaying].vikings[selectedWorm].position.x, - created_teams[teamPlaying].vikings[selectedWorm].position.y + 10 - - created_teams[teamPlaying].vikings[selectedWorm].image.get_height(), angle + 180, - abs(created_teams[teamPlaying].vikings[selectedWorm].position.x - mouse_position[0]), - abs(created_teams[teamPlaying].vikings[selectedWorm].position.y - mouse_position[1])) - grenadeLaunched = True - - if mousePressed[2] and not grenadeLaunched and not rocketLaunched and not rocketSelected: - fakeGrenade = Grenade(created_teams[teamPlaying].vikings[selectedWorm].position.x, - created_teams[teamPlaying].vikings[selectedWorm].position.y + 10 - - created_teams[teamPlaying].vikings[selectedWorm].image.get_height(), angle + 180, - abs(created_teams[teamPlaying].vikings[selectedWorm].position.x - mouse_position[0]), - abs(created_teams[teamPlaying].vikings[selectedWorm].position.y - mouse_position[1])) - aimGrenadeLaunched = True + angle = getAngle((created_teams[team_playing].vikings[selected_viking].position.x, + created_teams[team_playing].vikings[selected_viking].position.y), mouse_position) + + if mouse_pressed[0] and not rocket_launched and not grenade_launched and rocket_selected and not end_round: + rocket = Rocket(created_teams[team_playing].vikings[selected_viking].position.x, + created_teams[team_playing].vikings[selected_viking].position.y - + created_teams[team_playing].vikings[selected_viking].image.get_height(), + angle + 180) + + if angle < 75 or angle > 270: + if not created_teams[team_playing].vikings[selected_viking].flipped: + created_teams[team_playing].vikings[selected_viking].getFlipped(True) + created_teams[team_playing].vikings[selected_viking].rpg7.getFlipped(True) + rocket.getFlipped(True) + elif created_teams[team_playing].vikings[selected_viking].flipped: + created_teams[team_playing].vikings[selected_viking].getFlipped(False) + created_teams[team_playing].vikings[selected_viking].rpg7.getFlipped(False) + rocket_launched = True + + elif mouse_pressed[ + 0] and not rocket_launched and not grenade_launched and not rocket_selected and not end_round: + grenade = Grenade(created_teams[team_playing].vikings[selected_viking].position.x, + created_teams[team_playing].vikings[selected_viking].position.y + 10 - + created_teams[team_playing].vikings[selected_viking].image.get_height(), angle, + abs(created_teams[team_playing].vikings[selected_viking].position.x - mouse_position[ + 0]), + abs(created_teams[team_playing].vikings[selected_viking].position.y - mouse_position[ + 1])) + grenade_launched = True + + if mouse_pressed[2] and not grenade_launched and not rocket_launched and not rocket_selected: + fake_grenade = Grenade(created_teams[team_playing].vikings[selected_viking].position.x, + created_teams[team_playing].vikings[selected_viking].position.y + 10 - + created_teams[team_playing].vikings[selected_viking].image.get_height(), angle, + abs(created_teams[team_playing].vikings[selected_viking].position.x - + mouse_position[0]), + abs(created_teams[team_playing].vikings[selected_viking].position.y - + mouse_position[1])) + aim_grenade_launched = True # screen.blit(SKY_BG, SKY_BG.get_rect()) screen.fill(Colors.SKY_BLUE) pygame.draw.polygon(screen, TERRAIN_COLOR, polygone_map) # draw holes - for hole in holesCoordinates: + for hole in holes_coordinates: pygame.draw.circle(screen, Colors.SKY_BLUE, hole, EXPLOSION_RADIUS + PERFORATION_OFFSET) # debug mode to create holes with mouse left click if DEBUG_ENABLED: - mousePressed = pygame.mouse.get_pressed(num_buttons=3) - if mousePressed[2] and not mouse0Pressed: - mouse0Pressed = True - mouseCoordinates = pygame.mouse.get_pos() - holesCoordinates.append(mouseCoordinates) - perforateBitMap(mouseCoordinates, map) - if not mousePressed[2] and mouse0Pressed: - mouse0Pressed = False + mouse_pressed = pygame.mouse.get_pressed(num_buttons=3) + if mouse_pressed[2] and not mouse0_pressed: + mouse0_pressed = True + mouse_coordinates = pygame.mouse.get_pos() + holes_coordinates.append(mouse_coordinates) + perforateBitMap(mouse_coordinates, map) + if not mouse_pressed[2] and mouse0_pressed: + mouse0_pressed = False # clock update and fps counter clock.tick() - font = pygame.font.SysFont('', 70) + font = pygame.font.SysFont('Tahoma', 50, bold=True) fps_text = font.render(str(int(clock.get_fps())), True, Colors.GREEN) - screen.blit(fps_text, (0, 0)) + screen.blit(fps_text, (10, 5)) current_time = pygame.time.get_ticks() delta_time = (current_time - last_time) / 1000.0 last_time = current_time - if rocketLaunched: + if rocket_launched: rocket.update(delta_time, map) rocket.draw() if rocket.exploded: - perforateBitMap((rocket.x, rocket.y), map) - holesCoordinates.append((rocket.x, rocket.y)) - for vikings2 in created_teams: - for viking2 in vikings2.vikings: - if abs(viking2.position.x - rocket.x) < ( - EXPLOSION_RADIUS + PERFORATION_OFFSET) and abs( - viking2.position.y - rocket.y) < EXPLOSION_RADIUS: - viking2.position.x = viking2.position.x + ((viking2.position.x - rocket.x) * 2.5) - viking2.position.y = viking2.position.y + ((viking2.position.y - rocket.y) * 2.5) - print(str(abs(viking2.position.x - rocket.x)) + ' ' + str( - abs(viking2.position.y - rocket.y))) - print(str((abs(viking2.position.x - rocket.x) + abs( - viking2.position.y - rocket.y)) / 2)) - viking2.health -= (100 - int( - (abs(viking2.position.x - rocket.x) + abs( - viking2.position.y - rocket.y)) / 2)) - - rocketLaunched = False + holes_coordinates = explosion(holes_coordinates, rocket, created_teams, map) + rocket_launched = False rocket = None - endRound = True - - if aimGrenadeLaunched: - fakeGrenade.start_preview_trajectory() - fakeGrenade.calculate_trajectory(map) - fakeGrenade.draw() - - if grenadeLaunched: - if aimGrenadeLaunched: - fakeGrenade.stop_preview_trajectory() - fakeGrenade = None - aimGrenadeLaunched = False + end_round = True + + if aim_grenade_launched: + fake_grenade.startPreviewTrajectory() + fake_grenade.calculateTrajectory(map) + fake_grenade.draw() + if ((not (created_teams[team_playing].vikings[selected_viking].position.x == fake_grenade.position.x)) or + (not ((created_teams[team_playing].vikings[ + selected_viking].position.y == fake_grenade.position.y + 35)))): + fake_grenade.stopPreviewTrajectory() + fake_grenade = None + aim_grenade_launched = False + + if grenade_launched: + if aim_grenade_launched: + fake_grenade.stopPreviewTrajectory() + fake_grenade = None + aim_grenade_launched = False grenade.update(map) grenade.draw() if grenade.exploded: - perforateBitMap((grenade.position.x, grenade.position.y), map) - holesCoordinates.append((grenade.position.x, grenade.position.y)) - for vikings2 in created_teams: - for viking2 in vikings2.vikings: - if abs(viking2.position.x - grenade.position.x) < (EXPLOSION_RADIUS + PERFORATION_OFFSET) and abs( - viking2.position.y - grenade.position.y) < EXPLOSION_RADIUS: - viking2.position.x = viking2.position.x + ((viking2.position.x - grenade.position.x) * 1.5) - viking2.position.y = viking2.position.y + ((viking2.position.y - grenade.position.y) * 1.5) - print(str(abs(viking2.position.x - grenade.position.x)) + ' ' + str(abs(viking2.position.y - grenade.position.y))) - print(str((abs(viking2.position.x - grenade.position.x) + abs(viking2.position.y - grenade.position.y)) / 2)) - viking2.health -= (grenade.damage - int( - (abs(viking2.position.x - grenade.position.x) + abs(viking2.position.y - grenade.position.y)) / 2)) - grenadeLaunched = False + holes_coordinates = explosion(holes_coordinates, grenade, created_teams, map) + grenade_launched = False grenade = None - endRound = True - + end_round = True key = pygame.key.get_pressed() - - if key[pygame.K_UP]: - rocketSelected = True - if key[pygame.K_DOWN]: - rocketSelected = False + GET_RPG_OUT = key[pygame.K_UP] or key[pygame.K_r] + GET_GRENADE_OUT = key[pygame.K_DOWN] or key[pygame.K_f] + + if GET_RPG_OUT: + if aim_grenade_launched: + fake_grenade.stopPreviewTrajectory() + fake_grenade = None + aim_grenade_launched = False + rocket_selected = True + if GET_GRENADE_OUT: + rocket_selected = False if key[pygame.K_DELETE]: - vikings[0].thereWasGround = False + vikings[0].there_was_ground = False vikings[0].jumping = False # check for a winner @@ -419,116 +311,115 @@ def loadGame(number_teams, number_vikings): running_game = False winScreen(win) - if endRound: - endRound = False - timerStarted = False - teamPlaying += 1 - - if teamPlaying > number_teams - 1: - teamPlaying = 0 - oldSelectedWorm = selectedWorm - while created_teams[teamPlaying].vikings[selectedWorm].health <= 0: - selectedWorm += 1 - if selectedWorm > number_vikings - 1: - selectedWorm = 0 - if selectedWorm == oldSelectedWorm: - teamPlaying += 1 - if teamPlaying > number_teams - 1: - teamPlaying = 0 - nbVikingsOK = 0 - while nbVikingsOK == 0: - for eVikings in created_teams[teamPlaying].vikings: - if eVikings.health > 0: - nbVikingsOK += 1 - if nbVikingsOK == 0: - teamPlaying += 1 - if teamPlaying > number_teams - 1: - teamPlaying = 0 - # + if end_round: + end_round = False + timer_started = False + team_playing += 1 + + if team_playing > number_teams - 1: + team_playing = 0 + old_selected_viking = selected_viking + while created_teams[team_playing].vikings[selected_viking].health <= 0: + selected_viking += 1 + if selected_viking > number_vikings - 1: + selected_viking = 0 + if selected_viking == old_selected_viking: + team_playing += 1 + if team_playing > number_teams - 1: + team_playing = 0 + nb_vikings_ok = 0 + while nb_vikings_ok == 0: + for e_vikings in created_teams[team_playing].vikings: + if e_vikings.health > 0: + nb_vikings_ok += 1 + if nb_vikings_ok == 0: + team_playing += 1 + if team_playing > number_teams - 1: + team_playing = 0 # handle timer - if (key[pygame.K_q] or key[pygame.K_d] or key[pygame.K_z] or key[pygame.K_SPACE] or mousePressed[1] or mousePressed[2]) and not timerStarted: - timerStarted = True - movingStartTime = pygame.time.get_ticks() - - - remainingTime = MOVING_TIME - if timerStarted: - remainingTime = MOVING_TIME - ((pygame.time.get_ticks() - movingStartTime) / 1000) - if remainingTime <= 0: - remainingTime = 0 - endRound = True - if rocketLaunched or grenadeLaunched: - remainingTime = 0 - timerText = font.render(str(int(remainingTime)), True, Colors.BLUE) - screen.blit(timerText, (SCREEN_WIDTH - timerText.get_width(), 0)) - - if not timerStarted and (not rightPressed or not leftPressed) and (key[pygame.K_RIGHT] or key[pygame.K_LEFT]): - if not rightPressed and key[pygame.K_RIGHT]: - rightPressed = True - selectedWorm += 1 - if selectedWorm > number_vikings - 1: - selectedWorm = 0 - oldSelectedWorm = selectedWorm - while created_teams[teamPlaying].vikings[selectedWorm].health <= 0: - selectedWorm += 1 - if selectedWorm > number_vikings - 1: - selectedWorm = 0 - if selectedWorm == oldSelectedWorm: - teamPlaying += 1 - if teamPlaying > number_teams - 1: - teamPlaying = 0 - if not leftPressed and key[pygame.K_LEFT]: - leftPressed = True - selectedWorm -= 1 - if selectedWorm < 0: - selectedWorm = number_vikings - 1 - oldSelectedWorm = selectedWorm - while created_teams[teamPlaying].vikings[selectedWorm].health <= 0: - selectedWorm -= 1 - if selectedWorm < 0: - selectedWorm = number_vikings - 1 - if selectedWorm == oldSelectedWorm: - teamPlaying += 1 - if teamPlaying > number_teams - 1: - teamPlaying = 0 - if not key[pygame.K_RIGHT]: - rightPressed = False - if not key[pygame.K_LEFT]: - leftPressed = False - # - - oldSelectedWorm = selectedWorm - while created_teams[teamPlaying].vikings[selectedWorm].health <= 0: - selectedWorm += 1 - if selectedWorm > number_vikings - 1: - selectedWorm = 0 - if selectedWorm == oldSelectedWorm: - teamPlaying += 1 - if teamPlaying > number_teams - 1: - teamPlaying = 0 - - ### - - hp = font.render(str(created_teams[teamPlaying].vikings[selectedWorm].health), True, Colors.GREEN) - screen.blit(hp, (SCREEN_WIDTH - hp.get_width(), hp.get_height())) - - areTheyFalling = [] + if (key[pygame.K_q] or key[pygame.K_d] or key[pygame.K_z] or key[pygame.K_SPACE] or mouse_pressed[1] or + mouse_pressed[2]) and not timer_started: + timer_started = True + moving_start_time = pygame.time.get_ticks() + + remaining_time = MOVING_TIME + if timer_started: + remaining_time = MOVING_TIME - ((pygame.time.get_ticks() - moving_start_time) / 1000) + if remaining_time <= 0: + remaining_time = 0 + end_round = True + if rocket_launched or grenade_launched: + remaining_time = 0 + timer_text = font.render(str(int(remaining_time)), True, Colors.WHITE) + screen.blit(timer_text, ((SCREEN_WIDTH / 2) - timer_text.get_width(), 5)) + + left_select_viking = key[pygame.K_LEFT] or key[pygame.K_a] + right_select_viking = key[pygame.K_RIGHT] or key[pygame.K_e] + + if (not timer_started and (not right_pressed or not left_pressed) + and (right_select_viking or left_select_viking)): + if not right_pressed and right_select_viking: + right_pressed = True + selected_viking += 1 + if selected_viking > number_vikings - 1: + selected_viking = 0 + old_selected_viking = selected_viking + while created_teams[team_playing].vikings[selected_viking].health <= 0: + selected_viking += 1 + if selected_viking > number_vikings - 1: + selected_viking = 0 + if selected_viking == old_selected_viking: + team_playing += 1 + if team_playing > number_teams - 1: + team_playing = 0 + if not left_pressed and left_select_viking: + left_pressed = True + selected_viking -= 1 + if selected_viking < 0: + selected_viking = number_vikings - 1 + old_selected_viking = selected_viking + while created_teams[team_playing].vikings[selected_viking].health <= 0: + selected_viking -= 1 + if selected_viking < 0: + selected_viking = number_vikings - 1 + if selected_viking == old_selected_viking: + team_playing += 1 + if team_playing > number_teams - 1: + team_playing = 0 + if not right_select_viking: + right_pressed = False + if not left_select_viking: + left_pressed = False + + old_selected_viking = selected_viking + while created_teams[team_playing].vikings[selected_viking].health <= 0: + selected_viking += 1 + if selected_viking > number_vikings - 1: + selected_viking = 0 + if selected_viking == old_selected_viking: + team_playing += 1 + if team_playing > number_teams - 1: + team_playing = 0 + + hp = font.render(str(created_teams[team_playing].vikings[selected_viking].health), True, Colors.RED) + screen.blit(hp, (SCREEN_WIDTH - hp.get_width() - 10, 5)) + + are_they_falling = [] for viking in vikings: - areTheyFalling.append(viking.falling) + are_they_falling.append(viking.falling) if not viking.health <= 0: - created_teams[teamPlaying].vikings[selectedWorm].move(key, delta_time, remainingTime, map, rocketSelected) - if created_teams[teamPlaying].vikings[selectedWorm].isMoving: - grenade.position.x = created_teams[teamPlaying].vikings[selectedWorm].position.x - grenade.position.y = created_teams[teamPlaying].vikings[selectedWorm].position.y + created_teams[team_playing].vikings[selected_viking].move(key, delta_time, remaining_time, map, + rocket_selected) + viking.doMath(map) viking.draw() - print(areTheyFalling) - screen.blit(DOWN_ARROW, ((created_teams[teamPlaying].vikings[selectedWorm].position.x + int( - created_teams[teamPlaying].vikings[selectedWorm].image.get_width() / 2)) - int(DOWN_ARROW.get_width() / 2), - created_teams[teamPlaying].vikings[selectedWorm].position.y - - created_teams[teamPlaying].vikings[selectedWorm].image.get_height() * 2)) + screen.blit(DOWN_ARROW, ((created_teams[team_playing].vikings[selected_viking].position.x + + int(created_teams[team_playing].vikings[selected_viking].image.get_width() / 2)) - + int(DOWN_ARROW.get_width() / 2), + created_teams[team_playing].vikings[selected_viking].position.y - + created_teams[team_playing].vikings[selected_viking].image.get_height() * 2)) for event in pygame.event.get(): if key[pygame.K_DELETE]: @@ -541,6 +432,7 @@ def loadGame(number_teams, number_vikings): running = True while running: + titleScreen() number_teams_and_vikings = loadMainMenu(DEFAULT_NUMBER_TEAMS, DEFAULT_NUMBER_VIKINGS) loadGame(number_teams_and_vikings[0], number_teams_and_vikings[1]) diff --git a/menu.py b/menu.py new file mode 100644 index 0000000..41da707 --- /dev/null +++ b/menu.py @@ -0,0 +1,151 @@ +from setting import * + +def drawText(x, y, string, color, size=70, outshift=0): + font = pygame.font.SysFont("Tahoma", size, bold=True) + text = font.render(string, True, color) + textbox = x - (text.get_width() / 2), (y + (text.get_height()) + outshift) + + screen.blit(text, textbox) + return text + +# TEXT OUTLINE +def drawTextOutline(text, main_color, outline_color, x, y, outshift=0, size=70): + # top left + drawText(x - 2, y - 2, text, outline_color, size, outshift) + # top right + drawText(x + 2, y - 2, text, outline_color, size, outshift) + # btm left + drawText(x - 2, y + 2, text, outline_color, size, outshift) + # btm right + drawText(x + 2, y + 2, text, outline_color, size, outshift) + + return drawText(x, y, text, main_color, size, outshift=outshift,) + +def titleScreen(): + running_title_screen = True + + while running_title_screen: + screen.blit(TITLE_SCREEN, TITLE_SCREEN.get_rect()) + + for event in pygame.event.get(): + if event.type == pygame.KEYUP: + running_title_screen = False + if event.type == pygame.QUIT: + pygame.quit() + pygame.display.update() + + +def loadMainMenu(teams, vikings): + running_menu = True + + up_pressed = False + down_pressed = False + right_pressed = False + left_pressed = False + + opacity_up = True + opacity = 0 + while running_menu: + + if opacity_up and opacity < 1: + opacity += 0.005 + elif not opacity_up and opacity > 0: + opacity -= 0.005 + elif opacity_up and opacity >= 1: + opacity = 1 + opacity_up = False + elif not opacity_up and opacity <= 0: + opacity = 0 + opacity_up = True + + screen.blit(SKY_BG_MENU, SKY_BG_MENU.get_rect()) + + line1_text = f"Équipes: {teams}" + line2_text = f"Vikings par équipes: {vikings} " + line3_text = "Appuyez sur ENTRER pour commencer" + + clipping_color = (255 * opacity, 255 * opacity, 255 * opacity) + + line1_label = drawTextOutline(line1_text, Colors.WHITE, Colors.BLACK, (SCREEN_WIDTH / 2), (SCREEN_HEIGHT / 2), -300) + line2_label = drawTextOutline(line2_text, Colors.WHITE, Colors.BLACK, (SCREEN_WIDTH / 2), (SCREEN_HEIGHT / 2), -200) + drawText((SCREEN_WIDTH / 2), (SCREEN_HEIGHT / 2), line3_text, clipping_color, size=50, outshift=100) + + screen.blit(UP_ARROW, ((SCREEN_WIDTH / 2) + (line1_label.get_width() / 2) + 25, + (SCREEN_HEIGHT / 2) - (line1_label.get_height() + 1.5) - 120)) + screen.blit(DOWN_ARROW, ((SCREEN_WIDTH / 2) + (line1_label.get_width() / 2) + 25, + (SCREEN_HEIGHT / 2) - (line1_label.get_height() / 1.5) - 120)) + + screen.blit(LEFT_ARROW, ((SCREEN_WIDTH / 2) + (line2_label.get_width() / 2), + (SCREEN_HEIGHT / 2) + (line2_label.get_height()) - 180)) + screen.blit(RIGHT_ARROW, ((SCREEN_WIDTH / 2) + (line2_label.get_width() / 2) + 30, + (SCREEN_HEIGHT / 2) + (line2_label.get_height()) - 180)) + + key = pygame.key.get_pressed() + + # Team Selection + if key[pygame.K_UP] and not up_pressed: + up_pressed = True + teams += 1 + if teams > MAX_TEAMS: + teams = MAX_TEAMS + elif key[pygame.K_DOWN] and not down_pressed: + down_pressed = True + teams -= 1 + if teams < 2: + teams = 2 + if not key[pygame.K_UP]: + up_pressed = False + if not key[pygame.K_DOWN]: + down_pressed = False + + # Viking Selection + if key[pygame.K_RIGHT] and not right_pressed: + right_pressed = True + vikings += 1 + if vikings > MAX_VIKINGS_PER_TEAM: + vikings = MAX_VIKINGS_PER_TEAM + elif key[pygame.K_LEFT] and not left_pressed: + left_pressed = True + vikings -= 1 + if vikings < 1: + vikings = 1 + if not key[pygame.K_RIGHT]: + right_pressed = False + if not key[pygame.K_LEFT]: + left_pressed = False + + if key[pygame.K_RETURN]: + running_menu = False + + for event in pygame.event.get(): + if event.type == pygame.QUIT: + pygame.quit() + pygame.display.update() + return teams, vikings + + +def winScreen(team): + running_win_screen = True + + while running_win_screen: + screen.blit(WIN_BG, WIN_BG.get_rect()) + + line1_text = f"Victoire Team {team.id + 1}" + line2_text = "Play again ? [SPACE]" + line3_text = "Stop ? [DEL]" + + drawTextOutline(line1_text, Colors.YELLOW, Colors.BLACK, (SCREEN_WIDTH / 2), (SCREEN_HEIGHT / 2), outshift=-300) + drawTextOutline(line2_text, Colors.WHITE, Colors.BLACK, (SCREEN_WIDTH / 2), (SCREEN_HEIGHT / 2), outshift=0, size=50) + drawTextOutline(line3_text, Colors.WHITE, Colors.BLACK, (SCREEN_WIDTH / 2), (SCREEN_HEIGHT / 2), outshift=100, size=50) + + key = pygame.key.get_pressed() + + if key[pygame.K_SPACE]: + running_win_screen = False + + for event in pygame.event.get(): + if key[pygame.K_DELETE]: + pygame.quit() + if event.type == pygame.QUIT: + pygame.quit() + pygame.display.update() diff --git a/setting.py b/setting.py index 45e437e..5559dff 100644 --- a/setting.py +++ b/setting.py @@ -48,15 +48,20 @@ SKY_BG_MENU = pygame.image.load('images/asset/sky_menu.png') SKY_BG_MENU = pygame.transform.scale(SKY_BG_MENU, (SCREEN_WIDTH, SCREEN_HEIGHT)) +WIN_BG = pygame.image.load('images/asset/sky_win.png') +WIN_BG = pygame.transform.scale(WIN_BG, (SCREEN_WIDTH, SCREEN_HEIGHT)) + +TITLE_SCREEN = pygame.image.load('images/asset/title_screen.png') +TITLE_SCREEN = pygame.transform.scale(TITLE_SCREEN, (SCREEN_WIDTH, SCREEN_HEIGHT)) -# random class Colors: - RED = (255, 0, 0) + RED = (255, 40, 72) GREEN = (0, 255, 0) BLUE = (0, 0, 255) WHITE = (255, 255, 255) BLACK = (0, 0, 0) + YELLOW = (255, 222, 40) SKY_BLUE = (40, 180, 255) class TERRAIN: diff --git a/weapons.py b/weapons.py index 0f2bc72..01d60ee 100644 --- a/weapons.py +++ b/weapons.py @@ -1,41 +1,56 @@ from setting import * from common_class import Position + +def getAngle(viking_position, mouse_position): + delta_x = mouse_position[0] - viking_position[0] + delta_y = mouse_position[1] - viking_position[1] + angle_radians = math.atan2(delta_y, delta_x) + angle_degrees = math.degrees(angle_radians) + if angle_degrees < 0: + angle_degrees += 360 + return angle_degrees + + class Rocket: - def __init__(self, x, y, angle, force, gravity, wind, drag_coefficient): - self.x = x - self.y = y + def __init__(self, x, y, angle, force=35, gravity=9.8, wind=2, drag_coefficient=0.75): + self.position = Position(x, y) self.angle = math.radians(angle) + self.force = force self.gravity = gravity self.wind = wind + self.drag_coefficient = drag_coefficient # Coefficient de traînée + + self.damage = 100 self.explosion_radius = 10 self.exploded = False - self.drag_coefficient = drag_coefficient # Coefficient de traînée + + self.flipped = False self.original_image = pygame.image.load("images/weapons/Rocket.png") - self.image = pygame.transform.scale(self.original_image, (int(self.original_image.get_width() * SCALE_VIKING), int(self.original_image.get_height() * SCALE_VIKING))) + self.image = pygame.transform.scale(self.original_image, ( + int(self.original_image.get_width() * SCALE_VIKING), int(self.original_image.get_height() * SCALE_VIKING))) self.rect = self.image.get_rect() - def update(self, delta_time, bitMap): + def update(self, delta_time, bit_map): if not self.exploded: if not self.exploded: - time = pygame.time.get_ticks() / 1000 - force_x = self.force * math.cos(self.angle) force_y = self.force * math.sin(self.angle) drag_force_x = -0.5 * self.drag_coefficient * self.force * self.force * math.cos(self.angle) drag_force_y = -0.5 * self.drag_coefficient * self.force * self.force * math.sin(self.angle) - self.x += (force_x + drag_force_x) * delta_time - self.y += (force_y + drag_force_y + self.gravity) * delta_time + self.wind * delta_time + self.position.x += (force_x + drag_force_x) * delta_time + self.position.y += (force_y + drag_force_y + self.gravity) * delta_time + self.wind * delta_time - if self.y <= 0 or self.y >= SCREEN_HEIGHT or self.x <= 0 or self.x >= SCREEN_WIDTH or self.check_collision( - bitMap): + if (self.position.y <= 0 or self.position.x <= 0 or + self.position.y >= SCREEN_HEIGHT or self.position.x >= SCREEN_WIDTH or + self.checkCollision(bit_map)): self.explode() - def check_collision(self, bitMap): - if bitMap[int(self.x)][int(self.y)] == 1: + def checkCollision(self, bit_map): + if bit_map[int(self.position.x)][int(self.position.y)] == 1: return True return False @@ -43,30 +58,28 @@ def explode(self): self.exploded = True def draw(self): - screen.blit(self.image, (self.x, self.y)) + screen.blit(self.image, (self.position.x, self.position.y)) - -def get_angle(viking_position, mouse_position): - delta_x = mouse_position[0] - viking_position[0] - delta_y = mouse_position[1] - viking_position[1] - angle_radians = math.atan2(delta_y, delta_x) - angle_degrees = math.degrees(angle_radians) - if angle_degrees < 0: - angle_degrees += 360 - return angle_degrees + def getFlipped(self, flipped): + self.flipped = flipped + self.image = pygame.transform.flip(self.image, True, False) class RPG7: def __init__(self, x, y): - self.x = x - self.y = y + self.position = Position(x, y) + self.flipped = False self.original_image = pygame.image.load("images/weapons/Rpg7.png") self.image = pygame.transform.scale(self.original_image, ( - int(self.original_image.get_width() * SCALE_VIKING), int(self.original_image.get_height() * SCALE_VIKING))) + int(self.original_image.get_width() * SCALE_VIKING), int(self.original_image.get_height() * SCALE_VIKING))) self.rect = self.image.get_rect() def draw(self): - screen.blit(self.image, (self.x, self.y)) + screen.blit(self.image, (self.position.x, self.position.y)) + + def getFlipped(self, flipped): + self.flipped = flipped + self.image = pygame.transform.flip(self.image, True, False) class Grenade: @@ -86,9 +99,9 @@ def __init__(self, x, y, angle, speed_x, speed_y): self.damage = 50 self.timer = 5 - self.isTimeStarted = False - self.timeStarted = 0 - self.remainingTime = 0 + self.is_time_started = False + self.time_started = 0 + self.remaining_time = 0 self.falling = True self.preview_trajectory = False @@ -97,52 +110,48 @@ def __init__(self, x, y, angle, speed_x, speed_y): self.angle = math.radians(angle) self.exploded = False - self.raw_image = pygame.image.load(f"images/weapons/Grenade.png") - self.image = pygame.transform.scale(self.raw_image, (int(self.raw_image.get_width() * SCALE_VIKING), int(self.raw_image.get_height() * SCALE_VIKING))) + self.original_image = pygame.image.load(f"images/weapons/Grenade.png") + self.image = pygame.transform.scale(self.original_image, ( + int(self.original_image.get_width() * SCALE_VIKING), int(self.original_image.get_height() * SCALE_VIKING))) self.rect = self.image.get_rect() def update(self, map): - if not self.isTimeStarted: - self.isTimeStarted = True - self.timeStarted = pygame.time.get_ticks() + if not self.is_time_started: + self.is_time_started = True + self.time_started = pygame.time.get_ticks() - if self.isTimeStarted: - self.remainingTime = self.timer - ((pygame.time.get_ticks() - self.timeStarted) / 1000) - if self.remainingTime <= 0: - self.remainingTime = 0 + if self.is_time_started: + self.remaining_time = self.timer - ((pygame.time.get_ticks() - self.time_started) / 1000) + if self.remaining_time <= 0: + self.remaining_time = 0 self.explode() - if self.position.y <= 0 or self.position.y >= SCREEN_HEIGHT or self.position.x <= 0 or self.position.x >= SCREEN_WIDTH or self.check_collision( - map): + if (self.position.y <= 0 or self.position.x <= 0 or + self.position.y >= int(SCREEN_HEIGHT / TILE_SIZE) or self.position.x >= int(SCREEN_WIDTH / TILE_SIZE) or + self.checkCollision(map)): self.falling = False - while self.check_collision(map): + while self.checkCollision(map): self.position.y -= 1 return - # if touch the ground - # if map[int(self.position.x / TILE_SIZE)][int(self.position.y / TILE_SIZE)] == 1: - # self.position.speed_x = 0 - # self.position.speed_y = 0 - # self.falling = False - # return - if self.falling: + if self.falling and not self.exploded: self.position.speed_y += self.position.gravity dx = math.cos(self.angle) * self.position.speed_x dy = math.sin(self.angle) * self.position.speed_y - GRAVITY - if (math.sin(self.angle) < 1): + if math.sin(self.angle) < 1: dy = 1 * self.position.speed_y - GRAVITY - if (math.cos(self.angle) > 0.7): + if math.cos(self.angle) > 0.7: dx = 0.7 * self.position.speed_x - if (math.cos(self.angle) < -0.7): + if math.cos(self.angle) < -0.7: dx = -0.7 * self.position.speed_x self.position.x += dx self.position.y += dy - # if go outside map + # if go outside map self.capXandY() def capXandY(self): @@ -162,8 +171,8 @@ def capXandY(self): self.position.y = 1 self.explode() - def check_collision(self, bitMap): - if bitMap[int(self.position.x)][int(self.position.y)] == 1: + def checkCollision(self, bit_map): + if bit_map[int(self.position.x)][int(self.position.y)] == 1: return True return False @@ -177,15 +186,15 @@ def draw(self): for point in self.preview_points: pygame.draw.circle(screen, Colors.WHITE, (int(point[0]), int(point[1])), 2) - def start_preview_trajectory(self): + def startPreviewTrajectory(self): self.preview_trajectory = True self.preview_points.clear() - def stop_preview_trajectory(self): + def stopPreviewTrajectory(self): self.preview_trajectory = False self.preview_points.clear() - def calculate_trajectory(self, map): + def calculateTrajectory(self, map): simulated_position = Position(self.position.x, self.position.y, speed_x=self.position.speed_x, speed_y=self.position.speed_y, gravity=self.position.gravity) @@ -205,16 +214,15 @@ def calculate_trajectory(self, map): dx = math.cos(self.angle) * simulated_position.speed_x dy = math.sin(self.angle) * simulated_position.speed_y - GRAVITY - print((math.cos(self.angle), math.sin(self.angle))) + # print((math.cos(self.angle), math.sin(self.angle))) - if (math.sin(self.angle) < 1): + if math.sin(self.angle) < 1: dy = 1 * simulated_position.speed_y - GRAVITY - if (math.cos(self.angle) > 0.7): + if math.cos(self.angle) > 0.7: dx = 0.7 * simulated_position.speed_x - if (math.cos(self.angle) < -0.7): + if math.cos(self.angle) < -0.7: dx = -0.7 * simulated_position.speed_x - #if (math.sin(self.angle) > 1): if map[int(simulated_position.x / TILE_SIZE)][int(simulated_position.y / TILE_SIZE)] == 1: simulated_position.speed_x = 0 @@ -225,4 +233,3 @@ def calculate_trajectory(self, map): simulated_position.y += dy self.preview_points.append((simulated_position.x, simulated_position.y)) -