Skip to content

Commit 0dcb4da

Browse files
v1.2.2
1 parent 3f6da1b commit 0dcb4da

3 files changed

Lines changed: 96 additions & 3 deletions

File tree

README.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,16 @@ while True:
159159
### ⚡ Быстрый старт 2.0 (шаблон проекта)
160160

161161
```bash
162-
python create_project.py MyGame
162+
spritepro --create
163163
```
164164

165-
Создаст структуру `assets/`, `scenes/` и файл `main.py` с новым API.
165+
Создаст `main.py` в текущей папке и структуру `assets/audio`, `assets/images`, `scenes`.
166+
167+
```bash
168+
spritepro --create MyGame
169+
```
170+
171+
Создаст проект в папке `MyGame`.
166172

167173
---
168174

pyproject.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "spritepro"
7-
version = "1.2.1"
7+
version = "1.2.2"
88
authors = [
99
{ name="NeoXider", email="neoxider@gmail.com" },
1010
]
@@ -32,3 +32,6 @@ dependencies = [
3232
[project.urls]
3333
Homepage = "https://github.com/NeoXider/SpritePro"
3434
Issues = "https://github.com/NeoXider/SpritePro/issues"
35+
36+
[project.scripts]
37+
spritepro = "spritePro.cli:main"

spritePro/cli.py

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import argparse
2+
import logging
3+
from pathlib import Path
4+
from textwrap import dedent
5+
6+
7+
MAIN_TEMPLATE = dedent(
8+
"""\
9+
import pygame
10+
import spritePro as s
11+
12+
ASSETS_DIR = "assets"
13+
IMAGES_DIR = f"{ASSETS_DIR}/images"
14+
AUDIO_DIR = f"{ASSETS_DIR}/audio"
15+
16+
17+
class MainScene(s.Scene):
18+
def on_enter(self, context):
19+
self.player = s.Sprite(f"{IMAGES_DIR}/player.png", (64, 64), (400, 300), speed=5)
20+
21+
def update(self, dt):
22+
self.player.handle_keyboard_input()
23+
if s.input.was_pressed(pygame.K_SPACE):
24+
s.debug_log_info("Space pressed")
25+
26+
27+
def main():
28+
s.get_screen((800, 600), "My SpritePro Game")
29+
s.enable_debug(True)
30+
s.set_debug_camera_input(3)
31+
s.debug_log_info("Game started")
32+
s.set_scene(MainScene())
33+
34+
while True:
35+
s.update(fill_color=(20, 20, 30))
36+
37+
38+
if __name__ == "__main__":
39+
main()
40+
"""
41+
)
42+
43+
44+
def _project_root_from_target(target: Path) -> tuple[Path, Path]:
45+
if target.suffix == ".py":
46+
return target.parent, target
47+
return target, target / "main.py"
48+
49+
50+
def create_project(target: Path) -> Path:
51+
project_root, main_file = _project_root_from_target(target)
52+
53+
project_root.mkdir(parents=True, exist_ok=True)
54+
assets_root = project_root / "assets"
55+
assets_root.mkdir(exist_ok=True)
56+
(assets_root / "audio").mkdir(exist_ok=True)
57+
(assets_root / "images").mkdir(exist_ok=True)
58+
(project_root / "scenes").mkdir(exist_ok=True)
59+
60+
if not main_file.exists():
61+
main_file.write_text(MAIN_TEMPLATE, encoding="utf-8")
62+
63+
return project_root
64+
65+
66+
def main() -> None:
67+
parser = argparse.ArgumentParser(description="Create a minimal SpritePro project")
68+
parser.add_argument(
69+
"--create",
70+
metavar="PATH",
71+
help="Project folder or path to main.py",
72+
)
73+
args = parser.parse_args()
74+
75+
if not args.create:
76+
args.create = "main.py"
77+
78+
logging.basicConfig(level=logging.INFO, format="%(message)s")
79+
project_root = create_project(Path(args.create))
80+
logging.info("Project created at: %s", project_root.resolve())
81+
82+
83+
if __name__ == "__main__":
84+
main()

0 commit comments

Comments
 (0)