Beispiel #1
0
    def __init__(self):
        self._init_pygame()
        self.screen = pygame.display.set_mode(SCREEN_RES)
        self.clock = pygame.time.Clock()
        self.font = pygame.font.Font(None, 64)
        self.message = ""

        self.ball = Ball(
            Vector2(SCREEN_RES) / 2, load_sprite("ball"),
            random_velocity(15, 30))
        self.camera = cv2.VideoCapture(0)
        self.camera.set(3, SCREEN_RES[0])
        self.camera.set(4, SCREEN_RES[1])
        self.frame = None
        self.finger_coords = []
Beispiel #2
0
 def _handle_input(self):
     for event in pygame.event.get():
         if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN
                                          and event.key == pygame.K_ESCAPE):
             pygame.quit()
             self.camera.release()
             cv2.destroyAllWindows()
             sys.exit()
         if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
             self.ball = Ball(
                 Vector2(SCREEN_RES) / 2,
                 load_sprite("ball"),
                 random_velocity(15, 30),
             )
     return
Beispiel #3
0
def _draw_scene(robot: Robot, ball: Ball, obstacles: List[MovingObstacle],
                ball_predicted_positions, barriers_predicted_positions):

    screen = numpy.full((constants.WINDOW_HEIGHT, constants.WINDOW_WIDTH, 3),
                        Color.BLACK,
                        dtype=numpy.uint8)

    robot.draw(screen)
    for obstacle in obstacles:
        obstacle.draw(screen)
    ball.draw(screen)

    screen_picture = copy.deepcopy(screen)
    _draw_edges(screen, ball_predicted_positions, Color.YELLOW)
    _draw_edges(screen, barriers_predicted_positions, Color.GREEN)
    return cv2.cvtColor(screen, cv2.COLOR_BGR2RGB), screen_picture
Beispiel #4
0
 def __get_model(self, name, k, n) -> BenchmarkModel:
     B = [1] * k
     return {
         'ball': Ball(n=n, B=B),
         'cube': Cube(n=n, B=B),
         'simplex': Simplex(n=n, B=B)
     }[name]
Beispiel #5
0
def update_balls(balls):
    updated_balls = []
    # Check for ball collisions
    active_balls = [ball for ball in balls if ball.vel]
    if len(active_balls) > 1:
        x_points = []
        for ball in active_balls:
            x_points.append((ball.pos.x - ball.size, True, ball))
            x_points.append((ball.pos.x + ball.size, False, ball))
        x_points.sort(key=lambda t: (t[0], t[1]))
        entered = 0
        potential_collisions = set()
        for x_point in x_points:
            _, entered, ball = x_point
            if entered:
                potential_collisions.add(ball)
            else:
                potential_collisions.remove(ball)
                for other in potential_collisions:
                    if (ball.pos - other.pos).mag <= ball.size + other.size:
                        Ball.separate_balls(ball, other)
                        Ball.change_velocities(ball, other)
    # Wall collisions, update position, apply friction
    for ball in balls:
        ball.size = BALL_SIZE
        if ball.vel:
            # wall collision checks
            if (ball.pos.x <= 0 and ball.vel.x < 0) or (ball.pos.x >= WIDTH
                                                        and ball.vel.x > 0):
                ball.vel.x *= -ELASTICITY
                ball.vel.y *= ELASTICITY
            if (ball.pos.y <= 0 and ball.vel.y < 0) or (ball.pos.y >= HEIGHT
                                                        and ball.vel.y > 0):
                ball.vel.y *= ELASTICITY
                ball.vel.y *= -ELASTICITY
            # apply friction
            ball.vel -= ball.vel.norm * FRICTION * ball.size
            # let balls move themselves according to velocity and acceleration vectors
            ball.update(FRAME_RATE)

            # remove ball if it's all the way off screen
            if (ball.pos.x < -50 or ball.pos.x > WIDTH + 50 or ball.pos.y < -50
                    or ball.pos.y > HEIGHT + 50):
                continue
        updated_balls.append(ball)
    return updated_balls
