向前移动精灵

时间:2018-09-11 16:06:55

标签: python pygame

我一直在pygame中进行一场比赛,当2个方格将其打入网中时,他们在得分附近击中一个球。我在下面添加了代码的简约版本。

当球碰到广场时,我试图使球向前并稍微向上,然后由于重力而以逼真的方式下降。有任何可行的方法吗?

import pygame as pg
from pygame.math import Vector2
pg.init()
LIGHTBLUE = pg.Color('lightskyblue2')
DARKBLUE = pg.Color(11, 8, 69)


screen = pg.display.set_mode((800, 600))
width, height = screen.get_size()
clock = pg.time.Clock()
pg.display.set_caption("Super Acrobatic Rocket Powered Battle Polygons(SARPBP)")
x = 740
y = 500
x2 = 395
y2 = 15
x_change = 0
y_change = 0
bluespeed = 5
ground_pos = 70
on_ground = False

bluecar = pg.Surface((60, 30))
bluecar.fill((0,0,255))
bluegoal = pg.Surface((60,150))
bluegoal.fill((0,0,255))
BALL = pg.Surface((30, 30), pg.SRCALPHA)
pg.draw.circle(BALL, [0,0,0], [15, 15], 15)
ball_pos = Vector2(x2, y2)
ballrect = BALL.get_rect(center=ball_pos)
ball_vel = Vector2(0, 0)
ball_mask = pg.mask.from_surface(BALL)
mask_blue = pg.mask.from_surface(bluecar)
mask_ball = pg.mask.from_surface(BALL)
pos_blue = Vector2(x,y)
bluerect = bluecar.get_rect(center = pos_blue)
vel_blue = Vector2(bluespeed,0)
# A constant value that you add to the y_change each frame.
GRAVITY = .5
GRAVITY2 = .5
done = False
while not done:
    for event in pg.event.get():
        if event.type == pg.QUIT:
            done = True
        elif event.type == pg.KEYDOWN:
            if event.key == pg.K_a:
                x_change = -5
            elif event.key == pg.K_d:
                x_change = 5
            elif event.key == pg.K_w:
                if on_ground:  # Only jump if the player is on_ground.
                    y_change = -12
                    on_ground = False
        elif event.type == pg.KEYUP:
            if event.key == pg.K_a and x_change < 0:
                x_change = 0
            elif event.key == pg.K_d and x_change > 0:
                x_change = 0
    ball_vel.y += GRAVITY  # Accelerate downwards.
    ball_pos += ball_vel  # Move the ball.
    ballrect.center = ball_pos
    # Bounce when the ball touches the bottom of the screen.
    if ballrect.bottom >= height - ground_pos:
        # Just invert the y-velocity to bounce.
        ball_vel.y *= -0.7  # Change this value to adjust the elasticity.
        # Don't go below the ground.
        ballrect.bottom = height - ground_pos
        ball_pos.y = ballrect.centery

    # Add the GRAVITY value to y_change, so that
    # the object moves faster each frame.
    y_change += GRAVITY
    x += x_change
    y += y_change

    # Stop the object when it's near the bottom of the screen.
    if y >= height - 100:
        y = height - 100
        y_change = 0
        on_ground = True
    if x == 0:
        x = 5
    elif x == 740:
        x = 735
    offset_blue = bluerect[0] - ballrect[0], bluerect[1] - ballrect[1]
    overlap_blue = mask_ball.overlap(mask_blue, offset_blue)
    if overlap_blue:  # Blue collides with the ball.
        ball_vel = Vector2(vel_blue) * 1.4

    # Draw everything.
    screen.fill(LIGHTBLUE)
    pg.draw.line(screen, (0, 0, 0), (0, height-70), (width, height-70))
    screen.blit(bluecar, (x, y))
    screen.blit(BALL, ballrect)

    pg.display.update()
    clock.tick(60)  
pg.quit()

1 个答案:

答案 0 :(得分:1)

您还必须在每帧中更新蓝色矩形的位置,否则它将保持在其原始位置,并且碰撞检测将不起作用。

然后,我建议您摆脱x, y, x2, y2, x_change, y_change变量,因为您只能使用向量pos_bluevel_blue

当玩家与球碰撞时,您可以将球速度的y分量设置为某个负值,以使其向上移动(我只是将x分量设置为玩家的速度。如果玩家是移动)。

ball_vel = Vector2(vel_blue.x, -17)

请注意,您必须使用具有Alpha通道的曲面,否则pygame.mask.from_surface将不起作用,因此我将pygame.SRCALPHA作为pygame.Surface的第二个参数传递(您也可以调用{ {1}}或convert_alpha())。

set_colorkey()