I would still consider these to be somewhat incomplete since the modules in Unity have functions that I think cannot be simply emulated in the Blender Game Engine through Python.
Input.py:
from bge import logic, render, events
from math import radians, degrees
from mathutils import Vector
class Input:
def __init__(self, mouse_angle_limit, mouse_sens):
movement = {
"Horizontal" : [events.AKEY, events.DKEY],
"Vertical" : [events.SKEY, events.WKEY],
"Jump" : [None, events.SPACEKEY],
"Misc" : [None, events.LEFTSHIFTKEY]
}
actions = {
"Fire 1" : events.LEFTMOUSE,
"Fire 2" : events.RIGHTMOUSE,
"Reload" : events.RKEY,
"Use" : events.EKEY,
"Misc" : events.QKEY
}
lastKeyID = {"key" : 1}
mouse = logic.mouse
keyboard = logic.keyboard
self.angle_limit = mouse_angle_limit
self.sens = mouse_sens
self.angle = 0.0
self.movement = movement
self.actions = actions
self.lastKeyID = lastKeyID
self.mouse = mouse
self.keyboard = keyboard
def Movement(self, direction):
move = self.movement
kb = self.keyboard
state = logic.KX_INPUT_ACTIVE
if (direction == "Jump") or (direction == "Misc"):
if kb.events[move[direction][1]] == state:
return 1
else:
return 0
else:
if kb.events[move[direction][0]] == state:
return -1
elif kb.events[move[direction][1]] == state:
return 1
else:
return 0
def Direction(self, key):
move = self.movement
kb = self.keyboard
state = logic.KX_INPUT_ACTIVE
lastKeyID = self.lastKeyID
if (key != "Jump") or (key != "Misc"):
if kb.events[move[key][0]] == state:
lastKeyID.update({"key" : -1})
return -1
elif kb.events[move[key][1]] == state:
lastKeyID.update({"key" : 1})
return 1
else:
return lastKeyID["key"]
def MouseEvents(self, status):
m = self.mouse
for evt, sts in m.events:
if sts == status:
return evt
elif sts == logic.KX_INPUT_NONE:
return 0
def MouseLook(self):
c = logic.getCurrentController()
o = c.owner
ms = c.sensors["Mouse"]
mx, my = ms.position
currentRot = o.localOrientation.to_euler()
par = o.parent
width = render.getWindowWidth()
height = render.getWindowHeight()
sens = self.sens
angle_limit = self.angle_limit
w2, h2 = [width//2, height//2]
move_x = (w2 - mx)*sens
move_y = (h2 - my)*sens
cap = radians(angle_limit)
if (self.angle >= cap) and (move_y > 0.0):
move_y = 0.0
while (self.angle > cap):
diff = self.angle - cap
self.angle -= diff
if (self.angle <= -cap) and (move_y < 0.0):
move_y = 0.0
while (self.angle < -cap):
diff = -self.angle - cap
self.angle += diff
self.angle += move_y
o.localOrientation = Vector([self.angle, currentRot.y, currentRot.z])
par.applyRotation([0.0, 0.0, move_x], True)
render.setMousePosition(w2, h2)
Time.py:
from time import time
from bge.logic import getAverageFrameRate
def deltaTime():
fps = getAverageFrameRate()
# This upcoming section is for making sure
# that you would never, ever divide by zero.
# ;)
while fps != 0.0:
dT = 1.0/fps
return dT
I hope you all would find these scripts useful in your projects!