Beispiel #6
0
def test_no_obs2():
    robot = Robot(constants.x_start, constants.y_start, constants.theta_start)
    ball = Ball(constants.WINDOW_CORNERS[2] - 1,
                constants.WINDOW_CORNERS[3] - 1, 0, 0)
    result = main.run_simulation(robot,
                                 ball, [],
                                 simulation_delay=1000,
                                 enable_detection=False)
    assert result
Beispiel #7
0
def _main():
    ball = Ball.create_randomized()
    obstacles = []  # _generate_obstacles(cnt=constants.OBSTACLES_COUNT)
    robots = _generate_robots()
    run_simulation(robots,
                   ball,
                   obstacles,
                   enable_detection=False,
                   drawable_obs_avoidance=constants.DRAWABLE_OBS_AVOIDANCE)
Beispiel #8
0
def test_no_obs():
    robot = Robot(1, -2, utils.to_radians(-60))
    ball = Ball(0, 0, 0, 0)
    result = main.run_simulation(robot,
                                 ball, [],
                                 simulation_delay=1000,
                                 enable_detection=False,
                                 drawable_obs_avoidance=True)
    assert result
Beispiel #9
0
def test_vshyvost():
    for seed in seeds:
        print(seed)
        constants.RANDOM_SEED = seed
        ball = Ball.create_randomized()
        obstacles = main._generate_obstacles(cnt=constants.OBSTACLES_COUNT)
        robot = Robot(constants.x_start, constants.y_start,
                      constants.theta_start)
        result = main.run_simulation(robot,
                                     ball,
                                     obstacles,
                                     enable_detection=True)

        assert result
Beispiel #10
0
def test_static_obs():
    robot = Robot(constants.x_start, constants.y_start, constants.theta_start)
    ball = Ball(constants.WINDOW_CORNERS[2] - 1,
                constants.WINDOW_CORNERS[3] - 1, 0, 0)

    obstacles = [
        MovingObstacle(ball.x - 0.5, ball.y - 0.5, 0, 0)
        # MovingObstacle.create_randomized(),
    ]

    result = main.run_simulation(robot,
                                 ball,
                                 obstacles,
                                 simulation_delay=1000,
                                 enable_detection=True,
                                 drawable_obs_avoidance=True)
    assert result
Beispiel #11
0
def test_static_hist():
    # robot = Robot(constants.x_start, constants.y_start + 1, 1.75)
    robot = Robot(constants.x_start, constants.y_start, 1.75)
    ball = Ball(constants.WINDOW_CORNERS[2] - 1,
                constants.WINDOW_CORNERS[3] - 1, 0, 0)

    obstacles = [
        # MovingObstacle(constants.x_start + 0.8, constants.y_start + 1.8, 0, 0),
        MovingObstacle(constants.x_start + 0.4, constants.y_start + 0.4, 0, 0)
        # MovingObstacle.create_randomized(),
    ]

    result = main.run_simulation(robot,
                                 ball,
                                 obstacles,
                                 simulation_delay=1000,
                                 enable_detection=True,
                                 drawable_obs_avoidance=True)
    assert result
Beispiel #12
0
from models import Ball, Paddle, Brick

pygame.init()

screen = pygame.display.set_mode((Screen.WIDTH, Screen.HEIGHT))
pygame.display.set_caption('2D Brick Breaker')
pygame.mixer.music.load('resources/music/background.wav')
pygame.mixer.music.play(-1)
fx1 = pygame.mixer.Sound('resources/fx/fx1.wav')
fx2 = pygame.mixer.Sound('resources/fx/fx2.wav')
fx3 = pygame.mixer.Sound('resources/fx/fx3.wav')
fxs = [fx1, fx2, fx3]
clock = pygame.time.Clock()

background_image = pygame.image.load('resources/img/background.jpg')
ball = Ball(Screen.WIDTH / 2 - 100, Screen.HEIGHT - 250, 15, Color.WHITE,
            [0, 5])
paddle = Paddle(Screen.WIDTH / 2 - 100, Screen.HEIGHT - 30, 200, 20,
                Color.PINK, None)
