Skip to content

Commit c8474a2

Browse files
committed
+delete buffer
1 parent c01cde2 commit c8474a2

9 files changed

Lines changed: 73 additions & 22 deletions

File tree

README.rst

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,15 @@ Implementation of the ECS template for creating games.
77

88
Make a game instead of architecture for a game.
99

10-
`Документация на русском <https://github.com/ikvk/ecs_pattern/blob/master/_docs/README_RUS.rst>`_.
10+
`Документация на Русском <https://github.com/ikvk/ecs_pattern/blob/master/_docs/README_RUS.rst>`_.
1111

1212
.. image:: https://img.shields.io/pypi/dm/ecs_pattern.svg?style=social
1313

1414
=============== ==========================================
15-
Python version 3.5+
15+
Python version 3.3+
1616
License Apache-2.0
1717
PyPI https://pypi.python.org/pypi/ecs_pattern/
18+
Dependencies dataclasses before 3.7, typing before 3.5
1819
=============== ==========================================
1920

2021
Intro
@@ -120,6 +121,10 @@ Guide
120121
121122
| *entities.delete* - delete entities.
122123
124+
| *entities.delete_buffer_add* - save entities to the delete buffer to delete later.
125+
126+
| *entities.delete_buffer_purge* - delete all entities from the delete buffer.
127+
123128
| *entities.init* - initialize entities (let manager know about entities).
124129
125130
| *entities.get_by_class* - get all entities of the specified classes.
@@ -130,10 +135,12 @@ Guide
130135
131136
entities = EntityManager()
132137
entities.add(Player('Ivan', 20, 1, 2), Player('Vladimir', 30, 3, 4), Ball(0, 7))
133-
for player_entity in entities.get_by_class(Player):
134-
print(player_entity.name)
135138
for entity_with_pos in self.entities.get_with_component(ComPosition):
136139
print(entity_with_pos.x, entity_with_pos.y)
140+
for player_entity in entities.get_by_class(Player):
141+
print(player_entity.name)
142+
entities.delete_buffer_add(player_entity)
143+
entities.delete_buffer_purge()
137144
entities.delete(*tuple(next(entities.get_by_class(Ball), [])))
138145
139146
**SystemManager**
@@ -162,7 +169,7 @@ Guide
162169
163170
Examples
164171
--------
165-
* `Pong game: pygame + ecs-pattern <https://github.com/ikvk/ecs_pattern/tree/master/examples/pong>`_.
172+
* `Pong game: pygame + ecs_pattern <https://github.com/ikvk/ecs_pattern/tree/master/examples/pong>`_.
166173

167174
Advantages
168175
----------
@@ -190,13 +197,15 @@ Newbie mistakes
190197
* Raising ECS to the absolute, no one cancels the OOP
191198
* Adaptation of the existing project code under ECS "as is"
192199
* Use of recursive or reactive logic in systems
200+
* Using EntityManager.delete in get_by_class, get_with_component loops
193201

194202
Good Practices
195203
--------------
196204
* Use components - flags
197205
* Minimize component change locations
198206
* Use event entities and event systems
199207
* In large projects, placing ECS objects by type is not convenient (components.py, systems.py ...). Group by responsibilities (movement.py ...)
208+
* Do not use methods in components and entities
200209

201210
Releases
202211
--------
@@ -205,7 +214,7 @@ History of important changes: `release_notes.rst <https://github.com/ikvk/ecs_pa
205214

206215
Help the project
207216
----------------
208-
209-
Welcome :D
210-
211-
217+
* Found a bug or have a suggestion - issue / merge request 🎯
218+
* There is nothing to help this project with - help another open project that you are using ✋
219+
* Nowhere to put the money - spend it on family, friends, loved ones or people around you 💰
220+
* Star the project

_docs/README_RUS.rst

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,15 @@ ecs_pattern 🚀
77

88
Делайте игру вместо архитектуры для игры.
99

10+
`Documentation in English <https://github.com/ikvk/ecs_pattern/blob/master/README.rst>`_.
11+
1012
.. image:: https://img.shields.io/pypi/dm/ecs_pattern.svg?style=social
1113

