Module AggiEngine.gameobjecthandler
Expand source code
from typing import Optional
import PySide2
from AggiEngine.contactlistener import ContactListener
import math
from Box2D import *
class GameObjectHandler:
    def __init__(self, window, scale: Optional[float] = 16):
        self.timing = 1 / window.targetFixedFPS
        self.window = window
        
        self.world = Box2D.b2World(gravity=(0, -9.8))  # create instance of box 2d world
        self.world.contactListener = ContactListener()
        
        self.scale = scale  # scaling parameter, is equal to pixels to meter
        self.gameObjects = []  # game object list
        self.removeList = []
    def setScale(self, scale: float) -> None:
        '''
        Set the pixels per meter scale for TMX, OpenGL, and Box2D calculations
        '''
        self.scale = scale
    def update(self) -> None:
        '''
        Calls update on all game objects, variable timing rate. Triggered back screen draws.
        '''
        for gameObject in self.gameObjects:
            if gameObject.active:
                gameObject.update()
    def fixedUpdate(self) -> None:
        '''
        Updates the Box2D world then game objects on a fixed time interval.
        '''
        self.world.Step(self.timing, 6, 2)
        self.world.ClearForces()
        newRenderInfoList = []
        for gameObject in self.gameObjects:
            info = [gameObject.textureID]
            if gameObject.textureID == -1:
                if len(gameObject.color) < 4:
                    gameObject.color.append(1)
                info += [gameObject.vertices, gameObject.color]
            else:
                info += [gameObject.width, gameObject.height]
            if gameObject.active:
                gameObject.fixedUpdate()
                if gameObject.body is not None:
                    gameObject.position = gameObject.body.position / self.scale
                    gameObject.rotation = gameObject.body.angle
                info += [gameObject.position, math.degrees(gameObject.rotation)]
            newRenderInfoList.append(info)
        if self.window.gameScreen is not None:
            self.window.gameScreen.renderInfoList = newRenderInfoList
        for gameObject in self.removeList:
            self.gameObjects.remove(gameObject)
            self.world.DestroyBody(gameObject.body)
        self.removeList = []
    def add(self, gameObject: object, bodyDef: Optional[b2BodyDef] = None,
            bodyFixtureDef: Optional[b2FixtureDef] = None,
            color: list = None) -> None:
        '''
        Creates a game object.
        '''
        self.gameObjects.append(gameObject)  # adds game object to list of game objects
        gameObject.gameObjectHandler = self
        if bodyDef:
            body = self.world.CreateBody(bodyDef)
            body.CreateFixture(bodyFixtureDef)
            gameObject.body = body
            gameObject.body.userData = gameObject
            gameObject.body.userData = gameObject
            if type(bodyFixtureDef.shape) is b2PolygonShape:
                gameObject.vertices.clear()
                for vertex in bodyFixtureDef.shape.vertices:
                    gameObject.vertices.append([vertex[0] / self.scale, vertex[1] / self.scale])
            elif type(bodyFixtureDef.shape) is b2CircleShape:
                vertices = []
                for i in range(0, 30):
                    rad = (2 * math.pi * i) / 30
                    r = bodyFixtureDef.shape.radius / self.scale
                    vertices.append([(r * math.cos(rad) - (bodyFixtureDef.shape.pos[0] / self.scale)),
                                     (r * math.sin(rad) - (bodyFixtureDef.shape.pos[1] / self.scale))])
                gameObject.vertices = vertices
            if color is None:
                gameObject.color = [1, 1, 1, 1]
            else:
                gameObject.color = color
            gameObject.position = body.position / self.scale
        gameObject.window = self.window
        gameObject.start()
    def getGameObject(self, typeOf: type):
        '''
        Returns the first instance of the game object with the type passed
        '''
        for gameObject in self.gameObjects:
            if isinstance(gameObject, typeOf):
                return gameObject
    def getGameObjects(self, typeOf: type) -> object:
        '''
        Returns all instances of game objects with the type passed
        '''
        gameObjects = []
        for gameObject in self.gameObjects:
            if isinstance(gameObject, typeOf):
                gameObjects.append(gameObject)
        return gameObjects
    def removeGameObject(self, toRemove: object) -> None:
        '''
        Removes the gameObject passed
        '''
        self.removeList.append(toRemove)
    def removeGameObjects(self, typeOf: type) -> None:
        '''
        Removes all game objects with the type passed
        '''
        for gameObject in self.gameObjects:
            if isinstance(gameObject, typeOf):
                self.removeList.append(gameObject)
    def exit(self) -> None:
        '''
        Trigger exit on all game objects, called when state exits
        '''
        for gameObject in self.gameObjects:
            gameObject.exit()
    def keyPressed(self, event: PySide2.QtGui.QKeyEvent) -> None:
        '''
        Trigger keyPressed on all game objects, called when a key is pressed
        '''
        for gameObject in self.gameObjects:
            gameObject.keyPressed(event)
    def keyReleased(self, event: PySide2.QtGui.QKeyEvent) -> None:
        '''
        Trigger keyReleased on all game objects, called when a key is released
        '''
        for gameObject in self.gameObjects:
            gameObject.keyReleased(event)
    def mouseMoved(self, event: PySide2.QtGui.QMouseEvent) -> None:
        '''
        Trigger mouseMoved on all game objects, called when the mouse is moved
        '''    
        for gameObject in self.gameObjects:
            gameObject.mouseMoved(event)
    def mousePressed(self, event: PySide2.QtGui.QMouseEvent) -> None:
        '''
        Trigger mousePressed on all game objects, called when a mouse key is pressed
        '''
        for gameObject in self.gameObjects:
            gameObject.mousePressed(event)
    def mouseReleased(self, event: PySide2.QtGui.QMouseEvent) -> None:
        '''
        Trigger mouseReleased on all game objects, called when a mouse key is released
        '''
        for gameObject in self.gameObjects:
            gameObject.mouseReleased(event)
Classes
class GameObjectHandler (window, scale: typing.Union[float, NoneType] = 16)- 
Expand source code
class GameObjectHandler: def __init__(self, window, scale: Optional[float] = 16): self.timing = 1 / window.targetFixedFPS self.window = window self.world = Box2D.b2World(gravity=(0, -9.8)) # create instance of box 2d world self.world.contactListener = ContactListener() self.scale = scale # scaling parameter, is equal to pixels to meter self.gameObjects = [] # game object list self.removeList = [] def setScale(self, scale: float) -> None: ''' Set the pixels per meter scale for TMX, OpenGL, and Box2D calculations ''' self.scale = scale def update(self) -> None: ''' Calls update on all game objects, variable timing rate. Triggered back screen draws. ''' for gameObject in self.gameObjects: if gameObject.active: gameObject.update() def fixedUpdate(self) -> None: ''' Updates the Box2D world then game objects on a fixed time interval. ''' self.world.Step(self.timing, 6, 2) self.world.ClearForces() newRenderInfoList = [] for gameObject in self.gameObjects: info = [gameObject.textureID] if gameObject.textureID == -1: if len(gameObject.color) < 4: gameObject.color.append(1) info += [gameObject.vertices, gameObject.color] else: info += [gameObject.width, gameObject.height] if gameObject.active: gameObject.fixedUpdate() if gameObject.body is not None: gameObject.position = gameObject.body.position / self.scale gameObject.rotation = gameObject.body.angle info += [gameObject.position, math.degrees(gameObject.rotation)] newRenderInfoList.append(info) if self.window.gameScreen is not None: self.window.gameScreen.renderInfoList = newRenderInfoList for gameObject in self.removeList: self.gameObjects.remove(gameObject) self.world.DestroyBody(gameObject.body) self.removeList = [] def add(self, gameObject: object, bodyDef: Optional[b2BodyDef] = None, bodyFixtureDef: Optional[b2FixtureDef] = None, color: list = None) -> None: ''' Creates a game object. ''' self.gameObjects.append(gameObject) # adds game object to list of game objects gameObject.gameObjectHandler = self if bodyDef: body = self.world.CreateBody(bodyDef) body.CreateFixture(bodyFixtureDef) gameObject.body = body gameObject.body.userData = gameObject gameObject.body.userData = gameObject if type(bodyFixtureDef.shape) is b2PolygonShape: gameObject.vertices.clear() for vertex in bodyFixtureDef.shape.vertices: gameObject.vertices.append([vertex[0] / self.scale, vertex[1] / self.scale]) elif type(bodyFixtureDef.shape) is b2CircleShape: vertices = [] for i in range(0, 30): rad = (2 * math.pi * i) / 30 r = bodyFixtureDef.shape.radius / self.scale vertices.append([(r * math.cos(rad) - (bodyFixtureDef.shape.pos[0] / self.scale)), (r * math.sin(rad) - (bodyFixtureDef.shape.pos[1] / self.scale))]) gameObject.vertices = vertices if color is None: gameObject.color = [1, 1, 1, 1] else: gameObject.color = color gameObject.position = body.position / self.scale gameObject.window = self.window gameObject.start() def getGameObject(self, typeOf: type): ''' Returns the first instance of the game object with the type passed ''' for gameObject in self.gameObjects: if isinstance(gameObject, typeOf): return gameObject def getGameObjects(self, typeOf: type) -> object: ''' Returns all instances of game objects with the type passed ''' gameObjects = [] for gameObject in self.gameObjects: if isinstance(gameObject, typeOf): gameObjects.append(gameObject) return gameObjects def removeGameObject(self, toRemove: object) -> None: ''' Removes the gameObject passed ''' self.removeList.append(toRemove) def removeGameObjects(self, typeOf: type) -> None: ''' Removes all game objects with the type passed ''' for gameObject in self.gameObjects: if isinstance(gameObject, typeOf): self.removeList.append(gameObject) def exit(self) -> None: ''' Trigger exit on all game objects, called when state exits ''' for gameObject in self.gameObjects: gameObject.exit() def keyPressed(self, event: PySide2.QtGui.QKeyEvent) -> None: ''' Trigger keyPressed on all game objects, called when a key is pressed ''' for gameObject in self.gameObjects: gameObject.keyPressed(event) def keyReleased(self, event: PySide2.QtGui.QKeyEvent) -> None: ''' Trigger keyReleased on all game objects, called when a key is released ''' for gameObject in self.gameObjects: gameObject.keyReleased(event) def mouseMoved(self, event: PySide2.QtGui.QMouseEvent) -> None: ''' Trigger mouseMoved on all game objects, called when the mouse is moved ''' for gameObject in self.gameObjects: gameObject.mouseMoved(event) def mousePressed(self, event: PySide2.QtGui.QMouseEvent) -> None: ''' Trigger mousePressed on all game objects, called when a mouse key is pressed ''' for gameObject in self.gameObjects: gameObject.mousePressed(event) def mouseReleased(self, event: PySide2.QtGui.QMouseEvent) -> None: ''' Trigger mouseReleased on all game objects, called when a mouse key is released ''' for gameObject in self.gameObjects: gameObject.mouseReleased(event)Methods
def add(self, gameObject: object, bodyDef: typing.Union[Box2D.Box2D.b2BodyDef, NoneType] = None, bodyFixtureDef: typing.Union[Box2D.Box2D.b2FixtureDef, NoneType] = None, color: list = None) ‑> NoneType- 
Creates a game object.
Expand source code
def add(self, gameObject: object, bodyDef: Optional[b2BodyDef] = None, bodyFixtureDef: Optional[b2FixtureDef] = None, color: list = None) -> None: ''' Creates a game object. ''' self.gameObjects.append(gameObject) # adds game object to list of game objects gameObject.gameObjectHandler = self if bodyDef: body = self.world.CreateBody(bodyDef) body.CreateFixture(bodyFixtureDef) gameObject.body = body gameObject.body.userData = gameObject gameObject.body.userData = gameObject if type(bodyFixtureDef.shape) is b2PolygonShape: gameObject.vertices.clear() for vertex in bodyFixtureDef.shape.vertices: gameObject.vertices.append([vertex[0] / self.scale, vertex[1] / self.scale]) elif type(bodyFixtureDef.shape) is b2CircleShape: vertices = [] for i in range(0, 30): rad = (2 * math.pi * i) / 30 r = bodyFixtureDef.shape.radius / self.scale vertices.append([(r * math.cos(rad) - (bodyFixtureDef.shape.pos[0] / self.scale)), (r * math.sin(rad) - (bodyFixtureDef.shape.pos[1] / self.scale))]) gameObject.vertices = vertices if color is None: gameObject.color = [1, 1, 1, 1] else: gameObject.color = color gameObject.position = body.position / self.scale gameObject.window = self.window gameObject.start() def exit(self) ‑> NoneType- 
Trigger exit on all game objects, called when state exits
Expand source code
def exit(self) -> None: ''' Trigger exit on all game objects, called when state exits ''' for gameObject in self.gameObjects: gameObject.exit() def fixedUpdate(self) ‑> NoneType- 
Updates the Box2D world then game objects on a fixed time interval.
Expand source code
def fixedUpdate(self) -> None: ''' Updates the Box2D world then game objects on a fixed time interval. ''' self.world.Step(self.timing, 6, 2) self.world.ClearForces() newRenderInfoList = [] for gameObject in self.gameObjects: info = [gameObject.textureID] if gameObject.textureID == -1: if len(gameObject.color) < 4: gameObject.color.append(1) info += [gameObject.vertices, gameObject.color] else: info += [gameObject.width, gameObject.height] if gameObject.active: gameObject.fixedUpdate() if gameObject.body is not None: gameObject.position = gameObject.body.position / self.scale gameObject.rotation = gameObject.body.angle info += [gameObject.position, math.degrees(gameObject.rotation)] newRenderInfoList.append(info) if self.window.gameScreen is not None: self.window.gameScreen.renderInfoList = newRenderInfoList for gameObject in self.removeList: self.gameObjects.remove(gameObject) self.world.DestroyBody(gameObject.body) self.removeList = [] def getGameObject(self, typeOf: type)- 
Returns the first instance of the game object with the type passed
Expand source code
def getGameObject(self, typeOf: type): ''' Returns the first instance of the game object with the type passed ''' for gameObject in self.gameObjects: if isinstance(gameObject, typeOf): return gameObject def getGameObjects(self, typeOf: type) ‑> object- 
Returns all instances of game objects with the type passed
Expand source code
def getGameObjects(self, typeOf: type) -> object: ''' Returns all instances of game objects with the type passed ''' gameObjects = [] for gameObject in self.gameObjects: if isinstance(gameObject, typeOf): gameObjects.append(gameObject) return gameObjects def keyPressed(self, event: PySide2.QtGui.QKeyEvent) ‑> NoneType- 
Trigger keyPressed on all game objects, called when a key is pressed
Expand source code
def keyPressed(self, event: PySide2.QtGui.QKeyEvent) -> None: ''' Trigger keyPressed on all game objects, called when a key is pressed ''' for gameObject in self.gameObjects: gameObject.keyPressed(event) def keyReleased(self, event: PySide2.QtGui.QKeyEvent) ‑> NoneType- 
Trigger keyReleased on all game objects, called when a key is released
Expand source code
def keyReleased(self, event: PySide2.QtGui.QKeyEvent) -> None: ''' Trigger keyReleased on all game objects, called when a key is released ''' for gameObject in self.gameObjects: gameObject.keyReleased(event) def mouseMoved(self, event: PySide2.QtGui.QMouseEvent) ‑> NoneType- 
Trigger mouseMoved on all game objects, called when the mouse is moved
Expand source code
def mouseMoved(self, event: PySide2.QtGui.QMouseEvent) -> None: ''' Trigger mouseMoved on all game objects, called when the mouse is moved ''' for gameObject in self.gameObjects: gameObject.mouseMoved(event) def mousePressed(self, event: PySide2.QtGui.QMouseEvent) ‑> NoneType- 
Trigger mousePressed on all game objects, called when a mouse key is pressed
Expand source code
def mousePressed(self, event: PySide2.QtGui.QMouseEvent) -> None: ''' Trigger mousePressed on all game objects, called when a mouse key is pressed ''' for gameObject in self.gameObjects: gameObject.mousePressed(event) def mouseReleased(self, event: PySide2.QtGui.QMouseEvent) ‑> NoneType- 
Trigger mouseReleased on all game objects, called when a mouse key is released
Expand source code
def mouseReleased(self, event: PySide2.QtGui.QMouseEvent) -> None: ''' Trigger mouseReleased on all game objects, called when a mouse key is released ''' for gameObject in self.gameObjects: gameObject.mouseReleased(event) def removeGameObject(self, toRemove: object) ‑> NoneType- 
Removes the gameObject passed
Expand source code
def removeGameObject(self, toRemove: object) -> None: ''' Removes the gameObject passed ''' self.removeList.append(toRemove) def removeGameObjects(self, typeOf: type) ‑> NoneType- 
Removes all game objects with the type passed
Expand source code
def removeGameObjects(self, typeOf: type) -> None: ''' Removes all game objects with the type passed ''' for gameObject in self.gameObjects: if isinstance(gameObject, typeOf): self.removeList.append(gameObject) def setScale(self, scale: float) ‑> NoneType- 
Set the pixels per meter scale for TMX, OpenGL, and Box2D calculations
Expand source code
def setScale(self, scale: float) -> None: ''' Set the pixels per meter scale for TMX, OpenGL, and Box2D calculations ''' self.scale = scale def update(self) ‑> NoneType- 
Calls update on all game objects, variable timing rate. Triggered back screen draws.
Expand source code
def update(self) -> None: ''' Calls update on all game objects, variable timing rate. Triggered back screen draws. ''' for gameObject in self.gameObjects: if gameObject.active: gameObject.update()