Skip to content

Commit 755c578

Browse files
本格的なアプリの設計例を追加
1 parent f1b6385 commit 755c578

File tree

1 file changed

+108
-0
lines changed

1 file changed

+108
-0
lines changed
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
from typing import Unpack
2+
from functools import partial
3+
4+
import pygame
5+
import pygame.font
6+
from pygame.colordict import THECOLORS as COLORS
7+
import pygame.constants as C
8+
9+
import asyncpygame as apg
10+
from asyncpygame.scene_switcher import SceneSwitcher, FadeTransition
11+
from _uix.touch_indicator import touch_indicator
12+
from _uix.anchor_layout import AnchorLayout
13+
from _uix.ripple_button import RippleButton
14+
from _uix.modal_dialog import ask_yes_no_question
15+
16+
17+
async def main(**kwargs: Unpack[apg.CommonParams]):
18+
pygame.init()
19+
pygame.display.set_caption("<Your App Title>")
20+
kwargs["draw_target"] = screen = pygame.display.set_mode((800, 600))
21+
22+
bgcolor = COLORS["black"]
23+
r = kwargs["executor"].register
24+
r(partial(screen.fill, bgcolor), priority=0)
25+
r(pygame.display.flip, priority=0xFFFFFF00)
26+
userdata = {
27+
'font': pygame.font.SysFont(None, 60),
28+
'bgcolor': bgcolor,
29+
}
30+
async with apg.open_nursery() as nursery:
31+
nursery.start(confirm_before_quitting(priority=0xFFFFFD00, **kwargs))
32+
nursery.start(touch_indicator(color="grey", priority=0xFFFFFE00, **kwargs))
33+
nursery.start(SceneSwitcher().run(title_scene, priority=0xFFFFFC00, userdata=userdata, **kwargs))
34+
35+
36+
async def confirm_before_quitting(*, priority, **kwargs: Unpack[apg.CommonParams]):
37+
quit = partial(kwargs["sdlevent"].wait, C.QUIT, priority=priority, consume=True)
38+
escape_key = partial(kwargs["sdlevent"].wait, C.KEYDOWN, priority=priority, filter=lambda e: e.key == C.K_ESCAPE, consume=True)
39+
while True:
40+
await apg.wait_any(quit(), escape_key())
41+
if await ask_yes_no_question("Quit the app?", priority=priority, **kwargs):
42+
apg.quit()
43+
44+
45+
async def title_scene(*, scene_switcher, userdata, **kwargs: Unpack[apg.CommonParams]):
46+
draw_target = kwargs["draw_target"]
47+
target_rect = draw_target.get_rect()
48+
font = userdata['font']
49+
async with apg.open_nursery() as nursery:
50+
AnchorLayout(
51+
nursery,
52+
font.render("<Your App Title>", True, "white", userdata["bgcolor"]).convert(draw_target),
53+
target_rect.scale_by(1.0, 0.5).move_to(y=target_rect.y),
54+
priority=0x100, **kwargs)
55+
start_button = RippleButton(
56+
nursery,
57+
button_image := font.render("Start", True, "white").convert_alpha(),
58+
button_image.get_rect(center=target_rect.scale_by(1.0, 0.5).move_to(bottom=target_rect.bottom).center).inflate(80, 80),
59+
priority=0x100, **kwargs)
60+
await start_button.to_be_clicked()
61+
scene_switcher.switch_to(menu_scene, FadeTransition())
62+
await apg.sleep_forever()
63+
64+
65+
async def menu_scene(*, scene_switcher, userdata, **kwargs: Unpack[apg.CommonParams]):
66+
draw_target = kwargs["draw_target"]
67+
target_rect = draw_target.get_rect()
68+
font = userdata['font']
69+
async with apg.open_nursery() as nursery:
70+
play_button = RippleButton(
71+
nursery,
72+
button_image := font.render("Play Game", True, "white").convert_alpha(),
73+
button_image.get_rect(center=target_rect.scale_by(1.0, 0.5).move_to(y=target_rect.y).center).inflate(80, 80),
74+
priority=0x100, **kwargs)
75+
back_button = RippleButton(
76+
nursery,
77+
button_image := font.render("Back to Title", True, "white").convert_alpha(),
78+
button_image.get_rect(center=target_rect.scale_by(1.0, 0.5).move_to(bottom=target_rect.bottom).center).inflate(80, 80),
79+
priority=0x100, **kwargs)
80+
tasks = await apg.wait_any(
81+
play_button.to_be_clicked(),
82+
back_button.to_be_clicked(),
83+
)
84+
next_scene = title_scene if tasks[1].finished else game_scene
85+
scene_switcher.switch_to(next_scene, FadeTransition())
86+
await apg.sleep_forever()
87+
88+
89+
async def game_scene(*, scene_switcher, userdata, **kwargs: Unpack[apg.CommonParams]):
90+
draw_target = kwargs["draw_target"]
91+
target_rect = draw_target.get_rect()
92+
font = userdata['font']
93+
clock = kwargs["clock"]
94+
95+
image = font.render("Running...", True, "white", userdata["bgcolor"]).convert(draw_target)
96+
dest = image.get_rect(center=target_rect.center)
97+
with kwargs["executor"].register(partial(draw_target.blit, image, dest), priority=0x100):
98+
async with clock.move_on_after(5000):
99+
await clock.anim_attrs(dest, y=dest.y - 80, duration=400)
100+
while True:
101+
await clock.anim_attrs(dest, y=dest.y + 160, duration=800)
102+
await clock.anim_attrs(dest, y=dest.y - 160, duration=800)
103+
scene_switcher.switch_to(title_scene, FadeTransition())
104+
await apg.sleep_forever()
105+
106+
107+
if __name__ == "__main__":
108+
apg.run(main)

0 commit comments

Comments
 (0)