Пример #1
0
 def _run_command(spline, new_robot, new_bullets):
     command, args = spline[0], spline[1:]
     new_bullet = None
     if command == "set-speed":
         new_robot.speed = float(args[0])
         consumed = 2
     elif command == "set-rotation-speed":
         new_robot.rotation = float(args[0])
         consumed = 2
     elif command == "set-turret-rotation-speed":
         new_robot.turret_rotation = float(args[0])
         consumed = 2
     elif command == "fire":
         new_bullet = battlefield.fire_bullet(new_robot, field)
         new_bullets.append(new_bullet)
         consumed = 1
     elif command == "rotate-turret-to-angle-and-fire":
         if new_robot.time_to_fire:
             if new_robot.turret_final_angle is None:
                 new_robot.turret_final_angle = float(args[0])
         elif new_robot.fire_angle is None:
             new_robot.fire_angle = float(args[0])
         consumed = 2
     elif command == "rotate-turret-to-angle":
         if new_robot.turret_final_angle is None:
             new_robot.turret_final_angle = float(args[0])
         consumed = 2
     else:
         raise ValueError, "unknown command: %s" % command
     return consumed, new_robot, new_bullets
Пример #2
0
def input_callback(loop_id, field, new_robot, controls, first):
    """Process input keyboard events to move and rotate the robot."""
    # Use the same global events variables for all callbacks for a given loop.
    global loop_events
    #assert events is not None or first, "First callback must get events"""
    if loop_id not in loop_events:
        # Only the first callback on the loop has to get the events
        events = pygame.event.get()
        loop_events[loop_id] = events
    else:
        events = loop_events[loop_id]
    if not process_default_events(events):
        raise battlefield.AbortBattle
    
    new_bullet = None    
    changed = False
    for event in events:
        if event.type == pygame.KEYDOWN:
            if event.key == controls.fire:
                new_bullet = battlefield.fire_bullet(new_robot, field)
                changed = True
        def sign(x):
            return cmp(x, 0.0) or 1.0
        pressed = pygame.key.get_pressed()
        new_speed = new_rotation = new_turret_rotation = 0.0
        if pressed[controls.forward]:
            new_speed += 150
        if pressed[controls.backward]:
            new_speed += -100
        if pressed[controls.rotate_right]:
            new_rotation += -100*sign(new_speed)
        if pressed[controls.rotate_left]:
            new_rotation += 100*sign(new_speed)
        if pressed[controls.turret_rotate_left]:
            new_turret_rotation += 100
        if pressed[controls.turret_rotate_right]:
            new_turret_rotation += -100
        for attr, value in [("speed", new_speed), 
         ("rotation", new_rotation), 
         ("turret_rotation", new_turret_rotation)]:
             if getattr(new_robot, attr) != value:
                setattr(new_robot, attr, value)
                changed = True
    if changed:
        return [battlefield.StateChange(update_robots=[new_robot], 
            new_bullets=lib.compact([new_bullet]))]