游戏嘛,肯定有很多地方都与物理相关,所以需要物理建模来模拟相关的物理定律。于是乎,我就找到了一篇c++的重力系统模拟的文章(http://blog.youkuaiyun.com/poem_qianmo/article/details/7538725),然后在里面提取出了我想要的物理建模来应用到我的pygame中。
重力模拟实现起来其实非常简单,我们都知道,重力的表现形式其实就是一个大小约等于9.8米每二次方秒,方向垂直地面指向地心的加速度。且由于X轴方向的速度不受重力影响,所以我们只要将物体的速度进行正交分解,处理竖直向下的Y轴方向即可。
下面用本节的实例中的实现重力模拟的代码来具体说明,这一节着重讨论重力,所以演示时暂时先忽略下坠时的空气阻力与触地时的摩擦力。这是一个平抛运动,小球将具有水平方向的初速度,且受到向下的重力,即小球具有向下的加速度,若碰到地面就会进行反弹,速度反向。
首先我们定义下坠物体的初始坐标与初始速度,初始横坐标x=10,初始纵坐标y=10,初始水平方向速度vx=3,初始竖直方向速度vy=0,重力加速度gy=3(这里为了方便演示,我们设置为3)
def main():
x = 10 # 初始位置横坐标
y = 10 # 初始位置纵坐标
vx = 3 # 初始水平坐标速度
vy = 0 # 初始竖直坐标速度
gy = 3 # 重力加速度
然后对于重力环境的模拟代码,当触及地面之后,翻弹,速度相反
x += vx # 计算横轴坐标,每次刷新界面,横坐标x都加上一个vx的当前值
vy = vy+gy # 计算Y轴方向速度分量,每次刷新界面,vy就加上一个gy(重力加速度)
y += vy # 计算纵轴坐标,每次刷新界面,纵坐标y都加上一个vy的当前值
if y > 500:
y = 500
vy = -vy # 当触及地面之后,纵轴速度反向
整个代码如下:
import pygame
def main():
x = 10
y = 10
vx = 1
vy = 0
gy = 3
pygame.init()
clock = pygame.time.Clock()
area = [500,500]
screen = pygame.display.set_mode(area)
pygame.display.set_caption("PHY")
time = 10
while True:
screen.fill(0)
event = pygame.event.poll()
if event.type == pygame.QUIT:
pygame.quit()
exit(0)
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_n:
pygame.quit()
exit(0)
clock.tick(30)
x += vx
vy = vy+gy
y += vy
if y > 500:
y = 500
vy = -vy
pygame.draw.circle(screen,[255,0,0],[x,y],10)
pygame.display.update()
time += 1
if __name__=="__main__":
main()
好吧,python写的代码果然比c++简单明了的多,估计代码量比c++少了五分之四。感谢poem浅墨
嘿嘿,python至上!!!