Pygame - 重力方法

时间:2016-03-05 21:49:27

标签: python pygame gravity

我正在用pygame制作一个简单的游戏。它希望成为一个平台游戏RPG。但对于这个问题,这既不是最终的也不是相关的。到目前为止,我在游戏中的功能非常少。如果那样的话,这只是一个骨架。我的问题有两点:

  • 最好(在性能和灵活性方面)将重力添加到pygame中的类的方法是什么?
  • 一般来说,增加引力的最佳做法是什么?例如,你只是简单地做一个“如果keyPressed == k_W然后从玩家-Y中减去每个刻度2个像素20个刻度”或者在向上或负y方向上有速度的东西吗?

我已经看过其他关于在游戏之后添加重力的帖子,其中在初始开发期间没有考虑添加它。我想尽早添加它,而不是将重力添加到其他东西,我可以添加其他东西重力。我将继续阅读这篇文章,所以如果您希望将我指向一些在线资源的方向,我也非常感谢!

2 个答案:

答案 0 :(得分:0)

快速排除:我不知道多种方法来引入重力,所以我不能说哪个是最好的"。但是,如果你在Python中与性能战斗争,你可能会打错战。

对于重力,您可以使用矢量系统。假设一个角色跳离地面并且初始速度为[5,-15](负y因为正y向下!),你可以每帧移动角色的矩形以模拟运动。要将重力投入此中,您需要每秒 9.8添加到您的y速度分量值。因此1秒钟内,速度约为[5,-5]。这将让你的角色慢慢停下来,然后开始向下移动。

对于按键移动,我建议使用布尔值。例如,在按下k_U时,表示您正在向上移动的变量变为True。然后,如果此变量为True,则移动他,例如[0,-5]。在keyup时,将变量设置为false。这样做是为了北/东/南/西,然后你有一个4个方向的移动系统,当你按住键时移动你。

答案 1 :(得分:0)

我在这段代码中使用了1/2 mg ^ 2等式,它具有类似雪的效果:

import math, sys, random, time
import pygame, inputbox
from pygame.locals import *

class flake:

    def __init__(self, xpos, ypos, mass, color, drift):
        self.xpos = xpos
        self.ypos = ypos
        self.mass = mass
        self.rect = pygame.Rect(xpos, ypos, 2, 2)
        self.checked = False
        self.color = color
        self.drift = drift

size = width, height = 510, 700

BLACK = (0,0,0)
WHITE = (255, 255, 255)
GREY = (128,128,128)
DARKGREY = (169,169,169)
SILVER = (192,192,192)
LIGHTGREY = (211,211,211)
LIGHTESTGREY = (220,220,220)

pygame.init()     

screen = pygame.display.set_mode(size)
background = pygame.Surface(screen.get_size())
background = background.convert()
background.fill(BLACK)

def init():

    global theSnow, snowColours, clock, startrange

    theSnow = []
    snowColours = []

    snowColours.append(WHITE)
    snowColours.append(GREY)
    snowColours.append(DARKGREY)
    snowColours.append(SILVER)
    snowColours.append(LIGHTGREY)
    snowColours.append(LIGHTESTGREY)

    for c in range(2000):
        mass = 0.0
        mass = float(random.randint(1,8) / 100.0)
        xpos = random.randint(0,width)
        ypos = random.randint(0,5)
        ypos = -ypos
        drift = ypos/10.0

        colour = snowColours[random.randint(0,5)]

        f = flake(xpos, ypos, mass, colour, drift)
        theSnow.append(f)       
        print "flake x = " + str(f.xpos) + "   y = " + str(f.ypos) + "   mass = " + str(f.mass)             

    startrange = 200
    clock = pygame.time.Clock() 

def run():

    global theSnow, clock
    global startrange

    newrange = 0

    while True:
        events = pygame.event.get()
        for event in events:
            if event.type == pygame.QUIT:
                sys.exit()
        keys=pygame.key.get_pressed()

        if keys[K_q]:
            return

        g = 3

        for count in range(startrange):

            yinc = 0.0
            yuncertainty = float(random.randint(1,5)/10.0)
            yinc = float(0.5 * theSnow[count].mass * (g*g)) + yuncertainty
            theSnow[count].ypos += yinc

            xuncertainty = random.randint(1,10)
            if xuncertainty > 4:
                theSnow[count].xpos += theSnow[count].drift
            else:
                theSnow[count].xpos -= theSnow[count].drift

            theSnow[count].rect = pygame.Rect(theSnow[count].xpos, theSnow[count].ypos, 2,2)

            if not theSnow[count].checked:
                if theSnow[count].ypos > 30:
                    for c in range(newrange, startrange):
                        print " c= " + str(c)
                        theSnow[c].checked = True

                    if startrange < 2000:
                        startrange += 100
                        newrange = startrange - 100
                        print " newrange = " + str(newrange)
                        print " startrange = " + str(startrange)

        update()
        pygame.time.wait(10)
    #clock.tick(10)

def update():

    global theSnow, startrange
    background.fill(BLACK)

    for count in range(startrange):
        pygame.draw.rect(background, theSnow[count].color, theSnow[count].rect)

    screen.blit(background, (0, 0))
    pygame.display.flip()


if __name__ == "__main__":
    init()
    run()