Python Pygame强制

时间:2016-07-17 01:14:37

标签: python pygame

我一直想为我的游戏创建一个物理引擎,并决定我应该首先覆盖力量。我在python上使用pygame来实现这一目标。

例如,我希望能够编写一个特定幅度的力,它作用于一个物体。我无法想到任何方法来做到这一点。在我得到基本策略之后,应该很容易减去力的大小并添加各种不同的属性。这是我的源代码:

import pygame

pygame.init()

display_width = 800
display_height = 600

gameDisplay = pygame.display.set_mode((display_width, display_height))
pygame.display.set_caption('Physics Engine')
clock = pygame.time.Clock()

x = display_width / 2
y = display_height / 2


gameExit = False

def force():
    # force function
    # Code here

y_change = 0
x_change = 0

while not gameExit:



    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
        elif event.type == pygame.KEYDOWN:  # check for key presses
            if event.key == pygame.K_LEFT:  # left arrow turns left
                x_change = -10
                y_change = 0
            elif event.key == pygame.K_RIGHT:  # right arrow turns right
                x_change = 10
                y_change = 0


    y += y_change
    x += x_change

    print(x, y)

    gameDisplay.fill((255, 255, 255))
    pygame.draw.rect(gameDisplay, (255, 0, 0), [x, y, 30, 30])
    pygame.display.update()

    clock.tick(25)

pygame.quit()
quit()

截至目前,它只是一个左右移动的红色方块。我想要的是,如果我按住箭头键移动,当我释放它停止。我尝试在事件中使用布尔值,但它似乎不想工作。

我想实现一个简单的重力因子。

非常感谢您的阅读!

2 个答案:

答案 0 :(得分:1)

我可以看到几点。首先,如果您希望在按住键的同时发生效果,则应该查询该键是否已关闭,而不是仅按下。忽略KEYDOWN事件并使用http://www.pygame.org/docs/ref/key.html#pygame.key.get_pressed 代替。其次,您应该为位置,速度等定义或使用库类...这将为您提供一组具体的操作。

从那里基本的想法是查询键,设置此更新的加速度和重力,通过加速更新旧速度设置速度,通过用速度更新旧位置设置位置,并永远重复。

答案 1 :(得分:0)

当施加力时,它会根据力的方向的质量为物体增加加速度。

首先,我建议为对象的质量,x和y速度及其x和y合力分量创建变量。当力添加到对象时,根据其x和y分量添加它会更容易(如果您希望使用角度和幅度定义力,可以使用opposite = sin(angle) * hypotenuse和{{1将力分解为组件。但要小心 - adjacent = cos(angle) * hypotenuse模块使用弧度,math使用度数。

要在屏幕上施加力,您可以使用pygame查找对象上的x和y加速度,并将这些更改应用于对象的x和y速度(这是你的force = mass * accelerationx_change)。然后将x和y速度应用于对象的位置。

如果您希望它以米和秒的形式工作,而不是像素和帧,您还需要为此进行转换:只需使用y_change值来计算帧数每秒,你可以弥补每米像素的值。

对于重力,施加的力=质量*重力场强度(地球上的重力场强度为9.81牛顿/千克)。使用此公式,您可以像对待任何其他力一样为对象添加重力。由于重力引起的加速度总是与引力场强度相同,如果没有施加其他垂直力,这可能是有用的。