bricks = [
    Brick(i * 160 + 5, j * 40 + 5, 150, 30, Color.BLACK) for i in range(5)
    for j in range(5)
]

running = True


def draw_window():
    screen.blit(background_image, (0, 0))
    ball.draw(screen)
    paddle.draw(screen)
    for brick in bricks:
Beispiel #13
0
                continue
        updated_balls.append(ball)
    return updated_balls


while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()
        if event.type == pygame.MOUSEBUTTONDOWN:
            mouse_down = True
            mouse_pos = Vector(*event.pos)
            balls.append(
                Ball(mouse_pos,
                     start_vel=None,
                     start_acc=GRAVITY,
                     size=BALL_SIZE))
        if event.type == pygame.MOUSEBUTTONUP:
            if not balls:
                continue
            mouse_pos = Vector(*event.pos)
            ball = balls[-1]
            ball.vel = (ball.pos - mouse_pos) * INITIAL_VELOCITY_SCALAR
            mouse_down = False
        if event.type == pygame.MOUSEMOTION:
            mouse_pos = Vector(*event.pos)
        if event.type == pygame.KEYDOWN:
            if event.key in {pygame.K_ESCAPE, pygame.K_q}:
                pygame.quit()
                quit()
            if event.key == pygame.K_r:  # reset
Beispiel #14
0
class FingPong:
    def __init__(self):
        self._init_pygame()
        self.screen = pygame.display.set_mode(SCREEN_RES)
        self.clock = pygame.time.Clock()
        self.font = pygame.font.Font(None, 64)
        self.message = ""

        self.ball = Ball(
            Vector2(SCREEN_RES) / 2, load_sprite("ball"),
            random_velocity(15, 30))
        self.camera = cv2.VideoCapture(0)
        self.camera.set(3, SCREEN_RES[0])
        self.camera.set(4, SCREEN_RES[1])
        self.frame = None
        self.finger_coords = []

    def main_loop(self):
        while True:
            self._handle_input()
            self._update_frame()
            self._process_game_logic()
            self._draw()
        return

    def _init_pygame(self):
        pygame.init()
        pygame.display.set_caption("Fing Pong")
        return

    def _update_frame(self):
        img = get_webcam_img(self.camera)
        self.finger_coords = process_hands(img)
        for finger_pair in self.finger_coords:  # no. of pairs = no. of hands detected
            for fingertip_coords in finger_pair:
                cv2.circle(img, fingertip_coords, 5, (255, 0, 255), cv2.FILLED)
            cv2.line(img, finger_pair[0], finger_pair[1], (222, 22, 222), 2)
        self.frame = img
        return

    def _handle_input(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN
                                             and event.key == pygame.K_ESCAPE):
                pygame.quit()
                self.camera.release()
                cv2.destroyAllWindows()
                sys.exit()
            if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
                self.ball = Ball(
                    Vector2(SCREEN_RES) / 2,
                    load_sprite("ball"),
                    random_velocity(15, 30),
                )
        return

    def _process_game_logic(self):
        self.ball.move()
        self.ball.handle_wall_collision()
        self.ball.handle_paddle_collision(self.finger_coords)
        self.message = f"{self.ball.bounces} bounces"
        if self.ball.is_oob_horizontal():
            self.message = (
                f"You lost! Score: {self.ball.bounces} bounces. SPACE to restart."
            )
        return

    def _draw(self):
        img_fmtd = cv2_img_to_surface(self.frame)
        self.screen.blit(img_fmtd, (0, 0))
        self.ball.draw(self.screen)
        if self.message:
            print_text_bottom(self.screen, self.message, self.font)
        pygame.display.flip()
        self.clock.tick(60)

        return
def read_ball_data():
    new_ball = Ball()
    new_ball.color = input('Informe a cor da bola: ')
    new_ball.circumference = float(input('Informe a circunferência da bola: '))
    new_ball.brand = input('Informe a marca da bola: ')
    return new_ball
