def __init__(self, position=(0, 0), rotation=0.0, scale=(1, 1)): self.id = GameObject.__new_id() self.name = '' self.tags = [] self.enabled = True self.visible = True self.static = False self.__children = WeakList() self.__parent = None self.__x, self.__y = position self.__rotation = rotation self.__scale = scale self.collider = None
def __init__(self): self.all_colliders = WeakList() self.__running = True self.__exit = False
class Engine(object): '''Batma Engine object''' def __init__(self): self.all_colliders = WeakList() self.__running = True self.__exit = False # Game Loop =============================================================== def __game_loop(self): '''Game loop''' # text_fps for FPS report on screen # text_fps = batma.Text('', # position=(10, 10), # anchor='bottomleft', # font_size=62, # color=batma.Color(0.3, 0.3, 0.3, 1) # ) # Initialize the game ================================================= batma.game._initialize() batma.game._load_content() # ===================================================================== batma.clock.tick(batma.display.max_fps) while not self.__exit: tick = batma.clock.tick(batma.display.max_fps) # Event Update ==================================================== for event in pygame.event.get(): if event.type == pygame.QUIT: # self.stop() elif event.type == pygame.VIDEORESIZE: # Update the display size with the new window resolution batma.display.size = event.size else: # User defined schedule functions batma.clock.update_schedule(event) # ================================================================= # Input Update ==================================================== batma.keyboard.update(tick) batma.mouse.update(tick) # ================================================================= # Game Update and Drawing ========================================= if self.__running: batma.game._update(tick) # Clear after the update, forcing all drawing call to be # called on game.draw() batma.display.clear() batma.game._draw() # ================================================================= # Camera location ================================================= batma.camera.locate() # ================================================================= if batma.display.show_colliders: for collider in self.all_colliders.iter(): collider.draw() # if batma.display.show_fps: # text_fps.text = '%.2f'%batma.clock.get_fps() # text_fps.draw() pygame.display.flip() batma.game._unload_content() # ========================================================================= # Configuration =========================================================== def apply_config(self, game, *args, **kwargs): '''Apply new configuration to engine''' # Set up the global variables batma.game = game batma.camera = Camera() # Pygame initialization pygame.init() pygame.font.init() # Display initialization batma.display.apply_config(*args, **kwargs) # ========================================================================= # Engine Control ========================================================== def start(self): '''Starts the engine''' self.__running = True self.__exit = False batma.display.init() self.__game_loop() def pause(self): '''Pauses the engine''' self.__running = False def resume(self): '''Resume the paused engine''' self.__running = True def stop(self): '''Stop the engine and end the game''' self.__exit = True def is_running(self): '''Verify if engine is paused''' return self.__running
class GameObject(object): __ID = 1 @classmethod def __new_id(cls): id = cls.__ID cls.__ID += 1 return id def __init__(self, position=(0, 0), rotation=0.0, scale=(1, 1)): self.id = GameObject.__new_id() self.name = '' self.tags = [] self.enabled = True self.visible = True self.static = False self.__children = WeakList() self.__parent = None self.__x, self.__y = position self.__rotation = rotation self.__scale = scale self.collider = None def __del__(self): del self.collider # PARENTING =============================================================== def add_child(self, child, cascade=True): if cascade: child.set_parent(self, False) # self.__children.append(weakref.ref(child)) self.__children.append(child) def remove_child(self, child, cascade=True): if cascade: child.set_parent(None, False) # self.__children.remove(weakref.ref(child)) self.__children.remove(child) def get_children(self): return self.__children.to_list() # result = [] # for i in reversed(xrange(len(self.__children))): # c = self.__children[i]() # if c is None: # del self.__children[i] # else: # result.insert(0, c) # return result children = property(get_children) def get_parent(self): if self.__parent is None: return None return self.__parent() def set_parent(self, value, cascade=True): if cascade: if self.parent is not None : self.parent.remove_child(self, False) if value is not None: value.add_child(self, False) if value is not None: self.__parent = weakref.ref(value) else: self.__parent = value parent = property(get_parent, set_parent) def __contains__(self, child): return child in self.get_children() # ========================================================================= # COLLISION =============================================================== def add_circle_collider(self, position=None, radius=None): if position is None: position = self.position if radius is None: radius = 1 self.collider = batma.CircleCollider(position, radius) def add_box_collider(self, position=None, half_width=None, half_height=None): if position is None: position = self.position if half_width is None: half_width = 1 if half_height is None: half_height = 1 self.collider = batma.BoxCollider(position, half_width, half_height) # ========================================================================= # SPATIAL ================================================================= def get_x(self): return self.__x def set_x(self, value): if self.collider: delta = value - self.__x self.collider.x += delta self.__x = value x = property(get_x, set_x) def get_y(self): return self.__y def set_y(self, value): if self.collider: delta = value - self.__y self.collider.y += delta self.__y = value y = property(get_y, set_y) def get_position(self): return Vector2(self.__x, self.__y) def set_position(self, value): self.x = value[0] self.y = value[1] position = property(get_position, set_position) def get_rotation(self): return self.__rotation def set_rotation(self, value): self.__rotation = value%360 rotation = property(get_rotation, set_rotation) def get_scale(self): return self.__scale def set_scale(self, value): if isinstance(value, (int, long, float)): value = Vector2(value, value) self.__scale = value scale = property(get_scale, set_scale) def transform(self): gl.glTranslatef(self.x, self.y, 0) if self.rotation != 0.0: gl.glRotatef(self.rotation, 0, 0, -1) if self.scale != (1.0, 1.0): gl.glScalef(self.scale[0], self.scale[1], 0) # ========================================================================= def update(self, tick): pass def draw(self): pass def __repr__(self): return '<GameObject "%s">'%(self.name or self.id)
class GameObject(object): __ID = 1 @classmethod def __new_id(cls): id = cls.__ID cls.__ID += 1 return id def __init__(self, position=(0, 0), rotation=0.0, scale=(1, 1)): self.id = GameObject.__new_id() self.name = '' self.tags = [] self.enabled = True self.visible = True self.static = False self.__children = WeakList() self.__parent = None self.__x, self.__y = position self.__rotation = rotation self.__scale = scale self.collider = None def __del__(self): del self.collider # PARENTING =============================================================== def add_child(self, child, cascade=True): if cascade: child.set_parent(self, False) # self.__children.append(weakref.ref(child)) self.__children.append(child) def remove_child(self, child, cascade=True): if cascade: child.set_parent(None, False) # self.__children.remove(weakref.ref(child)) self.__children.remove(child) def get_children(self): return self.__children.to_list() # result = [] # for i in reversed(xrange(len(self.__children))): # c = self.__children[i]() # if c is None: # del self.__children[i] # else: # result.insert(0, c) # return result children = property(get_children) def get_parent(self): if self.__parent is None: return None return self.__parent() def set_parent(self, value, cascade=True): if cascade: if self.parent is not None: self.parent.remove_child(self, False) if value is not None: value.add_child(self, False) if value is not None: self.__parent = weakref.ref(value) else: self.__parent = value parent = property(get_parent, set_parent) def __contains__(self, child): return child in self.get_children() # ========================================================================= # COLLISION =============================================================== def add_circle_collider(self, position=None, radius=None): if position is None: position = self.position if radius is None: radius = 1 self.collider = batma.CircleCollider(position, radius) def add_box_collider(self, position=None, half_width=None, half_height=None): if position is None: position = self.position if half_width is None: half_width = 1 if half_height is None: half_height = 1 self.collider = batma.BoxCollider(position, half_width, half_height) # ========================================================================= # SPATIAL ================================================================= def get_x(self): return self.__x def set_x(self, value): if self.collider: delta = value - self.__x self.collider.x += delta self.__x = value x = property(get_x, set_x) def get_y(self): return self.__y def set_y(self, value): if self.collider: delta = value - self.__y self.collider.y += delta self.__y = value y = property(get_y, set_y) def get_position(self): return Vector2(self.__x, self.__y) def set_position(self, value): self.x = value[0] self.y = value[1] position = property(get_position, set_position) def get_rotation(self): return self.__rotation def set_rotation(self, value): self.__rotation = value % 360 rotation = property(get_rotation, set_rotation) def get_scale(self): return self.__scale def set_scale(self, value): if isinstance(value, (int, long, float)): value = Vector2(value, value) self.__scale = value scale = property(get_scale, set_scale) def transform(self): gl.glTranslatef(self.x, self.y, 0) if self.rotation != 0.0: gl.glRotatef(self.rotation, 0, 0, -1) if self.scale != (1.0, 1.0): gl.glScalef(self.scale[0], self.scale[1], 0) # ========================================================================= def update(self, tick): pass def draw(self): pass def __repr__(self): return '<GameObject "%s">' % (self.name or self.id)