Esempio n. 1
0
def main():
    pygame.init()

    width = 1200
    height = 800

    screen = pygame.display.set_mode([width, height])
    screen_center = Vec2d(width / 2, height / 2)
    coords = Coords(screen_center.copy(), 1, True)
    # ^ Center of window is (0,0), scale is 1:1, and +y is up

    coords.zoom_at_coords(Vec2d(0, 0), 2)
    # ^Sets camera center

    # Used to manage how fast the screen updates
    clock = pygame.time.Clock()

    planets = []

    frame_rate = 60
    playback_speed = 1
    dt = playback_speed / frame_rate
    paused = False
    done = False

    mouseClicked = False
    mousePosDown = Vec2d(0, 0)
    mousePosUp = Vec2d(0, 0)

    wall1 = Wall(Vec2d(150, 0), 45, 213, 4)
    wall2 = Wall(Vec2d(-150, 0), 315, 213, 4)

    print(wall1.normal)
    print(wall2.normal)

    while not done:
        gameMouse = pygame.mouse  #Mouse obj
        mousePosTup = gameMouse.get_pos(
        )  #Mouse pos in default coordinates as list
        mousePosVec = Vec2d(
            mousePosTup[0],
            mousePosTup[1])  #Mouse pos in default coordinates as vec2d
        mouseCoordPos = coords.pos_to_coords(
            mousePosVec)  #Mouse pos in standardized coords as vec2d

        initVelocity = 0

        # --- Main event loop
        for event in pygame.event.get():
            if event.type == pygame.QUIT:  # If user clicked close
                done = True
            if event.type == pygame.MOUSEBUTTONDOWN:
                paused = True
                if mouseClicked == False:
                    mouseClicked = True
                    mousePosDown = mouseCoordPos  #wiil get the pos of Mouse at first click location
                    print("setting planet")
                    global newPlanet
                    newPlanet = CircleLine(Vec2d(0, 0), mousePosDown, 15)

                if mouseClicked == True:
                    mousePosUp = mouseCoordPos  #For drawing initial velocity vector
                    #draw a vector on screen here

            if event.type == pygame.MOUSEBUTTONUP:
                mouseClicked = False
                mousePosUp = mouseCoordPos

                initVelocity = mousePosUp - mousePosDown
                print("Vel", initVelocity.x, initVelocity.y)
                initVelocity *= 0.1
                print("Vel", initVelocity.x, initVelocity.y)

                initMom = initVelocity * newPlanet.mass
                newPlanet.vel = initVelocity
                newPlanet.mom = initMom
                planets.append(newPlanet)
                #will add new planet to the array of planets with vector of mouse up and mouse click
                paused = False

                print("Have to send planet in vector from center to mouse")

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    paused = not paused
                if event.key == pygame.K_0 or pygame.K_KP0:
                    com = ForceCalculator.calculateCOM(planets)
                    comVel = ForceCalculator.calculateCOMVel(planets)
                    for obj in planets:
                        obj.center -= com
                        obj.vel -= comVel
                        obj.mom = obj.vel * obj.mass
        #If the game is not paused, update the objects in it
        if (not paused):
            objLen = len(planets)
            for i in range(0, objLen):
                #                forces = []
                #                for j in range(0, objLen):
                #                    #Calculate a force that each object has on this object and append it to the list of foces acting on it
                #                    if(not i==j):
                #                        forces.append(ForceCalculator.calculateGravity(planets[i].center, planets[i].mass, planets[j].center, planets[j].mass, 10))
                #
                #                summationForce = ForceCalculator.sumForces(forces)  #Currently result of all gravitational forces from other planets
                summationForce = ForceCalculator.calculateGravity(
                    planets[i].center, planets[i].mass, Vec2d(0, -1000000000),
                    600000000000000000,
                    10)  #Gravity of "Earth" acting on this "ball"
                planets[i].update_force(summationForce)

            for i in range(0, objLen):
                planets[i].update(dt)

            #goes through the array of planets to see if they are colliding and if they are then, caclulate the collision
            for i in range(0, objLen):
                for j in range(0, objLen):
                    if (not i == j):
                        ForceCalculator.calculateCollision(
                            planets[i], planets[j])
                ForceCalculator.calculateWallCollision(planets[i], wall1)
                ForceCalculator.calculateWallCollision(planets[i], wall2)

            for i in range(0, objLen):
                planets[i].update(dt)

        screen.fill(BLACK)  # wipe the screen
        for obj in planets:
            obj.draw(screen, coords)  # draw object to screen
        wall1.draw(screen, coords)
        wall2.draw(screen, coords)

        textFont = pygame.font.Font(None, 72)
        mousePosSurface = textFont.render(
            "x: " + str(mouseCoordPos.x) + " y: " + str(mouseCoordPos.y), 0,
            WHITE)
        screen.blit(mousePosSurface, (500, 500))
        # --- Update the screen with what we've drawn.
        pygame.display.update()

        # This limits the loop to 60 frames per second
        clock.tick(frame_rate)

    pygame.quit()
