Mercurial > nagslang
changeset 409:180c27514619
Better protagonist finding for enemies.
author | Jeremy Thurgood <firxen@gmail.com> |
---|---|
date | Sat, 07 Sep 2013 11:21:54 +0200 |
parents | d04981e24fda |
children | d7bd9adb105a |
files | nagslang/enemies.py |
diffstat | 1 files changed, 23 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/nagslang/enemies.py Sat Sep 07 12:32:40 2013 +0200 +++ b/nagslang/enemies.py Sat Sep 07 11:21:54 2013 +0200 @@ -3,7 +3,6 @@ import pymunk import pymunk.pygame_util -from pymunk.vec2d import Vec2d from nagslang import render from nagslang.constants import (COLLISION_TYPE_ENEMY, COLLISION_TYPE_FURNITURE, @@ -84,29 +83,40 @@ def collide_with_claw_attack(self, claw_attack): self.lose_health(claw_attack.damage) + def range_to_visible_protagonist(self): + """Get a vector to the protagonist if there are no barriers in between. + + Returns a vector to the protagonist if she is within line of sight, + otherwise `None` + """ + + pos = self.physicser.position + target = self.world.protagonist.get_shape().body.position + + for collision in self.get_space().segment_query(pos, target): + shape = collision.shape + if (shape in (self.get_shape(), self.world.protagonist.get_shape()) + or shape.sensor): + continue + return None + return target - pos + def ranged_attack(self, range_, speed, damage, type_, reload_time, result=None): if result is None: result = Result() - pos = self.physicser.position - target = self.world.protagonist.get_shape().body.position - - r = self.get_space().segment_query(pos, target) - for collision in r: - shape = collision.shape - if (shape in (self.get_shape(), self.world.protagonist.get_shape()) - or shape.sensor): - continue + vec = self.range_to_visible_protagonist() + if vec is None: return result if not self.check_timer('reload_time'): self.start_timer('reload_time', reload_time) - vec = Vec2d((target.x - pos.x, target.y - pos.y)) if vec.length < range_: vec.length = speed - result.add += (Bullet(self.get_space(), pos, vec, damage, - type_, COLLISION_TYPE_ENEMY),) + result.add += (Bullet( + self.get_space(), self.physicser.position, vec, damage, + type_, COLLISION_TYPE_ENEMY),) return result def greedy_move(self, target):