Files
Super-HUGS-Revolution-98/ingame.py

268 lines
12 KiB
Python

###########################################
# Created on 1-7-2013. Miguel Angel Astor #
###########################################
import math
import pygame
try:
import android
except ImportError:
android = None
import math_utils
import player
import background
import imloader
import actor
from state import BaseState, VALID_STATES
class InGameState(BaseState):
def __init__(self):
BaseState.__init__(self)
self.background_color = (125, 158, 192)
self.next_transition = VALID_STATES['SCORE']
self.cursor_x = 0
self.cursor_y = 0
self.user_click = False
self.time_left = 190
self.then = pygame.time.get_ticks()
self.wave = 0
self.done = False
self.bckg_x = 0
self.bckg_y = 0
play_img = imloader.cached_image_loader.get_image_to_screen_percent('gfx/Player/player_idle_front.png')
self.player = actor.OmnidirectionalActor(0, play_img, "Player", True)
self.player.set_fps(5)
self.player.set_angle(math_utils.PI / 2.0)
self.player.set_velocity([0, 0])
# Add idle frames to the player:
play_img = imloader.cached_image_loader.get_image_to_screen_percent('gfx/Player/player_idle_side.png')
self.player.add_idle_frame(play_img)
play_img = imloader.cached_image_loader.get_image_to_screen_percent('gfx/Player/player_idle_front.png')
self.player.add_idle_frame(play_img)
play_img = imloader.cached_image_loader.get_image_to_screen_percent('gfx/Player/player_idle_side2.png')
self.player.add_idle_frame(play_img)
play_img = imloader.cached_image_loader.get_image_to_screen_percent('gfx/Player/player_idle_back.png')
self.player.add_idle_frame(play_img)
# Add moving frames to the player.
play_img = imloader.cached_image_loader.get_image_to_screen_percent('gfx/Player/player_walk_side_HUG_1.png')
self.player.add_moving_frame(play_img)
play_img = imloader.cached_image_loader.get_image_to_screen_percent('gfx/Player/player_walk_side_HUG_2.png')
self.player.add_moving_frame(play_img)
play_img = imloader.cached_image_loader.get_image_to_screen_percent('gfx/Player/player_walk_HUG_front_1.png')
self.player.add_moving_frame(play_img)
play_img = imloader.cached_image_loader.get_image_to_screen_percent('gfx/Player/player_walk_HUG_front_2.png')
self.player.add_moving_frame(play_img)
play_img = imloader.cached_image_loader.get_image_to_screen_percent('gfx/Player/player_walk_side_HUG_1_flipped.png')
self.player.add_moving_frame(play_img)
play_img = imloader.cached_image_loader.get_image_to_screen_percent('gfx/Player/player_walk_side_HUG_2_flipped.png')
self.player.add_moving_frame(play_img)
play_img = imloader.cached_image_loader.get_image_to_screen_percent('gfx/Player/player_walk_back_HUG_1.png')
self.player.add_moving_frame(play_img)
play_img = imloader.cached_image_loader.get_image_to_screen_percent('gfx/Player/player_walk_back_HUG_2.png')
self.player.add_moving_frame(play_img)
# Create a surface for the background.
bg_w = int(float(pygame.display.Info().current_w * 1280) / 1024.0)
bg_h = int(float(pygame.display.Info().current_h * 1024) / 768.0)
self.background = pygame.Surface((bg_w, bg_h))
self.game_area = pygame.Surface((bg_w, bg_h))
# Center the player.
self.player.set_position([bg_w // 2, bg_h // 2])
self.constraints = [int((95.0 * float(pygame.display.Info().current_w)) / 1024.0),
bg_w - int((95.0 * float(pygame.display.Info().current_w)) / 1024.0),
int((155.0 * float(pygame.display.Info().current_h)) / 768.0),
bg_h - int((155.0 * float(pygame.display.Info().current_h)) / 768.0)]
# Create the floor.
floor = background.TiledBackground(bg_w, bg_h, 'gfx/piso.png')
# Create the walls for the top and the bottom (the same for both).
bg_h = int((80.0 * float(pygame.display.Info().current_h)) / 768.0)
walls_top = background.TiledBackground(bg_w, bg_h, 'gfx/Pared.png')
bg_y = self.background.get_height() - int((80.0 * float(pygame.display.Info().current_h)) / 768.0)
# Create the left walls.
bg_h = int(float(pygame.display.Info().current_h * 1024) / 768.0)
walls_left = background.TiledBackground(-1, bg_h, 'gfx/Pared2.png')
_y = int((80.0 * float(pygame.display.Info().current_h)) / 768.0)
walls_left.set_position((0, _y))
# Create the right walls.
walls_right = background.TiledBackground(-1, bg_h, 'gfx/Pared3.png')
_x = self.background.get_width() - int((40.0 * float(pygame.display.Info().current_w)) / 1024.0)
walls_right.set_position((_x, _y))
# Build the background image.
floor.draw(self.background)
walls_top.set_position((0, 0))
walls_top.draw(self.background)
walls_left.draw(self.background)
walls_right.draw(self.background)
walls_top.set_position((0, bg_y))
walls_top.draw(self.background)
# Center the view on the player
p_pos = self.player.get_position()
(dist_x, dist_y) = (math.fabs(self.screen_center[0] - p_pos[0]), math.fabs(self.screen_center[1] - p_pos[1]))
self.bckg_x -= dist_x
self.bckg_y -= dist_y
self.player.set_constraints(self.constraints)
self.cursor_x = self.screen_center[0]
self.cursor_y = self.screen_center[1]
self.vec_1 = (float(pygame.display.Info().current_w) - float(self.screen_center[0]), 0.0)
self.vec_1 = math_utils.normalize_vector_2D(self.vec_1)
font_size = 22
screen_prop = (float(font_size) / 768.0)
screen_fract = (float(pygame.display.Info().current_h) * screen_prop) / 768.0
scale_factor = screen_fract / screen_prop
self.font = pygame.font.Font('font/ProfaisalEliteRiqa/Profaisal-EliteRiqaV1.0.ttf', int(font_size * scale_factor))
self.score_text = self.font.render("Puntos: " + str(1000), True, (0, 0, 0))
self.time_text = self.font.render("Tiempo: " + str(190), True, (0, 0, 0))
self.wave_text = self.font.render("Oleada: " + str(999), True, (0, 0, 0))
text_w = max(self.font.size("Puntos: " + str(1000))[0],
max(self.font.size("Tiempo: " + str(190))[0], self.font.size("Oleada: " + str(999))[0])) + 10
self.text_h = (3 * self.font.size("Puntos: " + str(1000))[1]) + 20
self.text_box = pygame.Surface((text_w, self.text_h))
self.text_h = self.font.size("Puntos: " + str(1000))[1]
self.text_box.set_alpha(128 + 64 + 32)
def recenter_view(self):
# Reset the view.
self.bckg_x = 0
self.bckg_y = 0
# Get the manhattan distance between the screen center and the player.
p_pos = self.player.get_position()
(dist_x, dist_y) = (self.screen_center[0] - p_pos[0], self.screen_center[1] - p_pos[1])
# Center the view on the player.
self.bckg_x += dist_x
self.bckg_y += dist_y
# Make sure the background is always inside the screen.
if self.bckg_y > 0:
self.bckg_y = 0
if self.bckg_x > 0:
self.bckg_x = 0
if self.bckg_y + self.background.get_height() < pygame.display.Info().current_h:
self.bckg_y += pygame.display.Info().current_h - (self.bckg_y + self.background.get_height())
if self.bckg_x + self.background.get_width() < pygame.display.Info().current_w:
self.bckg_x += pygame.display.Info().current_w - (self.bckg_x + self.background.get_width())
def input(self):
for event in pygame.event.get():
if android:
if android.check_pause():
android.wait_for_resume()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
self.next_transition = VALID_STATES['QUIT']
self.user_click = True
if event.type == pygame.QUIT:
self.next_transition = VALID_STATES['QUIT']
if event.type == pygame.MOUSEBUTTONDOWN:
self.user_click = True
self.player.move()
if event.type == pygame.MOUSEBUTTONUP:
self.user_click = False
self.player.stop()
if self.user_click:
(self.cursor_x, self.cursor_y) = pygame.mouse.get_pos()
def update(self):
if self.next_transition != VALID_STATES['QUIT']:
if self.next_transition != VALID_STATES['STAY']:
self.next_transition = VALID_STATES['STAY']
self.player.reset_then()
self.then = pygame.time.get_ticks()
#self.done = not player.PLAYERS[1].is_alive()
now = pygame.time.get_ticks()
delta_t = now - self.then
if delta_t >= 1000:
self.time_left -= delta_t // 1000
self.then = now
if self.time_left <= 0:
player.PLAYERS[1].kill()
self.done = True
if not self.done:
if self.cursor_x != self.screen_center[0] or self.cursor_y != self.screen_center[1]:
#p_pos = self.player.get_position()
#(dist_x, dist_y) = (self.screen_center[0] - p_pos[0], self.screen_center[1] - p_pos[1])
#self.cursor_x += dist_x
#self.cursor_y += dist_y
#vec_2 = (float(self.cursor_x) - float(p_pos[0]), float(self.cursor_y) - float(p_pos[1]))
vec_2 = (float(self.cursor_x) - float(self.screen_center[0]), float(self.cursor_y) - float(self.screen_center[1]))
vec_2 = math_utils.normalize_vector_2D(vec_2)
self.player.set_angle(math_utils.angle_vectors_2D(self.vec_1, vec_2))
self.player.update()
self.score_text = self.font.render("Puntos: " + str(player.PLAYERS[1].get_score()), True, (0, 0, 0))
if self.time_left > 30:
self.time_text = self.font.render("Tiempo: " + str(self.time_left), True, (0, 0, 0))
else:
self.time_text = self.font.render("Tiempo: " + str(max(self.time_left, 0)), True, (255, 0, 0))
self.wave_text = self.font.render("Oleada: " + str(self.wave), True, (0, 0, 0))
self.recenter_view()
elif self.time_left < -3:
# Reset everything.
self.time_left = 190
self.wave = 0
self.user_click = False
self.done = False
# Reset the player.
self.player.set_angle(90)
self.player.set_velocity([0, 0])
self.player.stop()
bg_w = int(float(pygame.display.Info().current_w * 1280) / 1024.0)
bg_h = int(float(pygame.display.Info().current_h * 1024) / 768.0)
self.player.set_position([bg_w // 2, bg_h // 2])
# TODO: Destroy all NPC's.
player.PLAYERS[1].revive()
self.next_transition = VALID_STATES['SCORE']
self.cursor_x = self.screen_center[0]
self.cursor_y = self.screen_center[1]
return self.next_transition
def render(self, canvas):
#canvas.fill(self.background_color)
self.game_area.blit(self.background, (0, 0))
# Blit everything to the bacground.
if player.PLAYERS[1].is_alive():
self.player.draw(self.game_area)
self.text_box.fill((128, 128, 128))
self.text_box.blit(self.score_text, (5, 5))
self.text_box.blit(self.time_text, (5, 10 + self.text_h))
self.text_box.blit(self.wave_text, (5, 15 + (2 * self.text_h)))
canvas.blit(self.game_area, (self.bckg_x, self.bckg_y))
canvas.blit(self.text_box, (5, 5))