Beispiel #16
0
def main():
    start_time = time.time()
    dt = 0.1

    ball = Ball.create_randomized()
    obstacles = _generate_obstacles(cnt=constants.OBSTACLES_COUNT)
    robot = Robot(constants.x_start, constants.y_start, constants.theta_start)

    ball_predicted_positions = []
    barriers_predicted_positions = []

    fps = 30
    width = constants.WINDOW_WIDTH
    height = constants.WINDOW_HEIGHT

    out = cv2.VideoWriter('result.mov', cv2.VideoWriter_fourcc(*"mp4v"), fps,
                          (width, height))

    while True:
        screen, screen_picture = _draw_scene(robot, ball, obstacles,
                                             ball_predicted_positions,
                                             barriers_predicted_positions)
        cv2.imshow('robot football', screen)
        out.write(screen)

        ball_predicted_positions, barriers_predicted_positions = obstacle_detection.forward(
            screen_picture, [(Color.RED, 1),
                             (Color.LIGHTBLUE, constants.OBSTACLES_COUNT)])
        ball_predicted_positions = cast_detector_coordinates(
            ball_predicted_positions)
        barriers_predicted_positions = cast_detector_coordinates(
            barriers_predicted_positions)

        # Planning
        #
        # Call obstacle avoidance algorithm and move to returned dot.
        #
        # At the moment it has the same call rate as simulation update rate:
        # it is called each quantum of time as the simulation updates.
        #
        # If obstacle_avoidance() call rate will be different from simulation update rate
        # then move_to_dot_again() should be called instead of obstacle_avoidance() and move_to_dot()
        # in this 'while' cycle if time of calling obstacle_avoidance() is not reached yet.

        target_x, target_y = obstacle_avoidance(robot.get_pos(),
                                                ball_predicted_positions,
                                                barriers_predicted_positions)
        vl, vr, ro, alpha, beta = move_to_dot(target_x, target_y, robot.x,
                                              robot.y,
                                              ball_predicted_positions[0][0],
                                              ball_predicted_positions[0][1],
                                              robot.angle)

        # Actually now move robot based on chosen vl and vr
        ball.move(dt)

        robot.set_velocity(vl, vr)
        robot.move(dt)

        for player in obstacles:
            player.move(dt)

        dist_to_obstacle = robot.get_closest_dist_to_obstacle(obstacles)
        dist_to_target = robot.get_dist_to_target(ball)
        if dist_to_obstacle < 0.001 or dist_to_target < MovingObstacle.RADIUS + Robot.RADIUS:
            if dist_to_obstacle < 0.001:
                print('Crash!')
            print(f'Result: {time.time() - start_time} sec')
            while cv2.getWindowProperty('robot football',
                                        cv2.WND_PROP_VISIBLE) == 1:
                out.release()
                cv2.waitKey(int(dt * 10))
            break

        cv2.waitKey(int(dt * 10))
        if cv2.getWindowProperty('robot football', cv2.WND_PROP_VISIBLE) < 1:
            break

    out.release()
    cv2.destroyAllWindows()
Beispiel #17
0
MAP_ELEMENT_TEXTURES['water'].set_alpha(170)
powerMeter = pygame.image.load(os.path.join('img', 'power.png'))
powerMeter = pygame.transform.scale(powerMeter, (150,150))

# SET ICON
pygame.display.set_icon(icon)

# GLOBAL VARIABLES
angle = 0
rollVel = 0
strokes = 0
par = 0
level = 1
coins = 0
shootPos = ()
ball = Ball(0, 0, (255,255,255))
line = None
power = 0
level_map = Map([])
put = False
shoot = False

# LOAD MUSIC
if SOUND:
    wrong = pygame.mixer.Sound(os.path.join('sounds', 'wrong12.wav'))
    puttSound = pygame.mixer.Sound(os.path.join('sounds', 'putt.wav'))
    inHole = pygame.mixer.Sound(os.path.join('sounds', 'inHole.wav'))
    song = pygame.mixer.music.load(os.path.join('sounds', 'music.mp3'))
    splash = pygame.mixer.Sound(os.path.join('sounds', 'splash.wav'))
    pygame.mixer.music.play(-1)