wip, might not be good
This commit is contained in:
parent
f53879f961
commit
6d5bfaeeda
63 changed files with 1897 additions and 93 deletions
|
|
@ -1,15 +1,15 @@
|
|||
from pathlib import Path
|
||||
from typing import Annotated
|
||||
|
||||
import copier
|
||||
# import copier
|
||||
import typer
|
||||
|
||||
from learn_sql_model.cli.common import verbose_callback
|
||||
from learn_sql_model.config import get_config
|
||||
from learn_sql_model.optional import _optional_import_
|
||||
|
||||
alembic = _optional_import_('alembic', group='manage')
|
||||
Config = _optional_import_('alembic.config', 'Config', group='manage')
|
||||
alembic = _optional_import_("alembic", group="manage")
|
||||
Config = _optional_import_("alembic.config", "Config", group="manage")
|
||||
|
||||
model_app = typer.Typer()
|
||||
|
||||
|
|
@ -94,5 +94,4 @@ def populate(
|
|||
callback=verbose_callback,
|
||||
help="show the log messages",
|
||||
),
|
||||
):
|
||||
...
|
||||
): ...
|
||||
|
|
|
|||
25
learn_sql_model/game/debug.py
Normal file
25
learn_sql_model/game/debug.py
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
import pygame
|
||||
|
||||
|
||||
class Debug:
|
||||
def __init__(self, game):
|
||||
self.game = game
|
||||
self.is_open = False
|
||||
self.debounce = False
|
||||
|
||||
def handle_events(self, events):
|
||||
for event in events:
|
||||
if event.type == pygame.KEYDOWN:
|
||||
if event.key == pygame.K_F3 and not self.debounce:
|
||||
self.is_open = not self.is_open
|
||||
self.debounce = True
|
||||
if event.type == pygame.KEYUP:
|
||||
if event.key == pygame.K_F3:
|
||||
self.debounce = False
|
||||
|
||||
def render(self):
|
||||
if self.is_open:
|
||||
text = self.game.font.render(
|
||||
str(int(self.game.clock.get_fps())) + " fps", True, (255, 255, 255)
|
||||
)
|
||||
self.game.screen.blit(text, (20, 20))
|
||||
|
|
@ -5,6 +5,7 @@ from websocket import create_connection
|
|||
|
||||
from learn_sql_model.config import get_config
|
||||
from learn_sql_model.console import console
|
||||
from learn_sql_model.game.debug import Debug
|
||||
from learn_sql_model.game.light import Light
|
||||
from learn_sql_model.game.map import Map
|
||||
from learn_sql_model.game.menu import Menu
|
||||
|
|
@ -20,7 +21,8 @@ config = get_config()
|
|||
|
||||
class Client:
|
||||
def __init__(self):
|
||||
self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
|
||||
# self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
|
||||
self.screen = pygame.display.set_mode((1280, 720))
|
||||
pygame.display.set_caption("Learn SQL Model")
|
||||
self.clock = pygame.time.Clock()
|
||||
self.running = True
|
||||
|
|
@ -38,8 +40,11 @@ class Client:
|
|||
self.font = pygame.font.SysFont("", 25)
|
||||
self.joysticks = {}
|
||||
self.darkness = pygame.Surface(
|
||||
(self.screen.get_width(), self.screen.get_height())
|
||||
(self.screen.get_width(), self.screen.get_height()),
|
||||
pygame.SRCALPHA,
|
||||
32,
|
||||
)
|
||||
self.debug = Debug(self)
|
||||
|
||||
atexit.register(self.quit)
|
||||
|
||||
|
|
@ -75,11 +80,11 @@ class Client:
|
|||
console.print("update")
|
||||
self.update()
|
||||
console.print("render")
|
||||
|
||||
self.render()
|
||||
time = self.clock.tick(60)
|
||||
self.elapsed = time / 100
|
||||
self.ticks += 1
|
||||
# Console().print(self.clock.get_fps())
|
||||
console.print(f"time: {time}")
|
||||
console.print(f"ticks: {self.ticks}")
|
||||
if profiler:
|
||||
|
|
@ -98,9 +103,11 @@ class Client:
|
|||
self.screen.fill((0, 0, 0))
|
||||
self.map.render()
|
||||
self.player.render()
|
||||
light_level = 0
|
||||
self.darkness.fill((light_level, light_level, light_level))
|
||||
self.light.render()
|
||||
|
||||
if self.ticks % 1 == 0 or self.ticks == 0:
|
||||
light_level = 0
|
||||
self.darkness.fill((light_level, light_level, light_level))
|
||||
self.light.render()
|
||||
self.screen.blit(
|
||||
self.darkness,
|
||||
(0, 0),
|
||||
|
|
@ -109,11 +116,13 @@ class Client:
|
|||
|
||||
# update the screen
|
||||
self.menu.render()
|
||||
self.debug.render()
|
||||
pygame.display.flip()
|
||||
|
||||
def handle_events(self):
|
||||
self.events = pygame.event.get()
|
||||
self.menu.handle_events(self.events)
|
||||
self.debug.handle_events(self.events)
|
||||
self.player.handle_events()
|
||||
for event in self.events:
|
||||
if event.type == pygame.QUIT:
|
||||
|
|
|
|||
|
|
@ -1,34 +1,133 @@
|
|||
import bisect
|
||||
|
||||
from PIL import Image, ImageFilter
|
||||
|
||||
from learn_sql_model.optional import _optional_import_
|
||||
|
||||
pygame = _optional_import_("pygame", group="game")
|
||||
|
||||
|
||||
def rot_center(image, angle):
|
||||
"""rotate an image while keeping its center and size"""
|
||||
orig_rect = image.get_rect()
|
||||
rot_image = pygame.transform.rotate(image, angle)
|
||||
rot_rect = orig_rect.copy()
|
||||
rot_rect.center = rot_image.get_rect().center
|
||||
rot_image = rot_image.subsurface(rot_rect).copy()
|
||||
return rot_image
|
||||
|
||||
|
||||
class Light:
|
||||
def __init__(self, game):
|
||||
self.game = game
|
||||
self.surf = pygame.Surface(
|
||||
(self.game.screen.get_width(), self.game.screen.get_height())
|
||||
(self.game.screen.get_width(), self.game.screen.get_height()),
|
||||
pygame.SRCALPHA,
|
||||
32,
|
||||
)
|
||||
# pil_image = Image.new("RGBA", (1000, 500))
|
||||
# pil_draw = ImageDraw.Draw(pil_image)
|
||||
# pil_draw.pieslice((-1500, -100, 1000, 600), 340, 20, fill=(255, 250, 205))
|
||||
# pil_image = pil_image.filter(ImageFilter.GaussianBlur(radius=5))
|
||||
self.surf.set_colorkey((0, 0, 0))
|
||||
self.pre_render()
|
||||
|
||||
# mode = pil_image.mode
|
||||
# size = pil_image.size
|
||||
# data = pil_image.tobytes()
|
||||
def pre_render(self):
|
||||
|
||||
# self.image = pygame.image.fromstring(data, size, mode)
|
||||
# self.lights = {}
|
||||
# for deg in range(-360, 360, 20):
|
||||
# print("loading light", deg)
|
||||
# self.lights[deg] = pygame.image.load(
|
||||
# f"lights/light-{deg}.png"
|
||||
# ).convert_alpha()
|
||||
# return
|
||||
|
||||
# for r in range(-25, 25):
|
||||
# _v = v.rotate(r)
|
||||
# pygame.draw.line(
|
||||
# self.game.screen,
|
||||
# (255, 250, 205),
|
||||
# (0, 50),
|
||||
# (0 + _v.x, self.game.player.hero.y + _v.y),
|
||||
# 50,
|
||||
# )
|
||||
light_surf = pygame.Surface(
|
||||
(
|
||||
self.game.player.hero.flashlight_strength * 3,
|
||||
self.game.player.hero.flashlight_strength * 3,
|
||||
),
|
||||
pygame.SRCALPHA,
|
||||
32,
|
||||
)
|
||||
|
||||
v = pygame.math.Vector2(0, 1)
|
||||
v.scale_to_length(self.game.player.hero.flashlight_strength)
|
||||
for r in range(-90 - 25, -90 + 25):
|
||||
_v = v.rotate(r)
|
||||
pygame.draw.line(
|
||||
light_surf,
|
||||
(255, 250, 205),
|
||||
(light_surf.get_width() / 2, light_surf.get_height() / 2),
|
||||
(
|
||||
light_surf.get_width() / 2 + _v.x,
|
||||
light_surf.get_height() / 2 + _v.y,
|
||||
),
|
||||
50,
|
||||
)
|
||||
pygame.draw.circle(
|
||||
light_surf,
|
||||
(255, 250, 205),
|
||||
(light_surf.get_width() / 2, light_surf.get_height() / 2),
|
||||
self.game.player.hero.lanturn_strength,
|
||||
)
|
||||
|
||||
light_surf_pil = Image.frombytes(
|
||||
"RGBA",
|
||||
(light_surf.get_width(), light_surf.get_height()),
|
||||
pygame.image.tostring(light_surf, "RGBA", False),
|
||||
)
|
||||
light_surf_blur = light_surf_pil.filter(ImageFilter.GaussianBlur(radius=100))
|
||||
light_surf = pygame.image.fromstring(
|
||||
light_surf_blur.tobytes(),
|
||||
(light_surf.get_width(), light_surf.get_height()),
|
||||
"RGBA",
|
||||
).convert_alpha()
|
||||
|
||||
pygame.draw.circle(
|
||||
light_surf,
|
||||
(255, 250, 205),
|
||||
(light_surf.get_width() / 2, light_surf.get_height() / 2),
|
||||
self.game.player.hero.lanturn_strength,
|
||||
)
|
||||
|
||||
light_surf_pil = Image.frombytes(
|
||||
"RGBA",
|
||||
(light_surf.get_width(), light_surf.get_height()),
|
||||
pygame.image.tostring(light_surf, "RGBA", False),
|
||||
)
|
||||
light_surf_blur = light_surf_pil.filter(ImageFilter.GaussianBlur(radius=50))
|
||||
light_surf = pygame.image.fromstring(
|
||||
light_surf_blur.tobytes(),
|
||||
(light_surf.get_width(), light_surf.get_height()),
|
||||
"RGBA",
|
||||
).convert_alpha()
|
||||
|
||||
pygame.draw.circle(
|
||||
light_surf,
|
||||
(255, 250, 205),
|
||||
(light_surf.get_width() / 2, light_surf.get_height() / 2),
|
||||
self.game.player.hero.lanturn_strength,
|
||||
)
|
||||
|
||||
light_surf_pil = Image.frombytes(
|
||||
"RGBA",
|
||||
(light_surf.get_width(), light_surf.get_height()),
|
||||
pygame.image.tostring(light_surf, "RGBA", False),
|
||||
)
|
||||
light_surf_blur = light_surf_pil.filter(ImageFilter.GaussianBlur(radius=20))
|
||||
light_surf = pygame.image.fromstring(
|
||||
light_surf_blur.tobytes(),
|
||||
(light_surf.get_width(), light_surf.get_height()),
|
||||
"RGBA",
|
||||
).convert_alpha()
|
||||
|
||||
self.light_surf = light_surf
|
||||
self.light_surf.set_colorkey((0, 0, 0))
|
||||
|
||||
self.lights = {
|
||||
deg: pygame.transform.rotate(self.light_surf, deg - 90)
|
||||
for deg in range(-360, 360, 20)
|
||||
}
|
||||
|
||||
for deg, light in self.lights.items():
|
||||
pygame.image.save(light, f"lights/light-{deg}.png")
|
||||
|
||||
def render(self):
|
||||
self.surf.fill((0, 0, 0))
|
||||
|
|
@ -37,68 +136,84 @@ class Light:
|
|||
mx - self.game.player.hero.x, my - self.game.player.hero.y
|
||||
)
|
||||
v.scale_to_length(self.game.player.hero.flashlight_strength)
|
||||
self.game.player.hero.flashlight_angle = v.angle_to(pygame.math.Vector2(0, 1))
|
||||
|
||||
for r in range(-25, 25):
|
||||
_v = v.rotate(r)
|
||||
pygame.draw.line(
|
||||
self.surf,
|
||||
(255, 250, 205),
|
||||
(self.game.player.hero.x, self.game.player.hero.y),
|
||||
(self.game.player.hero.x + _v.x, self.game.player.hero.y + _v.y),
|
||||
50,
|
||||
)
|
||||
self.game.player.hero.flashlight_angle = v.angle_to(pygame.math.Vector2(1, 0))
|
||||
|
||||
for other in self.game.player.others.__root__:
|
||||
if other.id == self.game.player.hero.id:
|
||||
continue
|
||||
v = pygame.math.Vector2(0, 1)
|
||||
v = v.rotate(-other.flashlight_angle)
|
||||
v.scale_to_length(other.flashlight_strength)
|
||||
for r in range(-25, 25):
|
||||
_v = v.rotate(r)
|
||||
pygame.draw.line(
|
||||
self.surf,
|
||||
(255, 250, 205),
|
||||
(other.x, other.y),
|
||||
(other.x + _v.x, other.y + _v.y),
|
||||
50,
|
||||
|
||||
light_index = list(self.lights.keys())[
|
||||
bisect.bisect_left(
|
||||
list(self.lights.keys()),
|
||||
other.flashlight_angle + 90,
|
||||
)
|
||||
pygame.draw.circle(
|
||||
self.surf,
|
||||
(255, 250, 205),
|
||||
(other.x, other.y),
|
||||
other.lanturn_strength,
|
||||
]
|
||||
|
||||
my_light = self.lights[light_index]
|
||||
self.surf.blit(
|
||||
my_light,
|
||||
(
|
||||
other.x - my_light.get_width() / 2,
|
||||
other.y - my_light.get_height() / 2,
|
||||
),
|
||||
)
|
||||
|
||||
# draw a circle
|
||||
pygame.draw.circle(
|
||||
self.surf,
|
||||
(255, 250, 205),
|
||||
(self.game.player.hero.x, self.game.player.hero.y),
|
||||
self.game.player.hero.lanturn_strength,
|
||||
light_index = list(self.lights.keys())[
|
||||
bisect.bisect_left(
|
||||
list(self.lights.keys()),
|
||||
self.game.player.hero.flashlight_angle + 90,
|
||||
)
|
||||
]
|
||||
|
||||
my_light = self.lights[light_index]
|
||||
self.surf.blit(
|
||||
my_light,
|
||||
(
|
||||
self.game.player.hero.x - my_light.get_width() / 2,
|
||||
self.game.player.hero.y - my_light.get_height() / 2,
|
||||
),
|
||||
)
|
||||
|
||||
# for r in range(-25, 25):
|
||||
# _v = v.rotate(r)
|
||||
# pygame.draw.line(
|
||||
# self.surf,
|
||||
# (255, 250, 205),
|
||||
# (self.game.player.hero.x, self.game.player.hero.y),
|
||||
# (self.game.player.hero.x + _v.x, self.game.player.hero.y + _v.y),
|
||||
# 50,
|
||||
# )
|
||||
# # draw a circle
|
||||
# pygame.draw.circle(
|
||||
# self.surf,
|
||||
# (255, 250, 205),
|
||||
# (self.game.player.hero.x, self.game.player.hero.y),
|
||||
# self.game.player.hero.lanturn_strength,
|
||||
# )
|
||||
|
||||
# for other in self.game.player.others.__root__:
|
||||
# if other.id == self.game.player.hero.id:
|
||||
# continue
|
||||
# v = pygame.math.Vector2(0, 1)
|
||||
# v = v.rotate(-other.flashlight_angle)
|
||||
# v.scale_to_length(other.flashlight_strength)
|
||||
# for r in range(-25, 25):
|
||||
# _v = v.rotate(r)
|
||||
# pygame.draw.line(
|
||||
# self.surf,
|
||||
# (255, 250, 205),
|
||||
# (other.x, other.y),
|
||||
# (other.x + _v.x, other.y + _v.y),
|
||||
# 50,
|
||||
# )
|
||||
# pygame.draw.circle(
|
||||
# self.surf,
|
||||
# (255, 250, 205),
|
||||
# (other.x, other.y),
|
||||
# other.lanturn_strength,
|
||||
# )
|
||||
|
||||
self.game.darkness.blit(
|
||||
self.surf,
|
||||
(0, 0),
|
||||
)
|
||||
|
||||
|
||||
def render_flashlight(light, strength, angle):
|
||||
|
||||
# self.darkness.blit(
|
||||
# pygame.transform.smoothscale(
|
||||
# self.spot, [self.light_power, self.light_power]
|
||||
# ),
|
||||
# (self.x - self.light_power / 2, self.y - self.light_power / 2),
|
||||
# )
|
||||
for r in range(-25, 25):
|
||||
_v = v.rotate(r)
|
||||
pygame.draw.line(
|
||||
light,
|
||||
(255, 250, 205),
|
||||
(self.game.player.hero.x, self.game.player.hero.y),
|
||||
(self.game.player.hero.x + _v.x, self.game.player.hero.y + _v.y),
|
||||
50,
|
||||
)
|
||||
|
|
|
|||
|
|
@ -39,6 +39,33 @@ class Map:
|
|||
# try to load the map from map.png
|
||||
try:
|
||||
self.surf = pygame.image.load("map.png").convert_alpha()
|
||||
|
||||
# self.surf_pil = Image.frombytes(
|
||||
# "RGBA",
|
||||
# (self.surf.get_width(), self.surf.get_height()),
|
||||
# pygame.image.tostring(self.surf, "RGBA", False),
|
||||
# )
|
||||
# self.surf_blur = (
|
||||
# self.surf_pil.filter(
|
||||
# ImageFilter.SMOOTH_MORE(),
|
||||
# )
|
||||
# .filter(ImageFilter.SMOOTH_MORE())
|
||||
# .filter(ImageFilter.SMOOTH_MORE())
|
||||
# .filter(ImageFilter.SMOOTH_MORE())
|
||||
# .filter(ImageFilter.SMOOTH_MORE())
|
||||
# .filter(ImageFilter.SMOOTH_MORE())
|
||||
# # sharpen
|
||||
# .filter(ImageFilter.UnsharpMask(radius=3, percent=100, threshold=3))
|
||||
# .filter(ImageFilter.UnsharpMask(radius=3, percent=100, threshold=3))
|
||||
# .filter(ImageFilter.UnsharpMask(radius=3, percent=100, threshold=3))
|
||||
# )
|
||||
|
||||
# self.surf = pygame.image.fromstring(
|
||||
# self.surf_blur.tobytes(),
|
||||
# (self.surf.get_width(), self.surf.get_height()),
|
||||
# "RGBA",
|
||||
# ).convert_alpha()
|
||||
|
||||
except FileNotFoundError:
|
||||
self.pre_draw()
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
from typing import Callable, Tuple
|
||||
|
||||
from pydantic import BaseModel
|
||||
|
||||
from learn_sql_model.optional import _optional_import_
|
||||
|
||||
pygame = _optional_import_("pygame", group="game")
|
||||
|
|
@ -113,7 +114,7 @@ class Menu:
|
|||
def handle_events(self, events):
|
||||
self.hamburger.handle_events(self, events)
|
||||
for event in events:
|
||||
if event.type == pygame.MOUSEBUTTONDOWN:
|
||||
if event.type == pygame.MOUSEBUTTONDOWN and self.is_menu_open:
|
||||
if event.button == 1: # Left mouse button
|
||||
self.handle_click()
|
||||
|
||||
|
|
|
|||
|
|
@ -33,9 +33,13 @@ class Player:
|
|||
self.speed = 10
|
||||
self.max_speed = 10
|
||||
self.image = pygame.image.load("creeper.png").convert_alpha()
|
||||
self.pet_image = pygame.image.load("pet.png").convert_alpha()
|
||||
self.image = pygame.transform.scale(
|
||||
self.image, (self.hero.size, self.hero.size)
|
||||
)
|
||||
self.pet_image = pygame.transform.scale(
|
||||
self.pet_image, (self.hero.size/1.5, self.hero.size/2)
|
||||
)
|
||||
self.x_last = self.x
|
||||
self.y_last = self.y
|
||||
self.hitbox_surface = pygame.Surface((self.width, self.height))
|
||||
|
|
@ -204,16 +208,16 @@ class Player:
|
|||
self.x_last = self.hero.x
|
||||
self.y_last = self.hero.y
|
||||
|
||||
# if self.game.ticks % 1 == 0 or self.game.ticks == 0:
|
||||
console.print("updating")
|
||||
update = HeroUpdate(**self.hero.dict(exclude_unset=True))
|
||||
console.print(update)
|
||||
self.game.ws.send(update.json())
|
||||
console.print("sent")
|
||||
if self.game.ticks % 60 == 0 or self.game.ticks == 0:
|
||||
console.print("updating")
|
||||
update = HeroUpdate(**self.hero.dict(exclude_unset=True))
|
||||
console.print(update)
|
||||
self.game.ws.send(update.json())
|
||||
console.print("sent")
|
||||
|
||||
raw_heros = self.game.ws.recv()
|
||||
console.print(raw_heros)
|
||||
self.others = Heros.parse_raw(raw_heros)
|
||||
raw_heros = self.game.ws.recv()
|
||||
console.print(raw_heros)
|
||||
self.others = Heros.parse_raw(raw_heros)
|
||||
|
||||
def draw(self):
|
||||
self.move()
|
||||
|
|
@ -242,6 +246,10 @@ class Player:
|
|||
self.image,
|
||||
(self.hero.x - self.hero.size / 2, self.hero.y - self.hero.size / 2),
|
||||
)
|
||||
self.game.screen.blit(
|
||||
self.pet_image,
|
||||
(self.hero.x + self.hero.size / 2, self.hero.y - self.hero.size / 2),
|
||||
)
|
||||
|
||||
# pygame.draw.circle(
|
||||
# self.game.screen, (0, 0, 255), (self.hero.x, self.hero.y), self.hero.size
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue