Input and Time Module (Unity module to Python emulation)

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!

You might attach a demo blend to show how the code is working.

Remark:
The “while” statement is extremely dangerous. I’m pretty sure you know what this code is doing, but other users might do not understand the code and turn it into an endless loop. Better use an “if” statement, especially as there is no need for a loop.

Regards
Monster

Oh, sure. The “while” is now changed into “if”. Here’s the latest changes and a demo:

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.
    # ;)
    if fps != 0.0:
        dT = 1.0/fps
        return dT

Demo:scripts_lab.blend (599 KB)