1214
=============== ==========================================
13-
Python version 3.5+
15+
Python version 3.3+
1416
License Apache-2.0
1517
PyPI https://pypi.python.org/pypi/ecs_pattern/
18+
Dependencies dataclasses before 3.7, typing before 3.5
1619
=============== ==========================================
1720

1821
Введение
@@ -118,6 +121,10 @@ PyPI https://pypi.python.org/pypi/ecs_pattern/
118121
119122
| *entities.delete* - удалить сущности.
120123
124+
| *entities.delete_buffer_add* - сохранить сущности в буфер удаления, чтобы удалить позже.
125+
126+
| *entities.delete_buffer_purge* - удалить все сущности из буфера удаления.
127+
121128
| *entities.init* - инициализировать сущности (дать менеджеру знать о сущностях).
122129
123130
| *entities.get_by_class* - получить все сущности указанных классов.
@@ -128,10 +135,12 @@ PyPI https://pypi.python.org/pypi/ecs_pattern/
128135
129136
entities = EntityManager()
130137
entities.add(Player('Ivan', 20, 1, 2), Player('Vladimir', 30, 3, 4), Ball(0, 7))
131-
for player_entity in entities.get_by_class(Player):
132-
print(player_entity.name)
133138
for entity_with_pos in self.entities.get_with_component(ComPosition):
134139
print(entity_with_pos.x, entity_with_pos.y)
140+
for player_entity in entities.get_by_class(Player):
141+
print(player_entity.name)
142+
entities.delete_buffer_add(player_entity)
143+
entities.delete_buffer_purge()
135144
entities.delete(*tuple(next(entities.get_by_class(Ball), [])))
136145
137146
**SystemManager**
@@ -160,7 +169,7 @@ PyPI https://pypi.python.org/pypi/ecs_pattern/
160169
161170
Примеры
162171
-------
163-
* `Игра Pong: pygame + ecs-pattern <https://github.com/ikvk/ecs_pattern/tree/master/examples/pong>`_.
172+
* `Игра Pong: pygame + ecs_pattern <https://github.com/ikvk/ecs_pattern/tree/master/examples/pong>`_.
164173

165174
Преимущества
166175
------------
@@ -188,13 +197,15 @@ PyPI https://pypi.python.org/pypi/ecs_pattern/
188197
* Возведение ECS в абсолют, ООП никто не отменяет
189198
* Адаптация существующего кода проекта под ECS "как есть"
190199
* Использование рекурсивной или реактивной логики в системах
200+
* Использование EntityManager.delete в циклах get_by_class, get_with_component
191201

192202
Хорошие практики
193203
----------------
194204
* Используйте компоненты - флаги
195205
* Минимизируйте места изменения компонента
196206
* Используйте сущности-события и системы событий
197207
* В больших проектах размещение объектов ECS по типам не удобно (components.py, systems.py ...). Группируйте по обязанностям (movement.py ...)
208+
* Не используйте методы в компонентах и сущностях
198209

199210
Релизы
200211
------
@@ -203,7 +214,7 @@ PyPI https://pypi.python.org/pypi/ecs_pattern/
203214

204215
Помощь проекту
205216
--------------
206-
207-
Приветствуется :D
208-
209-
217+
* Нашли ошибку или есть предложение - issue / merge request 🎯
218+
* Нечем помочь этому проекту - помогите другому открытому проекту, который используете ✋
219+
* Некуда деть деньги - потратьте на семью, друзей, близких или окружающих вас людей 💰
220+
* Поставьте проекту

_docs/release_notes.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
1.1.0
2+
=====
3+
* Added delete buffer: EntityManager.delete_buffer_add, EntityManager.delete_buffer_purge
4+
15
1.0.0
26
=====
37
* first version: 24 Aug 2022

