def __init__(self, display): self.display = display self.offset = 0 self.entities = EntityManager() prototypes.entities = self.entities self.systems = SystemManager(self.entities) self.systems.add_system(LinearMotionSystem()) self.systems.add_system(GravitySystem()) self.systems.add_system(GroundingSystem()) self.systems.add_system(DamageSystem()) self.systems.add_system(CollisionSystem()) self.systems.add_system(ActorSystem()) self.drawing_systems = SystemManager(self.entities) self.drawing_systems.add_system(DrawingSystem(self.display)) self.drawing_systems.add_system(DebugDrawingSystem(self.display)) self.players = (None, None) self.lives = [5, 5] self.winner = None self.player_controllers = resources.get("player_joysticks") #resources.get("logfile").write("p1 controller {}\n".format(self.player_controllers[0])) #resources.get("logfile").write("that controller id {}\n".format(resources.get("joysticks")[self.player_controllers[0]].get_id())) #resources.get("logfile").write("p2 controller {}\n".format(self.player_controllers[1])) #resources.get("logfile").write("that controller id {}\n".format(resources.get("joysticks")[self.player_controllers[1]].get_id())) self.old_sticks = [] self.joysticks = [resources.get("joysticks")[resources.get("player_joysticks")[0]], resources.get("joysticks")[resources.get("player_joysticks")[1]]] self.maxmin = [0, 0, 0, 0] self.logfile = resources.get("logfile") self.create_world()
def test_system_and_entity_managers_not_changed( self, manager, systems): manager2 = SystemManager(sentinel.entity_manager) with raises(SystemAlreadyAddedToManagerError): manager2.add_system(systems[0]) assert systems[0].entity_manager == sentinel.entity_manager assert systems[0].system_manager == manager
def test_raises_error(self, manager, systems): manager2 = SystemManager(sentinel.entity_manager) with raises(SystemAlreadyAddedToManagerError) as exc_info: manager2.add_system(systems[0]) # It's going to format a memory address for each class. We # don't care about that. assert re.match( "System `.*' which belongs to system manager `.*'" "attempted to be added to system manager `.*'$", str(exc_info.value))
def manager(self, systems): sm = SystemManager(sentinel.entity_manager) for system in systems: sm.add_system(system) return sm
def scanner_test(): w = sf.RenderWindow(sf.VideoMode(400, 400), "Scanner Test") clock = sf.Clock() em = MyEntityManager() sm = SystemManager(em) car1 = em.create_entity() em.add_component(car1, PositionComponent(0, 0, 0)) em.add_component(car1, VelocityComponent(0, 0, 0)) car1_circle = sf.CircleShape() car1_circle.radius = 10 car1_circle.fill_color = sf.Color.RED em.add_component(car1, DrawableComponent(car1_circle)) em.add_component(car1, MovementControlComponent()) em.add_component(car1, ScanSoundComponent("engine_idle_freesound_loop.wav")) car1_engine_sound = PositionSoundComponent("engine_idle_freesound_loop.wav") car1_engine_sound.sound.loop = True em.add_component(car1, car1_engine_sound) player = em.create_entity() em.add_component(player, PositionComponent(100, 100, 0)) em.add_component(player, VelocityComponent(0, 0, 0)) em.add_component(player, DirectionComponent(radians(180))) player_circle = sf.CircleShape() player_circle.radius = 10 player_circle.fill_color = sf.Color.WHITE em.add_component(player, DrawableComponent(player_circle)) # em.add_component(player, MovementControlComponent()) em.add_component(player, AudioListenerComponent()) em.add_component(player, HydrophoneComponent(radians(0))) sm.add_system(InputSystem(w)) sm.add_system(PhysicsSystem()) sm.add_system(AudioSystem()) sm.add_system(RenderSystem(w)) while w.is_open: sm.update(clock.restart()) for event in w.events: if type(event) is sf.CloseEvent: w.close() # w.display()
def manager(self, systems): sm = SystemManager(sentinel.entity_manager) for system in systems: sm.add_system(system, priority=random.randrange(4)) return sm
class Game: def __init__(self, display): self.display = display self.offset = 0 self.entities = EntityManager() prototypes.entities = self.entities self.systems = SystemManager(self.entities) self.systems.add_system(LinearMotionSystem()) self.systems.add_system(GravitySystem()) self.systems.add_system(GroundingSystem()) self.systems.add_system(DamageSystem()) self.systems.add_system(CollisionSystem()) self.systems.add_system(ActorSystem()) self.drawing_systems = SystemManager(self.entities) self.drawing_systems.add_system(DrawingSystem(self.display)) self.drawing_systems.add_system(DebugDrawingSystem(self.display)) self.players = (None, None) self.lives = [5, 5] self.winner = None self.player_controllers = resources.get("player_joysticks") #resources.get("logfile").write("p1 controller {}\n".format(self.player_controllers[0])) #resources.get("logfile").write("that controller id {}\n".format(resources.get("joysticks")[self.player_controllers[0]].get_id())) #resources.get("logfile").write("p2 controller {}\n".format(self.player_controllers[1])) #resources.get("logfile").write("that controller id {}\n".format(resources.get("joysticks")[self.player_controllers[1]].get_id())) self.old_sticks = [] self.joysticks = [resources.get("joysticks")[resources.get("player_joysticks")[0]], resources.get("joysticks")[resources.get("player_joysticks")[1]]] self.maxmin = [0, 0, 0, 0] self.logfile = resources.get("logfile") self.create_world() def create_world(self): p1 = prototypes.create_player((-100, 0), "foreveralone") p2 = prototypes.create_player((100, 0), "nyancat") self.players = (p1, p2) tiled = pygame.Surface((378, 54)) for i in range(0, 7): tiled.blit(resources.get("imgTile"), (54*i, 0)) prototypes.create_terrain((0, -50), rect((0, 0),378, 54), tiled) tiled = pygame.Surface((756, 54)) for i in range(0, 14): tiled.blit(resources.get("imgTile"), (54*i, 0)) prototypes.create_terrain((0, 300), rect((0, 0),756, 54), tiled) prototypes.create_terrain((-400, 200), circle((0, 0),80), resources.get("imgCake")) prototypes.create_terrain((400, 200), circle((0, 0),80), resources.get("imgCake")) def process_input(self, event): if event.type == KEYDOWN: if event.key == K_ESCAPE: return "exit" elif event.type == JOYAXISMOTION: pass #print "Joystick '",event.joy,"' axis",event.axis,"motion." #player = None #if event.joy == self.player_controllers[0]: # player = 0 #elif event.joy == self.player_controllers[1]: # player = 1 #if utils.map_axis(event.axis) == "stick": # return (player, utils.map_axis(event.axis)) elif event.type == JOYBUTTONDOWN: player = None if event.joy == self.player_controllers[0]: #resources.get("logfile").write("p1 button{} {}\n".format(event.joy, self.player_controllers[0])) player = 0 elif event.joy == self.player_controllers[1]: #resources.get("logfile").write("p2 button{} {}\n".format(event.joy, self.player_controllers[1])) player = 1 return (player, utils.map_buttons(event.button)) elif event.type == JOYBUTTONUP: print "Joystick '",event.joy,"' button",event.button,"up." elif event.type == JOYHATMOTION:#disabled pass# print "Joystick '",event.joy,"' hat",event.hat," moved.", event.value return None def add_command(self, player, command): actor = self.entities.component_for_entity(self.players[player], Actor) actor.commands.append(command) def update(self, commands): #self.logfile.write("frame\n") impact = [False, False] direction = [None, None] stick_0 = self.evaluate_joystick(0) stick_1 = self.evaluate_joystick(1) if self.old_sticks != []: change1 = length(sub(self.old_sticks[0]["stick"], stick_0["stick"])) if change1 > resources.get("impactThreshold"): impact[0] = True #self.logfile.write("p1 {}\n".format(stick_0["stick"])) position = length(stick_0["stick"]) if position < 0.2: direction[0] = "neutral" else: stickdir = utils.normalized(stick_0["stick"]) if stickdir[0] > 0.7: direction[0] = "right" elif stickdir[0] < -0.7: direction[0] = "left" elif stickdir[1] > 0.7: direction[0] = "down" elif stickdir[1] < -0.7: direction[0] = "up" #self.logfile.write("p1 dir {}\n".format(direction[0])) change2 = length(sub(self.old_sticks[1]["stick"], stick_1["stick"])) if change2 > resources.get("impactThreshold"): impact[1] = True position = length(stick_1["stick"]) if position < 0.2: direction[1] = "neutral" else: stickdir = utils.normalized(stick_1["stick"]) if stickdir[0] > 0.7: direction[1] = "right" elif stickdir[0] < -0.7: direction[1] = "left" elif stickdir[1] > 0.7: direction[1] = "down" elif stickdir[1] < -0.7: direction[1] = "up" #self.logfile.write("p2 dir {}\n".format(direction[1])) actor = self.entities.component_for_entity(self.players[0], Actor) actor.direction = direction[0] actor.impact = impact[0] actor2 = self.entities.component_for_entity(self.players[1], Actor) actor2.direction = direction[1] actor2.impact = impact[1] else: self.old_sticks = [None, None] self.old_sticks[0] = stick_0 self.old_sticks[1] = stick_1 for command in commands: if command == "exit": return "finish" if len(command) == 2: if command[1] == "A": self.add_command(command[0], "attack") if command[1] == "L": self.add_command(command[0], "shield") self.systems.update(1.0/resources.get("fps")) position = self.entities.component_for_entity(self.players[0], Position) if position.x < -512 or position.x > 512 or position.y < -500 or position.y > 384: self.lives[0] -= 1 position.x = 0 position.y = 0 velocity = self.entities.component_for_entity(self.players[0], Velocity) velocity.dx = 0 velocity.dy = 0 if self.lives[0] == 0: self.winner = 1 position2 = self.entities.component_for_entity(self.players[1], Position) if position2.x < -512 or position2.x > 512 or position2.y < -500 or position2.y > 384: self.lives[1] -= 1 position2.x = 0 position2.y = 0 velocity2 = self.entities.component_for_entity(self.players[1], Velocity) velocity2.dx = 0 velocity2.dy = 0 if self.lives[1] == 0: self.winner = 0 return None def evaluate_joystick(self, id): joystick = self.joysticks[id] state = dict() state["stick"] = (joystick.get_axis(0), joystick.get_axis(1)) #state["cstick"] = (0, 0)#(joystick.get_axis(2), joystick.get_axis(3)) return state def render(self): if self.winner is None: self.drawing_systems.update(1) icon = resources.get("imgAloneIcon") position = (50, 650) for i in range(0, self.lives[0]): self.display.blit(icon, (position[0]+i*icon.get_width(), position[1])) icon = resources.get("imgNyancatIcon") position = (700, 650) for i in range(0, self.lives[1]): self.display.blit(icon, (position[0]+i*icon.get_width(), position[1])) else: #self.display.blit(resources.get("imgBackgroundGO"), (0, 0)) self.display.blit(resources.get("imgGOString"), (300, 150)) if self.winner == 0: string = "Player1 wins!" color = (255, 0, 0) elif self.winner == 1: string = "Player2 wins!" color = (0, 0, 255) text_surface = resources.get("basicFont").render(string, True, color) text_rect = text_surface.get_rect() text_rect.centerx = self.display.get_rect().centerx text_rect.centery = self.display.get_rect().centery self.display.blit(text_surface, text_rect)
def game_loop(con): '''The main game loop.''' tdl.event.set_key_repeat(500, 100) game_map = eldmapgen.new_map() ent_mgr = EntityManager() player_coords = eldmap.random_unoccupied(ent_mgr, game_map, eldmapgen.DEFAULT_MAP_SEED) player = ents.new_player(ent_mgr, game_map, player_coords) torch_coords = eldmap.random_unoccupied(ent_mgr, game_map, eldmapgen.DEFAULT_MAP_SEED) client_list = [] for _ in range(random.randint(1, MAX_CLIENTS)): for client_coords in utils.adjacent8(player_coords): if eldmap.passable(ent_mgr, game_map, client_coords): client_list.append( (ents.new_client(ent_mgr, game_map, client_coords), client_coords)) break ents.new_torch(ent_mgr, game_map, torch_coords) # ents.new_client(ent_mgr, game_map, (8, 3)) main_display = tdl.Window(con, 0, 0, 25, 15) ents.new_tracking_camera(ent_mgr, game_map, main_display, player) sys_mgr = SystemManager(ent_mgr) sys_mgr.add_system(systems.UpdateWorldSys()) sys_mgr.add_system(systems.LightingSys(game_map)) sys_mgr.add_system(systems.FOVSys()) sys_mgr.add_system(systems.FOWSys()) fog_sys = systems.FogSys((main_display.width, main_display.height)) sys_mgr.add_system(fog_sys) event_sys = systems.EventSys(CONSOLE_WIDTH, CONSOLE_HEIGHT) sys_mgr.add_system(event_sys) sys_mgr.add_system(systems.AISys()) sys_mgr.add_system(systems.ActorSys()) sys_mgr.add_system(systems.FollowEntitySys()) sys_mgr.add_system(systems.RenderDisplaySys(fog_sys.get_fogmap)) start_time = utils.cur_time_ms() prev_time = start_time cur_time = prev_time while not event_sys.game_ended: cur_time = utils.cur_time_ms() sys_mgr.update(cur_time - prev_time) # 0 is a placeholder value prev_time = cur_time
def scanner_test(): w = sf.RenderWindow(sf.VideoMode(400, 400), "Scanner Test") clock = sf.Clock() em = MyEntityManager() sm = SystemManager(em) car1 = em.create_entity() em.add_component(car1, PositionComponent(0, 0, 0)) em.add_component(car1, VelocityComponent(0, 0, 0)) car1_circle = sf.CircleShape() car1_circle.radius = 10 car1_circle.fill_color = sf.Color.RED em.add_component(car1, DrawableComponent(car1_circle)) em.add_component(car1, MovementControlComponent()) em.add_component(car1, ScanSoundComponent("engine_idle_freesound_loop.wav")) car1_engine_sound = PositionSoundComponent( "engine_idle_freesound_loop.wav") car1_engine_sound.sound.loop = True em.add_component(car1, car1_engine_sound) player = em.create_entity() em.add_component(player, PositionComponent(100, 100, 0)) em.add_component(player, VelocityComponent(0, 0, 0)) em.add_component(player, DirectionComponent(radians(180))) player_circle = sf.CircleShape() player_circle.radius = 10 player_circle.fill_color = sf.Color.WHITE em.add_component(player, DrawableComponent(player_circle)) #em.add_component(player, MovementControlComponent()) em.add_component(player, AudioListenerComponent()) em.add_component(player, HydrophoneComponent(radians(0))) sm.add_system(InputSystem(w)) sm.add_system(PhysicsSystem()) sm.add_system(AudioSystem()) sm.add_system(RenderSystem(w)) while w.is_open: sm.update(clock.restart()) for event in w.events: if type(event) is sf.CloseEvent: w.close() # w.display()