mirror of
https://github.com/n0remac/game-jam-2020.git
synced 2025-12-06 03:13:12 -06:00
Moved monster logic from main to MonsterHandler.
This commit is contained in:
@@ -47,7 +47,7 @@ class Config(object):
|
||||
DEBUG = False
|
||||
|
||||
# Monster Count to be spawned
|
||||
MONSTER_COUNT = 10
|
||||
MONSTER_COUNT = 30
|
||||
|
||||
|
||||
class Enums(Enum):
|
||||
|
||||
@@ -13,7 +13,7 @@ from typing import Tuple, List
|
||||
import arcade
|
||||
from config import Config
|
||||
from map import Dungeon
|
||||
from mobs import Player, Enemy
|
||||
from mobs import Player, MobHandler
|
||||
from projectiles import Temp
|
||||
from recipe import ActiveRecipe
|
||||
|
||||
@@ -57,16 +57,13 @@ class Game(arcade.Window):
|
||||
self.physics_engine = None # Our physics engine
|
||||
# Used to keep track of our scrolling
|
||||
self.view_bottom = self.view_left = 0
|
||||
self.active_recipe = []
|
||||
self.Recipe = []
|
||||
|
||||
arcade.set_background_color(arcade.color.BLACK)
|
||||
|
||||
def setup(self):
|
||||
""" Set up the game here. Call this function to restart the game. """
|
||||
# Create the Sprite lists
|
||||
|
||||
self.enemy_list = arcade.SpriteList()
|
||||
self.active_enemies = arcade.SpriteList()
|
||||
self.fps = FPSCounter()
|
||||
self.bullet_list = arcade.SpriteList()
|
||||
|
||||
@@ -74,32 +71,21 @@ class Game(arcade.Window):
|
||||
self.dungeon = Dungeon(0, 3)
|
||||
|
||||
# Set up recipes
|
||||
self.active_recipe = ActiveRecipe()
|
||||
self.active_recipe.set_ghosts()
|
||||
self.Recipe = ActiveRecipe()
|
||||
self.Recipe.set_ghosts()
|
||||
|
||||
# Set up the player, specifically placing it at these coordinates.
|
||||
self.player = Player(self.dungeon)
|
||||
self.player.scale = 1
|
||||
level = random.choice(self.dungeon.levelList)
|
||||
self.player.center_x, self.player.center_y = level.center()
|
||||
self.player.cur_recipe = self.active_recipe.active
|
||||
self.player.cur_recipe = self.Recipe.active
|
||||
# x, y = level.center()
|
||||
|
||||
# Set up monsters
|
||||
for count in range(Config.MONSTER_COUNT//2):
|
||||
mob = Enemy(filename="resources/images/monsters/ghost/ghost1.png", dungeon=self.dungeon)
|
||||
mob.center_x, mob.center_y = random.choice(self.dungeon.levelList).center()
|
||||
mob.target = self.player
|
||||
mob.scale = 4
|
||||
mob.monster_type = 'ghost'
|
||||
self.enemy_list.append(mob)
|
||||
for count in range(Config.MONSTER_COUNT//2):
|
||||
mob = Enemy(filename="resources/images/monsters/frog/frog1.png", dungeon=self.dungeon)
|
||||
mob.center_x, mob.center_y = random.choice(self.dungeon.levelList).center()
|
||||
mob.target = self.player
|
||||
mob.scale = 4
|
||||
mob.monster_type = 'frog'
|
||||
self.enemy_list.append(mob)
|
||||
self.Mobs = MobHandler()
|
||||
self.enemy_list = self.Mobs.setup(0, 1, self.player, self.dungeon)
|
||||
self.active_enemies = self.Mobs.active_enemies
|
||||
|
||||
# Setup viewport
|
||||
self.view_bottom = self.player.center_x - (0.5 * Config.SCREEN_WIDTH) + 300
|
||||
@@ -121,10 +107,10 @@ class Game(arcade.Window):
|
||||
# Draw our sprites
|
||||
self.dungeon.render()
|
||||
self.player.draw()
|
||||
self.enemy_list.draw()
|
||||
self.Mobs.render()
|
||||
self.active_enemies.draw()
|
||||
self.bullet_list.draw()
|
||||
self.active_recipe.render()
|
||||
self.Recipe.render()
|
||||
|
||||
if Config.DEBUG:
|
||||
x, y = self.player.position
|
||||
@@ -182,8 +168,8 @@ class Game(arcade.Window):
|
||||
elif key == 65307:
|
||||
self.close()
|
||||
elif key == 65505:
|
||||
self.active_recipe.next_recipe()
|
||||
self.player.cur_recipe = self.active_recipe.active
|
||||
self.Recipe.next_recipe()
|
||||
self.player.cur_recipe = self.Recipe.active
|
||||
|
||||
def on_key_release(self, key, modifiers):
|
||||
"""Called when the user releases a key. """
|
||||
@@ -281,27 +267,8 @@ class Game(arcade.Window):
|
||||
Config.SCREEN_WIDTH + self.view_left,
|
||||
self.view_bottom,
|
||||
Config.SCREEN_HEIGHT + self.view_bottom)
|
||||
# Enemy activation and update
|
||||
for enemy in reversed(self.enemy_list):
|
||||
if (
|
||||
enemy.bottom > self.view_bottom and
|
||||
enemy.top < self.view_bottom + Config.SCREEN_HEIGHT and
|
||||
enemy.right < self.view_left + Config.SCREEN_WIDTH and
|
||||
enemy.left > self.view_left
|
||||
):
|
||||
if Config.DEBUG:
|
||||
print("Activate Enemy")
|
||||
self.active_enemies.append(enemy)
|
||||
self.enemy_list.remove(enemy)
|
||||
try:
|
||||
for enemy in self.active_enemies:
|
||||
monster_collisions = arcade.PhysicsEngineSimple(enemy, self.active_enemies)
|
||||
monster_collisions.update()
|
||||
path = enemy.get_path()
|
||||
enemy.tick(path)
|
||||
except Exception:
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
self.Mobs.update()
|
||||
|
||||
# Projectile updates
|
||||
self.bullet_list.update()
|
||||
for bullet in self.bullet_list:
|
||||
@@ -314,7 +281,9 @@ class Game(arcade.Window):
|
||||
bullet.remove_from_sprite_lists()
|
||||
if len(enemy_hit_list):
|
||||
self.player.add_kill(enemy_hit_list[0].monster_type)
|
||||
self.Recipe.add_kill(enemy_hit_list[0].monster_type)
|
||||
enemy_hit_list[0].remove_from_sprite_lists()
|
||||
bullet.remove_from_sprite_lists()
|
||||
|
||||
# If the bullet flies off-screen, remove it. TEMP change to range calc
|
||||
if (
|
||||
|
||||
@@ -6,10 +6,77 @@ Organizes all classes related to Mobs, Entities, Enemies, Players and Items.
|
||||
from typing import List, Tuple
|
||||
|
||||
import arcade
|
||||
import random
|
||||
import math
|
||||
|
||||
from config import Config, Enums, SpritePaths
|
||||
from map import Dungeon
|
||||
from sprites import PlayerAnimations
|
||||
|
||||
class MobHandler(arcade.SpriteList):
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.enemy_list = []
|
||||
self.active_enemies = []
|
||||
self.dungeon = None
|
||||
self.player = None
|
||||
|
||||
def setup(self, ghost, frogs, player, dungeon) -> list:
|
||||
self.enemy_list = arcade.SpriteList()
|
||||
self.active_enemies = arcade.SpriteList()
|
||||
self.dungeon = dungeon
|
||||
self.player = player
|
||||
|
||||
for count in range(ghost):
|
||||
mob = Enemy(filename="resources/images/monsters/ghost/ghost1.png", dungeon=self.dungeon)
|
||||
mob.center_x, mob.center_y = random.choice(self.dungeon.levelList).center()
|
||||
mob.target = self.player
|
||||
mob.scale = 4
|
||||
mob.monster_type = 'ghost'
|
||||
self.enemy_list.append(mob)
|
||||
for count in range(frogs):
|
||||
mob = Enemy(filename="resources/images/monsters/frog/frog1.png", dungeon=self.dungeon)
|
||||
mob.center_x, mob.center_y = random.choice(self.dungeon.levelList).center()
|
||||
mob.target = self.player
|
||||
mob.scale = 4
|
||||
mob.monster_type = 'frog'
|
||||
self.enemy_list.append(mob)
|
||||
|
||||
return self.enemy_list
|
||||
|
||||
def render(self) -> None:
|
||||
self.enemy_list.draw()
|
||||
|
||||
def update(self) -> None:
|
||||
# Enemy activation and update
|
||||
for enemy in reversed(self.enemy_list):
|
||||
# TODO replace with distance checking
|
||||
distance = self.get_distance(enemy)
|
||||
if (distance < 500):
|
||||
self.active_enemies.append(enemy)
|
||||
self.enemy_list.remove(enemy)
|
||||
try:
|
||||
for enemy in self.active_enemies:
|
||||
monster_collisions = arcade.PhysicsEngineSimple(enemy, self.active_enemies)
|
||||
monster_collisions.update()
|
||||
path = enemy.get_path()
|
||||
enemy.tick(path)
|
||||
except Exception:
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
|
||||
def get_distance(self, enemy) -> int:
|
||||
start_x = enemy.center_x
|
||||
start_y = enemy.center_y
|
||||
end_x = self.player.center_x
|
||||
end_y = self.player.center_y
|
||||
try:
|
||||
distance = math.sqrt(math.pow(start_x - end_x, 2) + math.pow(start_y - end_y, 2))
|
||||
return distance
|
||||
except:
|
||||
return 0
|
||||
|
||||
|
||||
class Mob(arcade.Sprite):
|
||||
"""
|
||||
@@ -30,6 +97,7 @@ class Mob(arcade.Sprite):
|
||||
|
||||
self.dungeon = dungeon
|
||||
self.target = None
|
||||
self.collisions = None
|
||||
|
||||
|
||||
class Player(Mob):
|
||||
|
||||
@@ -26,6 +26,8 @@ class ActiveRecipe(arcade.SpriteList):
|
||||
self.active = Recipe.GHOSTS
|
||||
self.cycle_recipes = [self.set_frogs, self.set_ghosts]
|
||||
self.pos = 0
|
||||
self.kill_num = 0
|
||||
|
||||
|
||||
def render(self) -> None:
|
||||
x = 0
|
||||
@@ -35,6 +37,7 @@ class ActiveRecipe(arcade.SpriteList):
|
||||
sprite.scale = 4
|
||||
sprite.center_x = screen_right - x
|
||||
sprite.center_y = screen_top
|
||||
|
||||
x += 70
|
||||
sprite.draw()
|
||||
|
||||
@@ -44,12 +47,24 @@ class ActiveRecipe(arcade.SpriteList):
|
||||
if self.pos == len(self.cycle_recipes):
|
||||
self.pos = 0
|
||||
|
||||
def add_kill(self, monster_type):
|
||||
for sprite in self.sprite_list:
|
||||
if monster_type in "ghost":
|
||||
r, g, b = sprite.color
|
||||
darken = lambda c, s: c * (1 - s)
|
||||
r = darken(r, .5)
|
||||
g = darken(g, .5)
|
||||
b = darken(b, .5)
|
||||
sprite.color = (r, g, b)
|
||||
return
|
||||
|
||||
def set_ghosts(self) -> None:
|
||||
self.active = Recipe.GHOSTS
|
||||
self.sprite_list = []
|
||||
self.sprite_list.append(arcade.Sprite(filename="resources/images/monsters/ghost/ghost1.png"))
|
||||
self.sprite_list.append(arcade.Sprite(filename="resources/images/monsters/ghost/ghost1.png"))
|
||||
self.sprite_list.append(arcade.Sprite(filename="resources/images/monsters/ghost/ghost1.png"))
|
||||
|
||||
|
||||
def set_frogs(self) -> None:
|
||||
self.active = Recipe.FROGS
|
||||
|
||||
Reference in New Issue
Block a user