|
@@ -5,19 +5,17 @@ from typing import Tuple, Type
|
|
|
|
|
|
|
|
import pygame
|
|
import pygame
|
|
|
|
|
|
|
|
|
|
+import jogai
|
|
|
|
|
+import jogai._globals as _globals
|
|
|
import jogai.settings as settings
|
|
import jogai.settings as settings
|
|
|
from jogai import character, group, logger, scene, utils
|
|
from jogai import character, group, logger, scene, utils
|
|
|
-from jogai._events import _get_events, _get_keys
|
|
|
|
|
-from jogai._globals import _clock, _default_data, _window
|
|
|
|
|
|
|
+from jogai.utils import _get_events, _get_keys
|
|
|
from jogai.translations import gettext as _
|
|
from jogai.translations import gettext as _
|
|
|
|
|
|
|
|
# --------------- #
|
|
# --------------- #
|
|
|
# GLOBALS #
|
|
# GLOBALS #
|
|
|
# --------------- #
|
|
# --------------- #
|
|
|
|
|
|
|
|
-vg_scene = None
|
|
|
|
|
-vg_characters = []
|
|
|
|
|
-vg_groups = []
|
|
|
|
|
running = True
|
|
running = True
|
|
|
|
|
|
|
|
# ------------------ #
|
|
# ------------------ #
|
|
@@ -125,7 +123,7 @@ def add_character(new_character: 'character.Character'):
|
|
|
"""
|
|
"""
|
|
|
if not isinstance(new_character, character.Character):
|
|
if not isinstance(new_character, character.Character):
|
|
|
raise TypeError(_('Only Character instances can be added.'))
|
|
raise TypeError(_('Only Character instances can be added.'))
|
|
|
- vg_characters.append(new_character)
|
|
|
|
|
|
|
+ _globals.vg_characters.append(new_character)
|
|
|
|
|
|
|
|
|
|
|
|
|
def add_group(new_group: 'group.SquareGroup'):
|
|
def add_group(new_group: 'group.SquareGroup'):
|
|
@@ -142,7 +140,7 @@ def add_group(new_group: 'group.SquareGroup'):
|
|
|
"""
|
|
"""
|
|
|
if not isinstance(new_group, group.Group):
|
|
if not isinstance(new_group, group.Group):
|
|
|
raise TypeError(_('Only Group instances can be added.'))
|
|
raise TypeError(_('Only Group instances can be added.'))
|
|
|
- vg_groups.append(new_group)
|
|
|
|
|
|
|
+ _globals.vg_groups.append(new_group)
|
|
|
|
|
|
|
|
|
|
|
|
|
def init():
|
|
def init():
|
|
@@ -152,10 +150,9 @@ def init():
|
|
|
Examples:
|
|
Examples:
|
|
|
>>> init()
|
|
>>> init()
|
|
|
"""
|
|
"""
|
|
|
- global _window
|
|
|
|
|
if not pygame.get_init():
|
|
if not pygame.get_init():
|
|
|
pygame.init()
|
|
pygame.init()
|
|
|
- _window = pygame.display.set_mode(
|
|
|
|
|
|
|
+ _globals._window = pygame.display.set_mode(
|
|
|
(settings.WINDOW_WIDTH, settings.WINDOW_HEIGHT)
|
|
(settings.WINDOW_WIDTH, settings.WINDOW_HEIGHT)
|
|
|
)
|
|
)
|
|
|
|
|
|
|
@@ -181,10 +178,9 @@ def listen_events():
|
|
|
>>> simulate_key_press('ESCAPE')
|
|
>>> simulate_key_press('ESCAPE')
|
|
|
>>> listen_events()
|
|
>>> listen_events()
|
|
|
"""
|
|
"""
|
|
|
- global _events, _keys
|
|
|
|
|
- _events = _get_events()
|
|
|
|
|
- _keys = _get_keys()
|
|
|
|
|
- for event in _events:
|
|
|
|
|
|
|
+ _globals._events = _get_events()
|
|
|
|
|
+ _globals._keys = _get_keys()
|
|
|
|
|
+ for event in _globals._events:
|
|
|
match event.type:
|
|
match event.type:
|
|
|
case pygame.KEYDOWN:
|
|
case pygame.KEYDOWN:
|
|
|
if event.key == pygame.K_ESCAPE:
|
|
if event.key == pygame.K_ESCAPE:
|
|
@@ -229,13 +225,13 @@ def paint(sprite: Type['scene.Scene'] | Type['character.Character']):
|
|
|
"""
|
|
"""
|
|
|
# TODO: check sprite type
|
|
# TODO: check sprite type
|
|
|
if hasattr(sprite, 'background'):
|
|
if hasattr(sprite, 'background'):
|
|
|
- _window.fill(sprite.background)
|
|
|
|
|
|
|
+ _globals._window.fill(sprite.background)
|
|
|
if sprite.image and sprite.rect:
|
|
if sprite.image and sprite.rect:
|
|
|
- _window.blit(sprite.image, sprite.rect)
|
|
|
|
|
|
|
+ _globals._window.blit(sprite.image, sprite.rect)
|
|
|
|
|
|
|
|
|
|
|
|
|
def paint_group(group: Type['group.SquareGroup']):
|
|
def paint_group(group: Type['group.SquareGroup']):
|
|
|
- group.draw(_window)
|
|
|
|
|
|
|
+ group.draw(_globals._window)
|
|
|
|
|
|
|
|
|
|
|
|
|
def prepare(data_filename: str = ''):
|
|
def prepare(data_filename: str = ''):
|
|
@@ -246,19 +242,20 @@ def prepare(data_filename: str = ''):
|
|
|
>>> init()
|
|
>>> init()
|
|
|
>>> prepare()
|
|
>>> prepare()
|
|
|
"""
|
|
"""
|
|
|
- global vg_scene, vg_characters
|
|
|
|
|
|
|
+ if not _globals._window:
|
|
|
|
|
+ init()
|
|
|
pygame.key.set_repeat(settings.KEY_DELAY, settings.KEY_INTERVAL)
|
|
pygame.key.set_repeat(settings.KEY_DELAY, settings.KEY_INTERVAL)
|
|
|
if data_filename:
|
|
if data_filename:
|
|
|
vg_data = utils._load_yaml_from_filename(data_filename)
|
|
vg_data = utils._load_yaml_from_filename(data_filename)
|
|
|
else:
|
|
else:
|
|
|
vg_data = _default_data
|
|
vg_data = _default_data
|
|
|
|
|
|
|
|
- vg_scene = _load_scene(vg_data)
|
|
|
|
|
- vg_characters = _load_characters(vg_data)
|
|
|
|
|
|
|
+ _globals.vg_scene = _load_scene(vg_data)
|
|
|
|
|
+ _globals.vg_characters = _load_characters(vg_data)
|
|
|
|
|
|
|
|
# TODO: Check and filter variable names added to builtins
|
|
# TODO: Check and filter variable names added to builtins
|
|
|
- setattr(builtins, 'vgscene', vg_scene)
|
|
|
|
|
- for vg_character in vg_characters:
|
|
|
|
|
|
|
+ setattr(builtins, 'vgscene', _globals.vg_scene)
|
|
|
|
|
+ for vg_character in _globals.vg_characters:
|
|
|
setattr(builtins, vg_character.name, vg_character)
|
|
setattr(builtins, vg_character.name, vg_character)
|
|
|
|
|
|
|
|
|
|
|
|
@@ -274,26 +271,30 @@ def update():
|
|
|
"""
|
|
"""
|
|
|
Refresh the display surface and listen events.
|
|
Refresh the display surface and listen events.
|
|
|
"""
|
|
"""
|
|
|
- global _clock, _window, vg_scene, vg_characters, vg_groups
|
|
|
|
|
- if vg_scene:
|
|
|
|
|
- if vg_characters:
|
|
|
|
|
- vg_scene.set_position(vg_characters[0].x)
|
|
|
|
|
- paint(vg_scene)
|
|
|
|
|
- if vg_characters:
|
|
|
|
|
- for pos, vg_character in enumerate(vg_characters):
|
|
|
|
|
- vg_character._update_rect_position(
|
|
|
|
|
- vg_scene, False if pos else True
|
|
|
|
|
- )
|
|
|
|
|
|
|
+ if _globals.vg_scene:
|
|
|
|
|
+ if _globals.vg_characters:
|
|
|
|
|
+ _globals.vg_scene.set_position(_globals.vg_characters[0].x)
|
|
|
|
|
+ paint(_globals.vg_scene)
|
|
|
|
|
+ if _globals.vg_characters:
|
|
|
|
|
+ for pos, vg_character in enumerate(_globals.vg_characters):
|
|
|
|
|
+ if vg_character.collidable:
|
|
|
|
|
+ rest_of_characters = _globals.vg_characters.copy()
|
|
|
|
|
+ rest_of_characters.remove(vg_character)
|
|
|
|
|
+ for other_character in rest_of_characters:
|
|
|
|
|
+ if other_character.collidable:
|
|
|
|
|
+ vg_character.touch(other_character)
|
|
|
|
|
+
|
|
|
|
|
+ vg_character._update_rect_position(False if pos else True)
|
|
|
paint(vg_character)
|
|
paint(vg_character)
|
|
|
vg_character.update()
|
|
vg_character.update()
|
|
|
- if vg_groups:
|
|
|
|
|
- for g in vg_groups:
|
|
|
|
|
|
|
+ if _globals.vg_groups:
|
|
|
|
|
+ for g in _globals.vg_groups:
|
|
|
for e in g.sprites():
|
|
for e in g.sprites():
|
|
|
- e._update_rect_position(vg_scene)
|
|
|
|
|
- e.paint()
|
|
|
|
|
|
|
+ e._update_rect_position()
|
|
|
|
|
+ paint(e)
|
|
|
|
|
|
|
|
pygame.display.flip()
|
|
pygame.display.flip()
|
|
|
- _clock.tick(settings.FPS)
|
|
|
|
|
|
|
+ _globals._clock.tick(settings.FPS)
|
|
|
listen_events()
|
|
listen_events()
|
|
|
|
|
|
|
|
|
|
|