class Player(Events): """docstring for player""" def __init__(self, server=False, dispatch_proj=None, id=False): super(Player, self).__init__() self.state = state(vec2(100, 130), vec2(0, 0), 100) self.move = Movement(*self.state.pos) self.dispatch_proj = dispatch_proj # spawning player at 0,0, width 32 = 1280 / 40. and height 72 = 720/10. if not server: self.Rect = Rect else: self.Rect = AABB if id: self.id = id self.weapons = WeaponsManager(self.dispatch_proj, self.id) #self.color = Options()['color'] #(0, 204, 255) self.set_color(Options()['color']) self.rect = self.Rect(0, 0, 32, 72, self.color, isplayer=True) #input will be assigned by windowmanager class self.input = proto.Input() self.listeners = {} self.ready = False def update(self, dt, rectgen, state=False, input=False): if not state: state = self.state if not input: input = self.input self.rect.vel = self.move.get_vel(dt, state, input) self.rect.update(*state.pos) self.collide(dt, rectgen, state) self.weapons.update(dt, state, input) self.state.update(dt, state) def specupdate(self, dt): if self.input.up: self.state.pos.y += 1000 * dt if self.input.right: self.state.pos.x += 1000 * dt if self.input.left: self.state.pos.x -= 1000 * dt if self.input.down: self.state.pos.y -= 1000 * dt def client_update(self, s_state): easing = .8 snapping_distance = 20 diff = vec2(s_state.pos.x - self.state.pos[0], s_state.pos.y - self.state.pos[1]) len_diff = diff.mag() if len_diff > snapping_distance: self.state.pos = s_state.pos elif len_diff > .1: self.state.pos += diff * easing self.state.vel = s_state.vel self.rect.update(*self.state.pos) def draw(self): self.rect.draw() def collide(self, dt, rectgen, state): all_collisions = (self.rect.sweep(obj, dt) for obj in rectgen) collisions = [coldata for coldata in all_collisions if coldata] try: xt = min(col[1] for col in collisions if col[0].x != 0) xnorm = [col[0].x for col in collisions if col[1] == xt][0] except ValueError: xt = dt xnorm = 0. try: yt = min(col[1] for col in collisions if col[0].y != 0) ynorm = [col[0].y for col in collisions if col[1] == yt][0] except ValueError: yt = dt ynorm = 0. dt = vec2(xt, yt) norm = vec2(xnorm, ynorm) self.resolve_sweep(norm, dt, state) def resolve_sweep(self, normal, dt, state): self.state.pos, self.state.vel = self.move.step(dt, state.pos) self.rect.update(*self.state.pos) self.state.vel.x *= normal.x == 0. self.state.vel.y *= normal.y == 0. self.move.resolve_coll(self.state.pos, self.state.vel) if normal.y < 0: self.state.set_cond('onGround') elif normal.x > 0: self.state.set_cond('onRightWall') elif normal.x < 0: self.state.set_cond('onLeftWall') elif normal.x == 0. and normal.y == 0.: self.determine_state() def resolve_collision(self, ovrlap, axis, angle): self.state.pos[0] = self.rect.x1 - ovrlap * axis[0] self.state.pos[1] = self.rect.y1 - ovrlap * axis[1] self.state.vel[0] *= axis[1] > 0 self.state.vel[1] *= axis[0] > 0 self.rect.update(*self.state.pos) self.move.resolve_coll(self.state.pos, self.state.vel) if axis[1] > 0 and ovrlap < 0: #self.move.conds['on_ground'] = True self.state.set_cond('onGround') #self.move.angle = angle elif axis[0] > 0: if ovrlap > 0: self.state.set_cond('onRightWall') elif ovrlap < 0: self.state.set_cond('onLeftWall') def determine_state(self): if self.state.vel.y < 0: self.state.set_cond('descending') def spawn(self, x, y, other=False): self.state.pos = vec2(x, y) self.state.vel = vec2(0, 0) self.state.hp = 100 self.state.armor = 0 self.state.isDead = False self.state.frozen = False if isinstance(self.rect, Rect): self.rect.update_color(self.color) if not other: self.weapons.reset() def get_id(self, id, name): self.id = id self.name = name self.weapons = WeaponsManager(self.dispatch_proj, self.id) def die(self): self.state.isDead = 5 if isinstance(self.rect, Rect): self.rect.update_color([128] * 3) def freeze(self): self.state.frozen = True def set_color(self, cstr): self.color = colors[cstr]
class Player(Events): """docstring for player""" def __init__(self, server=False, dispatch_proj=None, id=False, batch=None, renderhook=None): super(Player, self).__init__() self.state = state(vec2(100, 130), vec2(0, 0), 100) self.move = Movement(*self.state.pos) self.dispatch_proj = dispatch_proj # spawning player at 0,0, width 32 = 1280 / 40. and height 72 = 720/10. self.Rect = Rect if id: self.id = id self.weapons = WeaponsManager(self.dispatch_proj, self.id) # self.color = Options()['color'] #(0, 204, 255) self.set_color(Options()['color']) self.rect = self.Rect(0, 0, pext.x, pext.y, self.color, isplayer=True, batch=batch) # input will be assigned by windowmanager class self.input = proto.Input() self.listeners = {} self.ready = False self.renderhook = renderhook self.state.conds.direction = proto.down def update(self, dt, rectgen, state=False, input=False): if not state: state = self.state if not input: input = self.input self.rect.vel = self.move.get_vel(dt, state, input) self.rect.update(*state.pos) state = self.collide(dt, rectgen, state) self.weapons.update(dt, state, input) self.state.update(dt, state) def predict_step(self, dt, rectgen, state, input): newrect = self.rect.copy() newrect.vel = self.move.get_vel(dt, state, input) newrect.update(*state.pos) state = self.collide(dt, rectgen, state, newrect) state.mpos = vec2(self.input.mx, self.input.my) state.id = self.id if self.renderhook: self.renderhook(state, update=True) def specupdate(self, dt): if self.input.up: self.state.pos.y += 1000 * dt if self.input.right: self.state.pos.x += 1000 * dt if self.input.left: self.state.pos.x -= 1000 * dt if self.input.down: self.state.pos.y -= 1000 * dt def client_update(self, s_state): easing = .3 snapping_distance = 20 diff = vec2(s_state.pos.x - self.state.pos[0], s_state.pos.y - self.state.pos[1]) len_diff = diff.mag() if len_diff > snapping_distance: self.state.pos = s_state.pos elif len_diff > .1: self.state.pos += diff * easing self.state.vel = s_state.vel self.rect.update(*self.state.pos) self.state.update(0, s_state) self.state.conds = s_state.conds self.state.id = self.id self.state.mpos = vec2(self.input.mx, self.input.my) if self.renderhook: self.renderhook(self.state, update=True) def predict(self, dt, rectgen): self.rect.vel = self.move.get_vel(dt, self.state, self.input) self.rect.update(*self.state.pos) self.collide(dt, rectgen, self.state) self.weapons.update(dt, self.state, self.input) self.state.id = self.id self.state.mpos = vec2(self.input.mx, self.input.my) if self.renderhook: self.renderhook(self.state, update=True) def draw(self): self.rect.draw() def collide(self, dt, rectgen, state, external_rect=None): if not external_rect: all_cols = [self.rect.sweep(obj, dt) for obj in rectgen] else: all_cols = [external_rect.sweep(obj, dt) for obj in rectgen] cols = [coldata for coldata in all_cols if coldata] try: xt = min(col[1] for col in cols if col[0].x != 0) xnorm, yt_ent = [(col[0].x, col[2]) for col in cols if col[1] == xt and col[0].x != 0][0] except ValueError: xt = dt xnorm = 0. try: yt = min(col[1] for col in cols if col[0].y != 0) ynorm, xt_ent = [(col[0].y, col[2]) for col in cols if col[1] == yt and col[0].y != 0][0] except ValueError: yt = dt ynorm = 0. """if xnorm: # check for stair stairoffset = 10 testr = self.rect.copy() testr.update(testr.pos.x, testr.pos.y + stairoffset) first = testr.sweep(rct, dt) if not first: testr.update(testr.pos.x + testr.sign_of(testr.vel.x) * 30, testr.pos.y) testr.vel.x = 0 second = testr.sweep(rct, float('Inf')) if second and testr.vel.y != 0: s1 = testr.vel.y * second[1] s = stairoffset + s1 t = s / testr.vel.y if not abs(t) == float('Inf'): yt = t xnorm = 0 ynorm = -1""" if xnorm and ynorm: if yt_ent == yt and xt > yt: xnorm = 0 xt = dt elif xt_ent == xt and yt > xt: ynorm = 0 yt = dt dt = vec2(xt, yt) norm = vec2(xnorm, ynorm) return self.resolve_sweep(norm, dt, state) def resolve_sweep(self, normal, dt, state): state.pos, state.vel = self.move.step(dt, state.pos) state.vel.x *= normal.x == 0. state.vel.y *= normal.y == 0. """if normal.y < 0: state.set_cond('onGround') elif normal.x > 0: state.set_cond('onRightWall') elif normal.x < 0: state.set_cond('onLeftWall') elif normal.y == 0.:# and normal.y == 0.: self.determine_state(state)""" self.determine_state(state, normal) return state def determine_state(self, state, normal): dir = state.conds.direction mult_sign = (-1 if dir % 2 else 1) vert = dir < 2 if normal[vert] * mult_sign < 0: state.set_cond('onGround') elif state.vel[vert] * mult_sign < 0: state.set_cond('descending') def spawn(self, x, y, other=False): self.state.pos = vec2(x, y) self.state.vel = vec2(0, 0) self.state.hp = 100 self.state.armor = 0 self.state.isDead = False self.state.frozen = False self.weapons.reset() def get_id(self, id, name): self.id = id self.name = name self.weapons = WeaponsManager(self.dispatch_proj, self.id) self.renderhook(self, add=True) def die(self): self.state.isDead = 5 def freeze(self): self.state.frozen = True def set_color(self, cstr): self.color = colors[cstr] def remove_from_view(self): self.renderhook(self, remove=True) def add_to_view(self): self.renderhook(self, add=True)