我创造了一款游戏,但是我在控制玩家跳跃方面遇到了问题。此代码是仅显示跳转问题的简化版本。请记住,在游戏本身中,FPS可能会在跳跃中有所不同。我已经将跳转代码分开,因此它更容易识别,并且使用向上/向下箭头可以更改FPS以进行测试。
问题
FPS越高,跳跃越小,FPS越低,跳跃越高。
预期结果
跳跃在许多不同的FPS上达到相同的高度。示例:30和120 FPS
代码
import socket
import sys
import select
import threading
SERVER_IP = '192.168.1.4'
PORT = 8686
TIMEOUT = 5
BUF_SIZE = 1024
MESSAGES = ['testdata1', 'testdata2']
class Client(threading.Thread):
def __init__(self, host=SERVER_IP, port=PORT):
threading.Thread.__init__(self)
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock = socket.create_connection((host, port), 1)
self.sock.setblocking(0)
while 1:
try:
global MESSAGES
ready = select.select([self.sock], [], [], TIMEOUT*1000)
if ready[0]:
buf = self.sock.recv(BUF_SIZE)
print buf
#TODO:do stuff with buf
print 'messages left:'+str(len(MESSAGES))
if len(MESSAGES)>0:
self.sock.send(MESSAGES.pop())
except KeyboardInterrupt:
self.sock.close()
sys.exit(1)
except Exception, e:
print '\n[ERR] %s' % e
self.sock.close()
sys.exit(1)
def run(self):
pass
def sendData(self, data):
global MESSAGES
print 'appending data:%s' % data
MESSAGES.append(data)
def main():
client = Client()
client.start()
client.sendData("test1")
client.sendData("test2")
client.sendData("test3")
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
sys.exit(1)
答案 0 :(得分:1)
您应将初始跳跃速度设置为与帧速率无关,即:
Move = 480
请注意,当您更新速度(或在您的情况下,它看起来,速度)时,您需要除以帧速率,因为您基本上乘以时间间隔:v ~ u + a*dt
。更新职位时同样适用,因此应为Y += Move / Current_FPS
。
还有其他一些值得一提的事情。为什么要跟踪方向变量?为什么不让变量Move
成为速度。这样你只需要:Y += Move / Current_FPS
并且正/负值表示方向。此外,你的引力目前在下降的过程中比在上升时强很多,但这可能完全是故意的!