python - Pygame - 事件后 Sprite 的旋转不起作用

标签 python python-3.x pygame

我一直在制作一个足球游戏,其中两辆车试图将球击入网中。有三件事使我的车的旋转/角度不正确,撞到墙上(侧面或顶部和底部),一旦你开始游戏,旋转就开始向后,当进球时,汽车继续以任何尽管重置了红角度,但在进球之前所保持的角度。我的代码如下,希望有人能修复它。

import pygame
import pygame as pg
from pygame.math import Vector2
import time
pygame.font.init()
pygame.init()
WIDTH = 1150
HEIGHT = 800
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Rocket League")
clock = pygame.time.Clock()
start_ticks = pygame.time.get_ticks()
bgimg = pygame.image.load("Football_pitch.png")
REDGOAL = pg.Surface((50, 150), pg.SRCALPHA)
REDGOAL.fill((255, 0, 0))
redgoal_rect = REDGOAL.get_rect(topleft=(0, 340))
redgoal_mask = pg.mask.from_surface(REDGOAL)
BLUEGOAL = pg.Surface((50, 150), pg.SRCALPHA)
BLUEGOAL.fill((0, 0, 255))
bluegoal_rect = REDGOAL.get_rect(topleft=(1100, 340))
bluegoal_mask = pg.mask.from_surface(REDGOAL)
BLUECAR_ORIGINAL = pygame.Surface((50, 30), pygame.SRCALPHA)
pygame.draw.polygon(
    BLUECAR_ORIGINAL, (0, 0, 255), [(0, 30), (50, 20), (50,10), (0, 0)])
bluecar = BLUECAR_ORIGINAL
REDCAR_ORIGINAL = pygame.Surface((50, 30), pygame.SRCALPHA)
pygame.draw.polygon(
    REDCAR_ORIGINAL, (255, 0, 0), [(0, 30), (50, 20), (50, 10), (0, 0)])
redcar = REDCAR_ORIGINAL
redspeed = 5
bluespeed = 5
ball_x = 575
ball_y = 400
dx = 0
dy = 0
x = 800
y = 500
redscore = 0
bluescore = 0
BALL = pygame.Surface((30, 30), pygame.SRCALPHA)
pygame.draw.circle(BALL, [0,0,0], [15, 15], 15)
ball_pos = Vector2(ball_x, ball_y)
ballrect = BALL.get_rect(center=ball_pos)
ball_vel = Vector2(dx, dy)
ball_mask = pg.mask.from_surface(BALL)
pos_red = Vector2(x,y)
vel_red = Vector2(redspeed,0)
redrect = redcar.get_rect(center=pos_red)
redangle = 180
mask_red = pygame.mask.from_surface(redcar)
mask_ball = pygame.mask.from_surface(BALL)
ballrect = BALL.get_rect(center=ball_pos)
vel_red.rotate_ip(-180)

def redgoal():
        ball_vel.x = 0
        ball_vel.y = 0
        ball_pos.x = 575
        ball_pos.y = 400
        vel_red.x = redspeed
        vel_red.y = 0
        pos_red.x = 800
        pos_red.y = 370
        redangle = 180
        vel_red.rotate_ip(-180)   

run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    if y <0:
        y = 10
    if y > 450:
        y = 440
    if x > 480:
        x = 470

    if ballrect.top < 0 and ball_vel.y < 0:
        ball_vel.y *= -1
    elif ballrect.bottom > screen.get_height() and ball_vel.y > 0:
        ball_vel.y *= -1
    if ballrect.left < 0 and ball_vel.x < 0:
        ball_vel.x *= -1
    elif ballrect.right > screen.get_width() and ball_vel.x > 0:
        ball_vel.x *= -1

    if redrect.top < 0 and vel_red.y < 0:
        vel_red.y *= -1
        redangle == 0
    elif redrect.bottom > screen.get_height() and vel_red.y > 0:
        vel_red.y *= -1
        redangle == 0
    if redrect.left < 0 and vel_red.x < 0:
        vel_red.x *= -1
        redangle == 0
    elif redrect.right > screen.get_width() and vel_red.x > 0:
        vel_red.x *= -1
        redangle == 0   

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        redangle += 5
        vel_red.rotate_ip(-5)
        redcar = pygame.transform.rotate(REDCAR_ORIGINAL, redangle)
        redrect = redcar.get_rect(center=redrect.center)
        mask_red = pygame.mask.from_surface(redcar)
    elif keys[pygame.K_RIGHT]:
        redangle -= 5
        vel_red.rotate_ip(5)
        redcar = pygame.transform.rotate(REDCAR_ORIGINAL, redangle)
        redrect = redcar.get_rect(center=redrect.center)
        mask_red = pygame.mask.from_surface(redcar)
    elif keys[pygame.K_UP]:
        vel_red.scale_to_length(10)

    pos_red += vel_red
    redrect.center = pos_red
    ball_vel *= .97  
    ball_pos += ball_vel
    ballrect.center = ball_pos

    offset_red = redrect[0] - ballrect[0], redrect[1] - ballrect[1]
    overlap_red = mask_ball.overlap(mask_red, offset_red)

    offset = redgoal_rect[0] - ballrect[0], redgoal_rect[1] - ballrect[1]
    redgoaloverlap = ball_mask.overlap(redgoal_mask, offset)

    if redgoaloverlap:
        redgoal()

    elif overlap_red:  
        ball_vel = Vector2(vel_red) * 1.4

    screen.blit(bgimg,(0,0))
    screen.blit(BALL, ballrect)
    screen.blit(redcar, redrect)
    screen.blit(REDGOAL, redgoal_rect)

    pygame.display.flip()
    pygame.display.update()
