make a game
This commit is contained in:
parent
53d878c75a
commit
dab0697f45
4 changed files with 227 additions and 11 deletions
|
|
@ -81,7 +81,8 @@ def get_config(overrides: dict = {}) -> Config:
|
|||
return config
|
||||
|
||||
|
||||
def get_session(config: Config = None) -> "Session":
|
||||
def get_session() -> "Session":
|
||||
config = get_config()
|
||||
with Session(config.database.engine) as session:
|
||||
yield session
|
||||
|
||||
|
|
|
|||
165
learn_sql_model/game/game.py
Normal file
165
learn_sql_model/game/game.py
Normal file
|
|
@ -0,0 +1,165 @@
|
|||
# using pygame make a game using Hero
|
||||
# it should be gamepad and mouse compatible
|
||||
# it should have a server that keeps track of the game logic
|
||||
# it should have a renderer that renders the game
|
||||
# it should have a client that sends commands to the server
|
||||
#
|
||||
|
||||
|
||||
import atexit
|
||||
|
||||
import pygame
|
||||
from rich.console import Console
|
||||
import typer
|
||||
from typer import Typer
|
||||
|
||||
from learn_sql_model.models.hero import (
|
||||
Hero,
|
||||
HeroCreate,
|
||||
HeroDelete,
|
||||
HeroRead,
|
||||
HeroUpdate,
|
||||
)
|
||||
|
||||
speed = 10
|
||||
|
||||
pygame.font.init() # you have to call this at the start,
|
||||
# if you want to use this module.
|
||||
my_font = pygame.font.SysFont("Comic Sans MS", 30)
|
||||
|
||||
|
||||
class Client:
|
||||
def __init__(self, name, secret_name):
|
||||
self.hero = Hero(name=name, secret_name=secret_name, x=400, y=300, size=50)
|
||||
self.hero = HeroCreate(**self.hero.dict()).post()
|
||||
|
||||
self.screen = pygame.display.set_mode((800, 600))
|
||||
self.clock = pygame.time.Clock()
|
||||
self.running = True
|
||||
self.screen.fill((0, 0, 0))
|
||||
|
||||
self.moving_up = False
|
||||
self.moving_down = False
|
||||
self.moving_left = False
|
||||
self.moving_right = False
|
||||
|
||||
self.others = HeroRead.list()
|
||||
|
||||
atexit.register(self.quit)
|
||||
|
||||
def run(self):
|
||||
while self.running:
|
||||
self.handle_events()
|
||||
self.update()
|
||||
self.render()
|
||||
self.clock.tick(60)
|
||||
self.quit()
|
||||
|
||||
def quit(self):
|
||||
HeroDelete(id=self.hero.id).delete()
|
||||
|
||||
def update(self):
|
||||
if self.moving_up:
|
||||
self.hero.y -= speed
|
||||
if self.moving_down:
|
||||
self.hero.y += speed
|
||||
if self.moving_left:
|
||||
self.hero.x -= speed
|
||||
if self.moving_right:
|
||||
self.hero.x += speed
|
||||
|
||||
HeroUpdate(
|
||||
**{k: v for k, v in self.hero.dict().items() if v is not None}
|
||||
).update()
|
||||
|
||||
self.others = HeroRead.list()
|
||||
|
||||
def render(self):
|
||||
Console().print(self.hero)
|
||||
self.screen.fill((0, 0, 0))
|
||||
|
||||
for other in self.others:
|
||||
pygame.draw.circle(self.screen, (255, 0, 0), (other.x, other.y), other.size)
|
||||
self.screen.blit(
|
||||
my_font.render(other.name, False, (255, 255, 255), 1),
|
||||
(other.x, other.y),
|
||||
)
|
||||
|
||||
pygame.draw.circle(
|
||||
self.screen, (0, 0, 255), (self.hero.x, self.hero.y), self.hero.size
|
||||
)
|
||||
self.screen.blit(
|
||||
my_font.render(self.hero.name, False, (255, 255, 255)),
|
||||
(self.hero.x, self.hero.y),
|
||||
)
|
||||
|
||||
# update the screen
|
||||
pygame.display.flip()
|
||||
|
||||
def handle_events(self):
|
||||
self.events = pygame.event.get()
|
||||
for event in self.events:
|
||||
if event.type == pygame.QUIT:
|
||||
self.running = False
|
||||
if event.type == pygame.KEYDOWN:
|
||||
if event.key == pygame.K_ESCAPE:
|
||||
self.running = False
|
||||
if event.key == pygame.K_LEFT:
|
||||
self.moving_left = True
|
||||
if event.key == pygame.K_RIGHT:
|
||||
self.moving_right = True
|
||||
if event.key == pygame.K_UP:
|
||||
self.moving_up = True
|
||||
if event.key == pygame.K_DOWN:
|
||||
self.moving_down = True
|
||||
# wasd
|
||||
if event.key == pygame.K_w:
|
||||
self.moving_up = True
|
||||
if event.key == pygame.K_s:
|
||||
self.moving_down = True
|
||||
if event.key == pygame.K_a:
|
||||
self.moving_left = True
|
||||
if event.key == pygame.K_d:
|
||||
self.moving_right = True
|
||||
# controller left joystick
|
||||
|
||||
if event.type == pygame.KEYUP:
|
||||
if event.key == pygame.K_LEFT:
|
||||
self.moving_left = False
|
||||
if event.key == pygame.K_RIGHT:
|
||||
self.moving_right = False
|
||||
if event.key == pygame.K_UP:
|
||||
self.moving_up = False
|
||||
if event.key == pygame.K_DOWN:
|
||||
self.moving_down = False
|
||||
# wasd
|
||||
if event.key == pygame.K_w:
|
||||
self.moving_up = False
|
||||
if event.key == pygame.K_s:
|
||||
self.moving_down = False
|
||||
if event.key == pygame.K_a:
|
||||
self.moving_left = False
|
||||
if event.key == pygame.K_d:
|
||||
self.moving_right = False
|
||||
|
||||
def check_events(self):
|
||||
pass
|
||||
|
||||
def check_collisions(self):
|
||||
pass
|
||||
|
||||
|
||||
app = Typer()
|
||||
|
||||
|
||||
@app.command()
|
||||
def run(
|
||||
name: str = typer.Option(...),
|
||||
secret_name: str = typer.Option(...),
|
||||
):
|
||||
client = Client(name, secret_name)
|
||||
client.run()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
app()
|
||||
|
|
@ -12,6 +12,9 @@ from learn_sql_model.models.pet import Pet
|
|||
class HeroBase(SQLModel, table=False):
|
||||
name: str
|
||||
secret_name: str
|
||||
x: int
|
||||
y: int
|
||||
size: int
|
||||
age: Optional[int] = None
|
||||
shoe_size: Optional[int] = None
|
||||
|
||||
|
|
@ -34,6 +37,8 @@ class HeroCreate(HeroBase):
|
|||
if r.status_code != 200:
|
||||
raise RuntimeError(f"{r.status_code}:\n {r.text}")
|
||||
|
||||
return Hero.parse_obj(r.json())
|
||||
|
||||
|
||||
class HeroRead(HeroBase):
|
||||
id: int
|
||||
|
|
@ -80,6 +85,8 @@ class HeroUpdate(SQLModel):
|
|||
secret_name: Optional[str] = None
|
||||
age: Optional[int] = None
|
||||
shoe_size: Optional[int] = None
|
||||
x: int
|
||||
y: int
|
||||
|
||||
pet_id: Optional[int] = Field(default=None, foreign_key="pet.id")
|
||||
pet: Optional[Pet] = Relationship(back_populates="hero")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue