我正在尝试使用vPython计算密钥的持续时间

时间:2013-12-05 18:38:18

标签: python physics game-physics final vpython

我正在为物理学决赛写一个程序。在整个学期中,我们使用vPython来模拟情境并获得确切的答案等。我们的最终项目是使用包含某种物理类型的vPython创建游戏。

我选择重拍Bowman,除了坦克。因此,屏幕右侧有一个水箱,屏幕左侧有一个墙,中间有一个墙。目标是瞄准你的大炮并以合适的速度射击你的对手的坦克。我有很好的程序完成但是我被困在一些不同的东西上。

首先,我如何计时击键?我拥有它所以我从每个大炮射击但是我希望能够按住一个键并且取决于它的持续时间以及初始速度的速度越快。

其次,我会在哪里将重力纳入计划?我有一个大致的想法,但我只是不知道将它放入哪个函数。

最后,我每次运行程序时都会随机生成一个墙高。然而,有时墙很小,你看不到它。有没有办法为此设置一系列值?

这是我的代码:

from visual import*
from random import*

scene.autoscale=False
scene.width = 1500
scene.height = 800
scene.title='Tanks'


def moveaup(gun):
    theta=arctan(gun.axis.y/gun.axis.x)
    dtheta=.1

    if (theta<pi/2):
        theta=theta+dtheta
        if not (theta>pi/2):
            gun.axis=(cos(theta),sin(theta),0)
    else:
        gun.axis=vector(0,1,0)

def moveadown(gun):
    theta=arctan(gun.axis.y/gun.axis.x)
    dtheta=.1

    if (theta>0):
        theta=theta-dtheta
        gun.axis=(cos(theta),sin(theta),0)

def movebup(gun):
    theta=arctan(gun.axis.y/gun.axis.x)+pi
    dtheta=.1

    if (theta>pi/2):
        theta=theta-dtheta
        if not (theta<pi/2):
            gun.axis=(cos(theta),sin(theta),0)
    else:
        gun.axis=vector(0,1,0)

def movebdown(gun):
    theta=arctan(gun.axis.y/gun.axis.x)+pi
    dtheta=.1

    if (theta<pi):
        theta=theta+dtheta
        gun.axis=(cos(theta),sin(theta),0)


def shoota(gun):
    vel = vector(1,1,0)
    bullet = sphere(pos=(gun.pos.x+gun.axis.x,gun.pos.y+gun.axis.y,0),radius=(.0785),color=color.yellow)
    bullet.v = vector(0,0,0)
    bullet.v = bullet.v+vel
    bulletlist.append(bullet)


def shootb(gun):
    vel = vector(-1,1,0)
    bullet = sphere(pos=(gun.pos.x+gun.axis.x,gun.pos.y+gun.axis.y,0),radius=(.0785),color=color.green)
    bullet.v = vector(0,0,0)
    bullet.v = bullet.v+vel
    bulletlist.append(bullet)

def bulletlistupdate(bulletlist):
    dt=.01
    for a in bulletlist:
        a.pos=a.pos+a.v*dt


def checks(agun,bgun):
    if scene.kb.keys:
        key=scene.kb.getkey()
        if key=='a':
            moveaup(agun)
        if key=='s':
            moveadown(agun)
        if key=='l':
            movebup(bgun)
        if key=='k':
            movebdown(bgun)
        if key=='d':
            shoota(agun)
        if key=='j':
            shootb(bgun)


#enviroment
ground = box(pos=(0,-8,0),size=(50,5,0),color=color.red)
wall = box(pos=(0,-8,0),size=(.25,20*random(),0),color=color.red)

#playerA
abody = box(pos=(-11,-5.25,0),size=(.5,.5,0),color=color.blue)
agun = cylinder(pos=(-11,-5.1,0),axis=(.8,.8,0),radius=(.08),color=color.blue)

#playerB
bbody= box(pos=(11,-5.25,0),size=(.5,.5,0),color=color.yellow)
bgun = cylinder(pos=(11,-5.1,0),axis=(-.8,.8,0),radius=(.08),color=color.yellow)

bulletlist = []

while True:
    rate(1000)
    checks(agun,bgun)
    bulletlistupdate(bulletlist)

欢迎任何和所有帮助!

非常感谢!

2 个答案:

答案 0 :(得分:2)

您可以使用time模块

在python中计时
import time

start = time.time()
finish = time.time()
print start # 1386269106.18
print finish # 1386269111.11
print (finish - start) # 4.9276599884

因此,当玩家第一次开始按下按钮时,请保存时间。然后当播放器停止按下按钮时再次节省时间。这两次之间的差异是玩家按住按钮的秒数。

[编辑]如果你能做的就是检查是否按下了键,你可以在主循环中获得时间并计算dt(已经过的时间):

t = time.time()
while True:
    new_t = time.time()
    dt = new_t - t
    t = new_t

    rate(1000)
    checks(agun,bgun, dt)
    bulletlistupdate(bulletlist)

然后将dt传递给支票,如果按下该键,您知道该键已被按下另外dt秒,并且您可以将其添加到您持有的总时间中下来。

答案 1 :(得分:0)

对于随机,您需要输入与此类似的命令:

    random.randrange(5,31) #this would give you a random range between the numbers 4-30

我不想为你做功课,因为我认为你没有要求这样做。我希望这会对你有所帮助。

对不起,这应该是适合您的正确代码:

    random.randint(7,40)  # this would get you a random integer of 7-40

我为错误的信息道歉。