Added spawnable npcs. Fixed angle-radian convertion functions.
This commit is contained in:
6
actor.py
6
actor.py
@@ -262,6 +262,7 @@ class OmnidirectionalActor(BaseActor):
|
|||||||
|
|
||||||
self.idle_frames = []
|
self.idle_frames = []
|
||||||
self.moving_frames = []
|
self.moving_frames = []
|
||||||
|
self.scared_frames = []
|
||||||
self.current_frame = 0
|
self.current_frame = 0
|
||||||
|
|
||||||
def is_moving(self):
|
def is_moving(self):
|
||||||
@@ -355,6 +356,11 @@ class OmnidirectionalActor(BaseActor):
|
|||||||
if self.current_frame >= len(self.moving_frames):
|
if self.current_frame >= len(self.moving_frames):
|
||||||
self.current_frame = len(self.moving_frames) - 1
|
self.current_frame = len(self.moving_frames) - 1
|
||||||
|
|
||||||
|
def toggle_scared(self):
|
||||||
|
aux = self.moving_frames
|
||||||
|
self.moving_frames = self.scared_frames
|
||||||
|
self.scared_frames = aux
|
||||||
|
|
||||||
def draw(self, canvas):
|
def draw(self, canvas):
|
||||||
if self.image is not None:
|
if self.image is not None:
|
||||||
if not self.animated:
|
if not self.animated:
|
||||||
|
136
ingame.py
136
ingame.py
@@ -3,6 +3,7 @@
|
|||||||
###########################################
|
###########################################
|
||||||
import math
|
import math
|
||||||
import copy
|
import copy
|
||||||
|
import random
|
||||||
|
|
||||||
import pygame
|
import pygame
|
||||||
try:
|
try:
|
||||||
@@ -21,6 +22,8 @@ class InGameState(BaseState):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
BaseState.__init__(self)
|
BaseState.__init__(self)
|
||||||
|
|
||||||
|
random.seed(None)
|
||||||
|
|
||||||
self.background_color = (125, 158, 192)
|
self.background_color = (125, 158, 192)
|
||||||
|
|
||||||
self.next_transition = VALID_STATES['SCORE']
|
self.next_transition = VALID_STATES['SCORE']
|
||||||
@@ -186,6 +189,119 @@ class InGameState(BaseState):
|
|||||||
|
|
||||||
# Append it to the explosions set.
|
# Append it to the explosions set.
|
||||||
self.explosions.add(explosion)
|
self.explosions.add(explosion)
|
||||||
|
|
||||||
|
def create_huggable(self, position):
|
||||||
|
play_img = imloader.cached_image_loader.get_image_to_screen_percent('gfx/Player/player_idle_front.png')
|
||||||
|
huggable = actor.OmnidirectionalActor(0, play_img, "Random Huggable", True)
|
||||||
|
huggable.set_fps(5)
|
||||||
|
huggable.set_angle(math_utils.ang_2_radians(float(random.randrange(-180, 180, 1))))
|
||||||
|
huggable.set_velocity([0, 0])
|
||||||
|
huggable.set_position(position)
|
||||||
|
huggable.set_constraints(self.constraints)
|
||||||
|
huggable.move()
|
||||||
|
|
||||||
|
gender = random.choice([0, 1])
|
||||||
|
if gender == 0:
|
||||||
|
# Create a male huggable.
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Idle_side.png')
|
||||||
|
huggable.add_idle_frame(image)
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Idle_front.png')
|
||||||
|
huggable.add_idle_frame(image)
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Idle_side_flipped.png')
|
||||||
|
huggable.add_idle_frame(image)
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Idle_back.png')
|
||||||
|
huggable.add_idle_frame(image)
|
||||||
|
|
||||||
|
# Add moving frames.
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Walking_side_1.png')
|
||||||
|
huggable.add_moving_frame(image)
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Walking_side_2.png')
|
||||||
|
huggable.add_moving_frame(image)
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Walking_front_1.png')
|
||||||
|
huggable.add_moving_frame(image)
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Walking_front_2.png')
|
||||||
|
huggable.add_moving_frame(image)
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Walking_side_1_flipped.png')
|
||||||
|
huggable.add_moving_frame(image)
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Walking_side_2_flipped.png')
|
||||||
|
huggable.add_moving_frame(image)
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Walking_back_1.png')
|
||||||
|
huggable.add_moving_frame(image)
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Walking_back_2.png')
|
||||||
|
huggable.add_moving_frame(image)
|
||||||
|
|
||||||
|
huggable.toggle_scared()
|
||||||
|
# Add scared frames.
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Walking_side_1_scared.png')
|
||||||
|
huggable.add_moving_frame(image)
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Walking_side_2_scared.png')
|
||||||
|
huggable.add_moving_frame(image)
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Walking_front_1_scared.png')
|
||||||
|
huggable.add_moving_frame(image)
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Walking_front_2_scared.png')
|
||||||
|
huggable.add_moving_frame(image)
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Walking_side_1_scared_flipped.png')
|
||||||
|
huggable.add_moving_frame(image)
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Walking_side_2_scared_flipped.png')
|
||||||
|
huggable.add_moving_frame(image)
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Walking_back_1.png')
|
||||||
|
huggable.add_moving_frame(image)
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/HeHuggable/Walking_back_2.png')
|
||||||
|
huggable.add_moving_frame(image)
|
||||||
|
|
||||||
|
huggable.toggle_scared()
|
||||||
|
|
||||||
|
else:
|
||||||
|
# Create a female huggable.
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Idle_side.png')
|
||||||
|
huggable.add_idle_frame(image)
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Idle_front.png')
|
||||||
|
huggable.add_idle_frame(image)
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Idle_side_flipped.png')
|
||||||
|
huggable.add_idle_frame(image)
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Idle_back.png')
|
||||||
|
huggable.add_idle_frame(image)
|
||||||
|
|
||||||
|
# Add moving frames.
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Walking_side_1.png')
|
||||||
|
huggable.add_moving_frame(image)
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Walking_side_2.png')
|
||||||
|
huggable.add_moving_frame(image)
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Walking_front_1.png')
|
||||||
|
huggable.add_moving_frame(image)
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Walking_front_2.png')
|
||||||
|
huggable.add_moving_frame(image)
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Walking_side_1_flipped.png')
|
||||||
|
huggable.add_moving_frame(image)
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Walking_side_2_flipped.png')
|
||||||
|
huggable.add_moving_frame(image)
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Walking_back_1.png')
|
||||||
|
huggable.add_moving_frame(image)
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Walking_back_2.png')
|
||||||
|
huggable.add_moving_frame(image)
|
||||||
|
|
||||||
|
huggable.toggle_scared()
|
||||||
|
# Add scared frames.
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Walking_side_1_scared.png')
|
||||||
|
huggable.add_moving_frame(image)
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Walking_side_2_scared.png')
|
||||||
|
huggable.add_moving_frame(image)
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Walking_front_1_scared.png')
|
||||||
|
huggable.add_moving_frame(image)
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Walking_front_2_scared.png')
|
||||||
|
huggable.add_moving_frame(image)
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Walking_side_1_scared_flipped.png')
|
||||||
|
huggable.add_moving_frame(image)
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Walking_side_2_scared_flipped.png')
|
||||||
|
huggable.add_moving_frame(image)
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Walking_back_1.png')
|
||||||
|
huggable.add_moving_frame(image)
|
||||||
|
image = imloader.cached_image_loader.get_image_to_screen_percent('gfx/SheHuggable/Walking_back_2.png')
|
||||||
|
huggable.add_moving_frame(image)
|
||||||
|
|
||||||
|
huggable.toggle_scared()
|
||||||
|
|
||||||
|
self.npcs.add(huggable)
|
||||||
|
|
||||||
def input(self):
|
def input(self):
|
||||||
for event in pygame.event.get():
|
for event in pygame.event.get():
|
||||||
@@ -247,6 +363,11 @@ class InGameState(BaseState):
|
|||||||
self.player.update()
|
self.player.update()
|
||||||
self.recenter_view()
|
self.recenter_view()
|
||||||
|
|
||||||
|
for npc in self.npcs:
|
||||||
|
npc.update()
|
||||||
|
|
||||||
|
# TODO: Detect collisions here.
|
||||||
|
|
||||||
elif self.time_left < -3:
|
elif self.time_left < -3:
|
||||||
# Reset everything.
|
# Reset everything.
|
||||||
self.time_left = 190
|
self.time_left = 190
|
||||||
@@ -275,12 +396,14 @@ class InGameState(BaseState):
|
|||||||
|
|
||||||
self.cancel = False
|
self.cancel = False
|
||||||
|
|
||||||
|
# Remove finished explosions
|
||||||
removal = set()
|
removal = set()
|
||||||
for explosion in self.explosions:
|
for explosion in self.explosions:
|
||||||
if explosion.get_current_frame() == 6:
|
if explosion.get_current_frame() == 6:
|
||||||
removal.add(explosion)
|
removal.add(explosion)
|
||||||
self.explosions.difference_update(removal)
|
self.explosions.difference_update(removal)
|
||||||
|
|
||||||
|
# Remove invisible npcs.
|
||||||
removal = set()
|
removal = set()
|
||||||
for npc in self.npcs:
|
for npc in self.npcs:
|
||||||
if not npc.is_visible():
|
if not npc.is_visible():
|
||||||
@@ -304,13 +427,18 @@ class InGameState(BaseState):
|
|||||||
self.game_area.blit(self.background, (0, 0))
|
self.game_area.blit(self.background, (0, 0))
|
||||||
|
|
||||||
# Blit everything to the bacground.
|
# Blit everything to the bacground.
|
||||||
|
# Sort npcs by Y coordinate and draw.
|
||||||
|
# The idea is to draw npcs near the bottom edge of the screen last.
|
||||||
|
npc_list = list(self.npcs)
|
||||||
if player.PLAYERS[1].is_alive():
|
if player.PLAYERS[1].is_alive():
|
||||||
self.player.draw(self.game_area)
|
npc_list.append(self.player)
|
||||||
|
sorted(npc_list, key = lambda npc: npc.get_position()[1])
|
||||||
|
for npc in npc_list:
|
||||||
|
npc.draw(self.game_area)
|
||||||
|
|
||||||
# Sort explosions by Y coordinate and draw.
|
# Same idea here.
|
||||||
# The idea is to draw explosion near the bottom edge of the screen last.
|
|
||||||
expl_list = list(self.explosions)
|
expl_list = list(self.explosions)
|
||||||
sorted(expl_list, key = lambda explosion: explosion.get_position()[1], reverse = True)
|
sorted(expl_list, key = lambda explosion: explosion.get_position()[1])
|
||||||
for explosion in expl_list:
|
for explosion in expl_list:
|
||||||
explosion.draw(self.game_area)
|
explosion.draw(self.game_area)
|
||||||
|
|
||||||
|
@@ -22,7 +22,7 @@ def angle_vectors_2D(vec1, vec2):
|
|||||||
return math.atan2(vec2[1], vec2[0]) - math.atan2(vec1[1], vec1[0])
|
return math.atan2(vec2[1], vec2[0]) - math.atan2(vec1[1], vec1[0])
|
||||||
|
|
||||||
def ang_2_radians(ang):
|
def ang_2_radians(ang):
|
||||||
return ang * (180 / PI)
|
return (ang * PI) / 180.0
|
||||||
|
|
||||||
def radians_2_ang(rad):
|
def radians_2_ang(rad):
|
||||||
return rad * (PI / 180)
|
return (rad * 180.0) / PI
|
||||||
|
Reference in New Issue
Block a user