initial
This commit is contained in:
commit
29d5218f97
5 changed files with 162 additions and 0 deletions
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
*.pyc
|
||||
__pycache__
|
||||
.mypy_cache
|
16
.vscode/launch.json
vendored
Normal file
16
.vscode/launch.json
vendored
Normal file
|
@ -0,0 +1,16 @@
|
|||
{
|
||||
// Use IntelliSense to learn about possible attributes.
|
||||
// Hover to view descriptions of existing attributes.
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Python: beamshow",
|
||||
"type": "python",
|
||||
"request": "launch",
|
||||
"program": "beamshow.py",
|
||||
"console": "integratedTerminal",
|
||||
"justMyCode": true
|
||||
}
|
||||
]
|
||||
}
|
46
beamshow.py
Normal file
46
beamshow.py
Normal file
|
@ -0,0 +1,46 @@
|
|||
from pygame.locals import *
|
||||
import math
|
||||
import pygame as pg
|
||||
import random
|
||||
import sys
|
||||
import time
|
||||
|
||||
from effects.bouncingspot import BouncingSpot
|
||||
|
||||
# pg.init()
|
||||
|
||||
win = pg.display.set_mode(size=(1600, 1200), flags=pg.RESIZABLE)
|
||||
|
||||
background = pg.Surface(win.get_size())
|
||||
background.fill(pg.Color(0, 0, 0))
|
||||
|
||||
|
||||
effects = [
|
||||
BouncingSpot(
|
||||
bounds=win.get_rect(),
|
||||
colored=False,
|
||||
sizes=(300, 300),
|
||||
velocity=(1, 1),
|
||||
x_factor=(1, 1),
|
||||
y_factor=(2.2, 2.2),
|
||||
),
|
||||
# BouncingSpot(bounds=win.get_rect())
|
||||
]
|
||||
|
||||
|
||||
FPS = pg.time.Clock()
|
||||
|
||||
while True:
|
||||
for event in pg.event.get():
|
||||
if event.type == QUIT:
|
||||
pg.quit()
|
||||
sys.exit()
|
||||
|
||||
win.blit(background, (0, 0))
|
||||
for e in effects:
|
||||
e.update()
|
||||
e.draw(win)
|
||||
|
||||
pg.display.flip()
|
||||
FPS.tick(60)
|
||||
# print(FPS.get_fps())
|
83
effects/bouncingspot.py
Normal file
83
effects/bouncingspot.py
Normal file
|
@ -0,0 +1,83 @@
|
|||
from typing import Any
|
||||
import pygame as pg
|
||||
from effects.effect import Effect
|
||||
import random
|
||||
import math
|
||||
|
||||
|
||||
class BouncingSpot(Effect):
|
||||
# MIN_SIZE = 10
|
||||
# max_size = 100
|
||||
# min_velocity = 1
|
||||
# max_velocity = 10
|
||||
# min_xy_factor = 0.1
|
||||
# max_xy_factor = 1
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
bounds: pg.Rect,
|
||||
colored=True,
|
||||
sizes=(10, 100),
|
||||
velocity=(1, 10),
|
||||
x_factor=(0.1, 1),
|
||||
y_factor=(0.1, 1),
|
||||
*groups: pg.sprite.Group
|
||||
) -> None:
|
||||
self.colored = colored
|
||||
self.min_size = sizes[0]
|
||||
self.max_size = sizes[1]
|
||||
self.min_velocity = velocity[0]
|
||||
self.max_velocity = velocity[1]
|
||||
|
||||
self.velocity = random.randint(self.min_velocity, self.max_velocity)
|
||||
self.ticks = random.randint(0, 360)
|
||||
self.x_factor = random.uniform(x_factor[0], x_factor[1])
|
||||
self.y_factor = random.uniform(y_factor[0], y_factor[1])
|
||||
self.color = pg.Color(
|
||||
255,
|
||||
0 if colored else 255,
|
||||
0 if colored else 255,
|
||||
255,
|
||||
)
|
||||
size = (math.sin(self.ticks) / 2 + 0.5) * (
|
||||
self.max_size - self.min_size
|
||||
) + self.min_size
|
||||
image = pg.Surface((self.max_size, self.max_size), flags=pg.SRCALPHA, depth=32)
|
||||
super().__init__(
|
||||
image=image,
|
||||
rect=pg.Rect(
|
||||
bounds.centerx - size / 2,
|
||||
bounds.centery - size / 2,
|
||||
size,
|
||||
size,
|
||||
),
|
||||
*groups
|
||||
)
|
||||
self.bounds = bounds
|
||||
self.update()
|
||||
|
||||
def update(self, *args: Any, **kwargs: Any) -> None:
|
||||
new_size = (math.sin(self.ticks) / 2 + 0.5) * (
|
||||
self.max_size - self.min_size
|
||||
) + self.min_size
|
||||
|
||||
new_scale = new_size - self.rect.width
|
||||
self.rect.inflate_ip(new_scale, new_scale)
|
||||
self.rect.centerx = (
|
||||
0.4 * math.cos(self.x_factor * self.ticks) * self.bounds.width
|
||||
+ self.bounds.centerx
|
||||
)
|
||||
self.rect.centery = (
|
||||
0.4 * math.sin(self.y_factor * self.ticks) * self.bounds.height
|
||||
+ self.bounds.centery
|
||||
)
|
||||
|
||||
self.image.fill(pg.Color(255, 255, 0, 0))
|
||||
pg.draw.ellipse(self.image, self.color, ((0, 0), self.rect.size))
|
||||
|
||||
self.ticks += self.velocity / 180 * math.pi
|
||||
self.velocity = random.randint(self.min_velocity, self.max_velocity)
|
||||
if self.colored:
|
||||
h, s, l, a = self.color.hsla
|
||||
h = (h + 1) % 256
|
||||
self.color.hsla = h, s, l, a
|
14
effects/effect.py
Normal file
14
effects/effect.py
Normal file
|
@ -0,0 +1,14 @@
|
|||
import pygame as pg
|
||||
from abc import abstractmethod
|
||||
|
||||
|
||||
class Effect(pg.sprite.Sprite):
|
||||
def __init__(
|
||||
self, image: pg.Surface, rect: pg.Rect, *groups: pg.sprite.Group
|
||||
) -> None:
|
||||
super().__init__(*groups)
|
||||
self.rect = rect
|
||||
self.image = image
|
||||
|
||||
def draw(self, surface: pg.Surface):
|
||||
surface.blit(self.image, self.rect)
|
Loading…
Add table
Add a link
Reference in a new issue