gpt4 book ai didi

python - 如何在 Pygame 中制作基本的汽车物理?

转载 作者:行者123 更新时间:2023-12-03 13:56:37 24 4
gpt4 key购买 nike

enter image description here
我想知道如何使用箭头键制作一辆可以移动和旋转的汽车。我正在尝试制作一个汽车物理游戏,玩家可以在其中控制汽车并四处行驶和 parking ,但是我在如何开始实现控制方面遇到了麻烦。我怎样才能让我的车用箭头键沿着它旋转的方向移动?
例如,如果我按下后退箭头键,汽车应该倒车,如果汽车在倒车的同时也在转弯,它应该按照汽车转弯的方式移动。
这是我现在的代码。现在真的没有任何事情发生。

import pygame
pygame.init()

window = pygame.display.set_mode((800,800))
pygame.display.set_caption("car game")

class car:
def __init__(self,x,y,height,width,color):
self.x = x
self.y = y
self.height = height
self.width = width
self.color = color
self.carimage = pygame.image.load("1.png")
self.rect = pygame.Rect(x,y,height,width)
def draw(self):
self.rect.topleft = (self.x,self.y)
window.blit(self.carimage,self.rect)

white = (255,255,2555)
car1 = car(300,300,20,20,white)

def ReDrawWindow():
car1.draw()

# main loop
runninggame = True
while runninggame:
for event in pygame.event.get():
if event.type == pygame.QUIT:
runninggame = False
ReDrawWindow()
pygame.display.update()

pygame.quit()

最佳答案

这是改进后的代码:

import pygame, math
pygame.init()

window = pygame.display.set_mode((600,600))
pygame.display.set_caption("car game")
img = pygame.image.load("1.png")

class Car:
def __init__(self, x, y, height, width, color):
self.x = x - width / 2
self.y = y - height / 2
self.height = height
self.width = width
self.color = color
self.rect = pygame.Rect(x, y, height, width)
self.surface = pygame.Surface((height, width)) # 1
self.surface.blit(img, (0, 0))
self.angle = 0
self.speed = 0 # 2

def draw(self): # 3
self.rect.topleft = (int(self.x), int(self.y))
rotated = pygame.transform.rotate(self.surface, self.angle)
surface_rect = self.surface.get_rect(topleft = self.rect.topleft)
new_rect = rotated.get_rect(center = surface_rect.center)
window.blit(rotated, new_rect.topleft)

white = (255, 255, 255)
car1 = Car(300, 300, 73, 73, white) # 4
clock = pygame.time.Clock()

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

pressed = pygame.key.get_pressed()
car1.speed *= 0.9 # 5
if pressed[pygame.K_UP]: car1.speed += 0.5 # 6
if pressed[pygame.K_DOWN]: car1.speed -= 0.5 # 6

if pressed[pygame.K_LEFT]: car1.angle += car1.speed / 2 # 7
if pressed[pygame.K_RIGHT]: car1.angle -= car1.speed / 2 # 7
car1.x -= car1.speed * math.sin(math.radians(car1.angle)) # 8
car1.y -= car1.speed * math.cos(math.radians(-car1.angle)) # 8

window.fill((0, 0, 0)) # 9
car1.draw()
pygame.display.flip()
clock.tick(60) # 10

pygame.quit()
需要注意的一些事项:
  • 我创建了一个用于绘制图片的新表面。这使它更容易旋转。
  • 我为汽车创建了一个速度变量来存储它的速度。我稍后用它来获得动力。
  • draw 函数逆时针旋转图像,因为这就是 Pygame 的工作方式。查看我使用的代码。
  • 我用的汽车尺寸是73, 73。把这个做成你图片的宽度和高度,否则汽车不能正常转弯。
  • 我会稍微降低速度,这样当你不向前按压时,汽车会继续行驶一会儿。
  • 当汽车前后移动时,其最大速度为每帧 5 个像素。 (因为 5 * 0.9 + 0.5 = 5。)
  • 汽车转弯的角度取决于速度。
  • 这是我之前想说的三角学。因为 math.sin 和 math.cos 使用弧度,所以我必须将度数转换为弧度。
  • 我用黑色填充了屏幕,这样你就不会看到早期的帧。
  • clock.tick用来防止它过快,它的意思是“每秒最多 60 帧”。

  • 我希望你明白一切。

    关于python - 如何在 Pygame 中制作基本的汽车物理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62240557/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com