pygame.quit()

最佳答案

如果你想沿着边框滑动而不是弹跳,你可以设置矩形的 top等属性到离开屏幕时的边框坐标,然后设置 pos_red矢量到rect.center坐标。速度将不受影响。

要更改汽车图像的初始旋转,您需要 pg.transform.rotate具有所需的角度:redcar = pg.transform.rotate(REDCAR_ORIGINAL, redangle)

并且 vel_red 向量的 x 分量在程序开始时应该为负(指向左侧):vel_red = Vector2(-redspeed, 0) .

import pygame as pg
from pygame.math import Vector2


pg.init()
screen = pg.display.set_mode((1150, 800))
clock = pg.time.Clock()

REDCAR_ORIGINAL = pg.Surface((50, 30), pg.SRCALPHA)
pg.draw.polygon(
    REDCAR_ORIGINAL, (255, 0, 0), [(0, 30), (50, 20), (50, 10), (0, 0)])
redangle = 180
# Rotate the image/surface before the game starts.
redcar = pg.transform.rotate(REDCAR_ORIGINAL, redangle)
redspeed = 5
pos_red = Vector2(800, 500)
# -redspeed means the vector points to the left.
vel_red = Vector2(-redspeed, 0)
redrect = redcar.get_rect(center=pos_red)
mask_red = pg.mask.from_surface(redcar)

run = True
while run:
    for event in pg.event.get():
        if event.type == pg.QUIT:
            run = False
        elif event.type == pg.KEYDOWN:
            if event.key == pg.K_r:
                # Reset the car to the start position.
                redangle = 180
                redcar = pg.transform.rotate(REDCAR_ORIGINAL, redangle)
                pos_red = Vector2(800, 500)
                vel_red = Vector2(-redspeed, 0)
                redrect = redcar.get_rect(center=pos_red)
                mask_red = pg.mask.from_surface(redcar)

    keys = pg.key.get_pressed()
    if keys[pg.K_LEFT]:
        redangle += 5
        vel_red.rotate_ip(-5)
        redcar = pg.transform.rotate(REDCAR_ORIGINAL, redangle)
        redrect = redcar.get_rect(center=redrect.center)
        mask_red = pg.mask.from_surface(redcar)
    elif keys[pg.K_RIGHT]:
        redangle -= 5
        vel_red.rotate_ip(5)
        redcar = pg.transform.rotate(REDCAR_ORIGINAL, redangle)
        redrect = redcar.get_rect(center=redrect.center)
        mask_red = pg.mask.from_surface(redcar)
    elif keys[pg.K_UP]:
        vel_red.scale_to_length(10)

    # Move the car.
    pos_red += vel_red
    redrect.center = pos_red

    # Slide at the borders.
    if redrect.top < 0 and vel_red.y < 0:
        redrect.top = 0
        pos_red = Vector2(redrect.center)
    elif redrect.bottom > screen.get_height() and vel_red.y > 0:
        redrect.bottom = screen.get_height()
        pos_red = Vector2(redrect.center)
    if redrect.left < 0 and vel_red.x < 0:
        redrect.left = 0
        pos_red = Vector2(redrect.center)
    elif redrect.right > screen.get_width() and vel_red.x > 0:
        redrect.right = screen.get_width()
        pos_red = Vector2(redrect.center)

    # Blit everything.
    screen.fill((30, 110, 30))
    screen.blit(redcar, redrect)
    rec = pg.Rect(800, 500, 50, 30)
    rec.center = (800, 500)
    pg.draw.rect(screen, (90, 20, 20), rec, 1)  # Start position.
    pg.display.flip()
    clock.tick(60)

pg.quit()

关于python - Pygame - 事件后 Sprite 的旋转不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51857329/

相关文章:

python - ValueError : Error when checking target: expected dense_6 to have shape (46, )但得到形状为(1,)的数组

python - 类型错误 : It would appear that nargs is set to conflict with the composite type arity

python - python中json对象的内部字典解析

python-3.x - 如何在 FastAPI 中将单个参数以 JSON 形式发布?

python - 在 Python 3.6 中使用 "or"或 "or-like"语句

python - Pygame - 无法将整个文本放在不同的行中

python - 使用pygame获取位置的像素颜色

python:清理字符串

python-3.x - 有没有办法将分类值反转为原始字符串或文本值?

python - 适用于 Python 的 Mac 和 Windows 兼容 GUI,它易于安装并可与 pygame 一起使用?