def main():
    pygame.init()

    width = 800
    height = 600
    screen = pygame.display.set_mode([width, height])
    screen_center = Vec2d(width / 2, height / 2)
    coords = Coords(screen_center.copy(), 1, True)
    zoom = 100
    coords.zoom_at_coords(Vec2d(0, 0), zoom)

    # Used to manage how fast the screen updates
    clock = pygame.time.Clock()

    # Create initial objects to demonstrate
    objects = []
    points = (
        Vec2d(0, 0),
        Vec2d(1, 0),
        Vec2d(0, 1),
    )
    zero = Vec2d(0, 0)
    objects.append(Polygon(zero, zero, 1, make_polygon(1.5, 5, 0, 1.5), RED))
    objects.append(Polygon(zero, zero, 1, make_polygon(2, 3, 0, 0.5), BLUE))
    # -------- Main Program Loop -----------\
    seconds_per_frame = 0.5
    frame_rate = 1 / seconds_per_frame
    done = False
    paused = False
    step = True
    background_color = WHITE
    collided = False
    while not done:
        # --- Main event loop
        for event in pygame.event.get():
            if event.type == pygame.QUIT:  # If user clicked close
                done = True
                paused = True
            elif event.type == pygame.MOUSEBUTTONDOWN:
                paused = False
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    done = True
                    paused = True
                elif event.key == pygame.K_SPACE:
                    paused = not paused
                    step = False
                else:
                    paused = False
                    step = True

        if not paused:
            # If not overlapping, move objects to a new random position
            if not collided:
                for obj in objects:
                    x = uniform(width * 0.25, width * 0.75)
                    y = uniform(height * 0.25, height * 0.75)
                    obj.pos = coords.pos_to_coords(Vec2d(x, y))
                    obj.angle = uniform(0, degrees(360))
                    obj.update_points_normals()

            # Check for collision
            collided = False
            result = []
            for i1 in range(len(objects)):
                for i2 in range(i1):
                    if check_collision(objects[i1], objects[i2], result):
                        collided = True

            # Drawing
            if collided:
                background_color = YELLOW
            else:
                background_color = WHITE
            screen.fill(background_color)  # wipe the screen

            for obj in objects:
                obj.draw(screen, coords)  # draw object to screen

            if collided:
                (obj1, obj2, overlap, normal, point) = result
                #pygame.draw.circle(screen, BLACK, coords.pos_to_screen(point).int(), 5)
                #pygame.draw.line(screen, BLACK, coords.pos_to_screen(point).int(),
                #                 coords.pos_to_screen(point + overlap*normal).int())
                # Separate objects accoring to position
                """ Move obj1 overlap distance in the direction of normal. """
                obj1.pos += overlap * normal

        # --- Update the screen with what we've drawn.
        pygame.display.update()

        # This limits the loop to the specified frame rate
        if step:
            paused = True
            clock.tick(60)
        else:
            clock.tick(frame_rate)

    pygame.quit()