ecs_pattern/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@
44

55
from .ecs import component, entity, EntityManager, System, SystemManager
66

7-
__version__ = '1.0.0'
7+
__version__ = '1.1.0'

ecs_pattern/ecs.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from typing import Iterable, Iterator, Any
66
from dataclasses import dataclass
77
from functools import partial
8+
from collections import deque
89

910
# all component classes must be decorated with this function
1011
component = dataclass
@@ -20,6 +21,7 @@ def __init__(self):
2021
self._entity_map = {} # Person: [ent1, ent2]
2122
self._entity_components_map = {} # Person: (MoveCom, DamageCom, NameCom)
2223
self._set_cache_map = {} # (MoveCom, DamageCom, NameCom): {MoveCom, DamageCom, NameCom}
24+
self._delete_entity_buffer = deque() # deque([Person1, Person2])
2325

2426
def add(self, *entity_value_list: Any):
2527
"""Add entities to world"""
@@ -39,6 +41,17 @@ def delete(self, *entity_value_list: Any):
3941
entity_value_class = entity_value.__class__
4042
self._entity_map[entity_value_class].remove(entity_value)
4143

44+
def delete_buffer_add(self, *entity_value_list: Any):
45+
"""Save entities into delete buffer for delete them from world later"""
46+
for entity_value in entity_value_list:
47+
self._delete_entity_buffer.append(entity_value)
48+
49+
def delete_buffer_purge(self):
50+
"""Delete all entities from delete buffer"""
51+
for delete_entity in self._delete_entity_buffer:
52+
self.delete(delete_entity)
53+
self._delete_entity_buffer.clear()
54+
4255
def init(self, *entity_list: Any):
4356
"""
4457
Let entity manager to "know" about entities before work

examples/pong/README.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
.. http://docutils.sourceforge.net/docs/user/rst/quickref.html
2+
3+
Pong game
4+
=========
5+
6+
Classic game, implemented on pygame + ecs_pattern
7+
8+
.. image:: https://github.com/ikvk/ecs_pattern/blob/master/examples/pong/_docs/pong_screen.png
6.81 KB
Loading

examples/pong/systems.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -147,13 +147,11 @@ def update(self):
147147
ball.speed_y = 0
148148
# kill sparks
149149
table_rect = Rect(table.x, table.y, table.sprite.rect.width, table.sprite.rect.height)
150-
spark_for_del_list = []
151150
for spark in self.entities.get_by_class(Spark):
152151
if not table_rect.colliderect(
153152
Rect(spark.x, spark.y, spark.sprite.rect.width, spark.sprite.rect.height)):
154-
spark_for_del_list.append(spark)
155-
for spark_for_del in spark_for_del_list:
156-
self.entities.delete(spark_for_del)
153+
self.entities.delete_buffer_add(spark)
154+
self.entities.delete_buffer_purge()
157155

158156

159157
class SysGoal(System):

tests/test_ecs.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,14 @@ def test_entitymanager(self):
119119
self.assertEqual(len(list(entities.get_with_component(ComPosition))), 0)
120120
self.assertEqual(len(list(entities.get_with_component(ComPerson))), 0)
121121

122+
entities.add(player1, player2)
123+
self.assertEqual(len(list(entities.get_by_class(Player))), 2)
124+
entities.delete_buffer_purge()
125+
self.assertEqual(len(list(entities.get_by_class(Player))), 2)
126+
entities.delete_buffer_add(player1, player2)
127+
entities.delete_buffer_purge()
128+
self.assertEqual(len(list(entities.get_by_class(Player))), 0)
129+
122130
def test_system(self):
123131
player1 = Player('Ivan', 20, 1, 2)
124132
player2 = Player('Vladimir', 30, 3, 4)

0 commit comments

Comments
 (0)