Esempio n. 3
0
def main():
    global objects, screen, coords, ballIndex
    
    pygame.init()
 
    width = 1200
    height = 600
    screen = pygame.display.set_mode([width,height])
    screen_center = Vec2d(width/2, height/2)
    coords = Coords(screen_center.copy(), 1, True)
    zoom = 100
    coords.zoom_at_coords(Vec2d(0,0), zoom) 
    
    # Used to manage how fast the screen updates
    clock = pygame.time.Clock()
    
    # Text font
    basic_font = pygame.font.Font('freesansbold.ttf', 24)
    large_font = pygame.font.Font('freesansbold.ttf', 48)
    
    # Pause Text
    intro_surf = large_font.render('READY', True, GREEN)
    intro_rect = intro_surf.get_rect()
    intro_rect.center = (width / 2, (height * 0.4))
    
    # Strokes text
    stroke_surf = basic_font.render('Stroke: 0', True, WHITE)
    stroke_rect = stroke_surf.get_rect()
    stroke_rect.center = (width / 2, (height * 0.05))
    
    # Stage 1 Strokes Text
    stage1_surf = basic_font.render('Stage 1: 0 hits', True, RED)
    stage1_rect = stage1_surf.get_rect()
    stage1_rect.center = (100, height - 20)
    
    # Stage 2 Strokes Text
    stage2_surf = basic_font.render('Stage 2: 0 hits', True, RED)
    stage2_rect = stage2_surf.get_rect()
    stage2_rect.center = (250, height - 20) 
    
    # Stage 3 Strokes Text
    stage3_surf = basic_font.render('Stage 3: 0 hits', True, RED)
    stage3_rect = stage3_surf.get_rect()
    stage3_rect.center = (400, height - 20)     

    # Create initial objects to demonstrate
    objects = []

    # Goal
    goalRadius = 0.12
    objects.append(Polygon(Vec2d(-5,2), Vec2d(0,0), 1, make_polygon(goalRadius,36,0,1), BLACK, 0, 0))
    objects[-1].type = "goal"
    
    # Golf ball
    objects.append(Polygon(Vec2d(5,2), Vec2d(0,0), 1, make_polygon(0.1,36,0,1), WHITE, 0, 0))
    ballIndex = len(objects) - 1
    
    # Surrounding walls
    objects.append(Wall(coords.pos_to_coords(Vec2d(0, screen.get_height())), Vec2d(0, 1), BLACK)) # Bottom
    objects.append(Wall(coords.pos_to_coords(Vec2d(0, 0)), Vec2d(0, -1), BLACK)) # Top
    objects.append(Wall(coords.pos_to_coords(Vec2d(0, 0)), Vec2d(1, 0), BLACK)) # Left
    objects.append(Wall(coords.pos_to_coords(Vec2d(screen.get_width(), 0)), Vec2d(-1, 0), BLACK)) # Right
    
    # Triangle walls
    triangle1 = Polygon(coords.pos_to_coords(Vec2d(screen.get_width() * 0.25, 0)), Vec2d(0,0), 999999, make_polygon(3,3,180,0.5), BLACK, 0, 0)
    triangle2 = Polygon(coords.pos_to_coords(Vec2d(screen.get_width() * 0.50, screen.get_height())), Vec2d(0,0), 999999, make_polygon(3,3,0,0.5), BLACK, 0, 0)
    triangle3 = Polygon(coords.pos_to_coords(Vec2d(screen.get_width() * 0.75, 0)), Vec2d(0,0), 999999, make_polygon(3,3,180,0.5), BLACK, 0, 0)
    
    triangle1.type = "obstacle"
    triangle2.type = "obstacle"
    triangle3.type = "obstacle"
    objects.append(triangle1)
    objects.append(triangle2)
    objects.append(triangle3)
    
    # Smaller spinning obstacle
    spinningLine1 = Polygon(coords.pos_to_coords(Vec2d(screen.get_width() * 0.5, screen.get_height() * 0.25)), Vec2d(0, 0), 5, make_rectangle(1, 0.1), DARKBLUE, 0, 1)
    spinningLine1.type = "obstacle"
    objects.append(spinningLine1)
    
    # Larger spinning obstacle
    spinningLine2 = Polygon(coords.pos_to_coords(Vec2d(screen.get_width() * 0.75, screen.get_height() * 0.75)), Vec2d(0, 0), 50, make_rectangle(2, 0.1), DARKBLUE, 0, 5)
    spinningLine2.type = "obstacle"
    objects.append(spinningLine2)
    
    # Small obstacles
    pentaObstacle = Polygon(coords.pos_to_coords(Vec2d(screen.get_width() * 0.2, screen.get_height() * 0.4)), Vec2d(0, 0), 1, make_polygon(0.1, 5, 0, 1), DARKBLUE, 0, 0)
    pentaObstacle.type = "obstacle"
    objects.append(pentaObstacle)
    pentaObstacle = Polygon(coords.pos_to_coords(Vec2d(screen.get_width() * 0.15, screen.get_height() * 0.4)), Vec2d(0, 0), 1, make_polygon(0.1, 5, 0, 1), DARKBLUE, 0, 0)
    pentaObstacle.type = "obstacle"
    objects.append(pentaObstacle)
    pentaObstacle = Polygon(coords.pos_to_coords(Vec2d(screen.get_width() * 0.1, screen.get_height() * 0.4)), Vec2d(0, 0), 1, make_polygon(0.1, 5, 0, 1), DARKBLUE, 0, 0)
    pentaObstacle.type = "obstacle"
    objects.append(pentaObstacle)
    pentaObstacle = Polygon(coords.pos_to_coords(Vec2d(screen.get_width() * 0.05, screen.get_height() * 0.4)), Vec2d(0, 0), 1, make_polygon(0.1, 5, 0, 1), DARKBLUE, 0, 0)
    pentaObstacle.type = "obstacle"
    objects.append(pentaObstacle)
    
    # -------- Main Program Loop -----------\
    frame_rate = 60
    n_per_frame = 10
    playback_speed = 1 # 1 is real time, 10 is 10x real speed, etc.
    dt = playback_speed/frame_rate/n_per_frame
    done = False
    paused = True
    draw = False
    goalScored = False
    max_collisions = 1
    result = []
    
    # Strokes
    strokeNumber = 0
    stage1Stroke = 0
    stage2Stroke = 0
    stage3Stroke = 0
    
    # Stage completion
    winStage1 = False
    winStage2 = False
    winStage3 = False
    
    while not done:
        for event in pygame.event.get(): 
            if event.type == pygame.QUIT: # If user clicked close
                done = True
                paused = True
            #elif event.type == pygame.MOUSEBUTTONDOWN:
                #paused = False
            elif event.type == pygame.KEYDOWN: 
                if event.key == pygame.K_ESCAPE:
                    done = True
                    paused = True 
                elif event.key == pygame.K_SPACE:
                    paused = not paused

            elif event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 1:
                    pos = pygame.mouse.get_pos()
                    if (objects[ballIndex].draw(screen, coords)).collidepoint(pos):
                        draw = True
            
            # Mouse Button Down Inputs
            if event.type == pygame.MOUSEBUTTONDOWN and paused:
                # Assign mouse buttons
                (pressed1, pressed2, pressed3) = pygame.mouse.get_pressed()
                
            elif event.type == pygame.MOUSEBUTTONUP and paused:
                # Assign mouse buttons
                (pressed1, pressed2, pressed3) = pygame.mouse.get_pressed()
                
                # Mouse left press to draw a particle
                if pressed1 == 0 and paused == True:                    
                    # The velocity line can be drawn
                    if draw:
                        strokeNumber += 1
                    draw = False
                    paused = False

        if not paused:
            # Stroke Text
            # If the polygon ball has stopped, allow the user to hit it again
            if(objects[ballIndex].vel.mag() <= 0.05):
                paused = True
            for N in range(n_per_frame):
                # Physics
                # Calculate the force on each object
                for obj in objects:
                    obj.force.zero()
                    obj.force += -1 * obj.vel * obj.mass
                    
                    # Slow down the ball
                    if obj.type == "polygon":
                        obj.torque = -0.75 * obj.angvel
                        pass

                # Move each object according to physics
                for obj in objects:
                    obj.update(dt)
                    
                for i in range(max_collisions):
                    collided = False
                    for i1 in range(len(objects)):
                        for i2 in range(i1):
                            if check_collision(objects[i1], objects[i2], result):
                                resolve_collision(result)
                                collided = True
                    if not collided: # if all collisions resolved, then we're done
                        break
                
                # Check distance between ball and goal
                goalDistanceVec = objects[0].pos - objects[ballIndex].pos
                goalDistance = goalDistanceVec.mag()
                if goalDistance < goalRadius * 0.95 and objects[ballIndex].vel.mag() < 3:
                    objects[ballIndex].pos = Vec2d(5,2) # set ball position to start position
                    stage1Stroke = strokeNumber
                    strokeNumber = 0
                    winStage1 = True
            
            # Drawing
            screen.fill(WHITE) # wipe the screen
            for y in range (0, 10):
                for x in range (0, 10):
                    screen.blit(GRASS, (x * 346, y * 346))
                    
            for obj in objects:
                obj.draw(screen, coords) # draw object to screen
                
            # Show stroke text
            stroke_surf = basic_font.render('Stroke: ' + str(strokeNumber), True, WHITE)
            screen.blit(stroke_surf, stroke_rect)
            
            # Show each stages' stroke text
            if(winStage1):
                stage1_surf = basic_font.render('Stage 1: ' + str(stage1Stroke), True, WHITE)
                screen.blit(stage1_surf, stage1_rect)
            if(winStage2):
                stage2_surf = basic_font.render('Stage 2: ' + str(stage2Stroke), True, WHITE)
                screen.blit(stage2_surf, stage2_rect)
            if(winStage3):
                stage3_surf = basic_font.render('Stage 3: ' + str(stage3Stroke), True, WHITE)
                screen.blit(stage3_surf, stage3_rect)
            
            # --- Update the screen with what we've drawn.
            pygame.display.update()
            
            # This limits the loop to the specified frame rate
            clock.tick(frame_rate)
        elif paused:
            for N in range(n_per_frame):
                # Physics
                # Move each object according to physics
                for obj in objects:
                    if obj != objects[ballIndex]:
                        obj.update(dt)
            # Drawing
            screen.fill(WHITE) # wipe the screen
            for y in range (0, 10):
                for x in range (0, 10):
                    screen.blit(GRASS, (x * 346, y * 346))
            
            for obj in objects:
                obj.draw(screen, coords) # draw object to screen
            if draw:
                objects[ballIndex].set_vel(make_velocity_line() / 35)
            
            # Show the pause text
            screen.blit(intro_surf, intro_rect)
            
            # Show stroke text
            stroke_surf = basic_font.render('Stroke: ' + str(strokeNumber), True, WHITE)
            screen.blit(stroke_surf, stroke_rect)
            
           # Show each stages' stroke text
            if(winStage1):
                stage1_surf = basic_font.render('Stage 1: ' + str(stage1Stroke), True, WHITE)
                screen.blit(stage1_surf, stage1_rect)
            if(winStage2):
                stage2_surf = basic_font.render('Stage 2: ' + str(stage2Stroke), True, WHITE)
                screen.blit(stage2_surf, stage2_rect)
            if(winStage3):
                stage3_surf = basic_font.render('Stage 3: ' + str(stage3Stroke), True, WHITE)
                screen.blit(stage3_surf, stage3_rect)
    
            # --- Update the screen with what we've drawn.
            pygame.display.update()
            
            # This limits the loop to the specified frame rate
            clock.tick(frame_rate)

    pygame.quit()