Compare commits

..

1 commit
main ... demo

Author SHA1 Message Date
ec187aeacb Added a text to demonstrate interaction with other objects. 2024-07-15 20:36:23 +02:00

View file

@ -4,19 +4,17 @@ import pygame
from pygame._sdl2 import Window from pygame._sdl2 import Window
from dataclasses import dataclass from dataclasses import dataclass
from wobbl_tools.data_file import load_dataclass_json, save_dataclass_json from wobbl_tools.data_file import load_dataclass_json, save_dataclass_json
from random import getrandbits from random import choice
def true_false_random(): def true_false_random():
return getrandbits(1) == 0 return choice([True, False])
@dataclass @dataclass
class Settings: class Settings:
fps: int = 60 fps: int = 60
window_size: tuple = (1000, 600) window_size: tuple = (1000, 600)
slipperiness_left: int = 1
slipperiness_right: int = 1
class FallingSandParticle: class FallingSandParticle:
@ -34,38 +32,38 @@ class FallingSandParticle:
old_pos = self.pos old_pos = self.pos
ox, oy = old_pos ox, oy = old_pos
if oy >= self.app.sand_surface.get_height() - self.app.max_height: if oy >= self.app.sand_surface.get_height() - 4:
self.app.falling_sand_particles.remove(self) self.app.falling_sand_particles.remove(self)
return return
x, y = self.pos x, y = self.pos
if self.app.matrix[ox, oy + 1] == self.app.sand_surface.map_rgb(self.app.gray): # fall down if self.app.matrix[ox, oy + 1] == self.app.sand_surface.map_rgb(self.app.gray):
y += 1 y += 1
elif ( elif (
self.app.matrix[ox - 1, oy + self.app.slipperiness_left] == self.app.sand_surface.map_rgb(self.app.gray) self.app.matrix[ox - 1, oy + 2] == self.app.sand_surface.map_rgb(self.app.gray)
and self.app.matrix[ox + 1, oy + self.app.slipperiness_right] == self.app.sand_surface.map_rgb(self.app.gray) and self.app.matrix[ox + 1, oy + 2] == self.app.sand_surface.map_rgb(self.app.gray)
): # when the sand can slide in two directions ):
if true_false_random(): if true_false_random():
x -= 1 x -= 1
y += self.app.slipperiness_left y += 2
else: else:
x += 1 x += 1
y += self.app.slipperiness_right y += 2
elif self.app.matrix[ox - 1, oy + self.app.slipperiness_left] == self.app.sand_surface.map_rgb(self.app.gray): # can only slide left elif self.app.matrix[ox - 1, oy + 2] == self.app.sand_surface.map_rgb(self.app.gray):
x -= 1 x -= 1
y += self.app.slipperiness_left y += 2
elif self.app.matrix[ox + 1, oy + self.app.slipperiness_right] == self.app.sand_surface.map_rgb(self.app.gray): # can only slide right elif self.app.matrix[ox + 1, oy + 2] == self.app.sand_surface.map_rgb(self.app.gray):
x += 1 x += 1
y += self.app.slipperiness_right y += 2
else: else:
if self.not_moving == 32: # counter that increases when the particle is inactive and if it is 32, if self.not_moving == 32:
if self.app.mouse_pressed[0]: # the particle's physics get deactivated for better performance. if self.app.mouse_pressed[0]:
self.not_moving = 0 self.not_moving = 0
else: else:
@ -82,7 +80,7 @@ class FallingSandParticle:
return return
if not x > self.app.sand_surface.get_width() - 2: # game would crash when the particle goes outside the border. if not x > self.app.sand_surface.get_width() - 2:# and not x < 0:
self.not_moving = 0 self.not_moving = 0
self.pos = (x, y) self.pos = (x, y)
@ -95,23 +93,20 @@ class FallingSand:
def __init__(self): def __init__(self):
pygame.init() pygame.init()
self.screen = pygame.display.set_mode((1000, 600), pygame.RESIZABLE) # pygame init default shit self.screen = pygame.display.set_mode((1000, 600), pygame.RESIZABLE)
pygame.display.set_caption("Wobbl Sand") pygame.display.set_caption("Wobbl Sand")
self.window = Window.from_display_module() self.window = Window.from_display_module()
self.loading_surface = self.generate_loading_surface() # just the loading screen self.loading_surface = self.generate_loading_surface()
self.screen.blit(self.loading_surface, (0, 0)) self.screen.blit(self.loading_surface, (0, 0))
pygame.display.update() pygame.display.update()
self.settings = load_dataclass_json(Settings, "settings.json") # load settings self.settings = load_dataclass_json(Settings, "settings.json")
setattr(self.settings, "save", lambda: save_dataclass_json(self.settings, "settings.json")) setattr(self.settings, "save", lambda: save_dataclass_json(self.settings, "settings.json"))
self.fps = self.settings.fps self.fps = self.settings.fps
self.slipperiness_left = self.settings.slipperiness_left
self.slipperiness_right = self.settings.slipperiness_right
self.max_height = self.slipperiness_left if self.slipperiness_left > self.slipperiness_right else self.slipperiness_right
self.falling_sand_particles = [] self.falling_sand_particles = []
self.rainbow_data = [[255, 40, 40], 0] # color calculation stuff self.rainbow_data = [[255, 40, 40], 0]
self.rainbow_steps = [(1, True), (0, False), (2, True), (1, False), (0, True), (2, False)] self.rainbow_steps = [(1, True), (0, False), (2, True), (1, False), (0, True), (2, False)]
# colors # colors
@ -124,6 +119,8 @@ class FallingSand:
self.mouse_pos = self.mouse.get_pos() self.mouse_pos = self.mouse.get_pos()
self.sand_surface = pygame.Surface(self.settings.window_size) self.sand_surface = pygame.Surface(self.settings.window_size)
self.sand_surface.fill(self.gray) self.sand_surface.fill(self.gray)
self.text = pygame.font.Font(pygame.font.get_default_font(), 32).render("Hallo, das ist Sand!!!", True, "white")
self.sand_surface.blit(self.text, (self.screen.get_width() // 2, self.screen.get_height() // 2))
self.matrix = pygame.PixelArray(self.sand_surface) self.matrix = pygame.PixelArray(self.sand_surface)
# loading finished # loading finished
@ -147,7 +144,7 @@ class FallingSand:
def loop(self): def loop(self):
self.screen.fill(self.gray) self.screen.fill(self.gray)
self.matrix = pygame.PixelArray(self.sand_surface) # matrix to draw the sand particles on self.matrix = pygame.PixelArray(self.sand_surface)
self.mouse_pressed = self.mouse.get_pressed() self.mouse_pressed = self.mouse.get_pressed()
self.mouse_pos = self.mouse.get_pos() self.mouse_pos = self.mouse.get_pos()
@ -213,7 +210,7 @@ class FallingSand:
bx += ax bx += ax
by += ay by += ay
if bx < self.sand_surface.get_width() - 2 and by < self.sand_surface.get_height() -2 and self.matrix[bx, by] == self.sand_surface.map_rgb(self.gray) and bx % 2 == 0 and by % 2 == 0: if not bx > self.sand_surface.get_width() - 2 and self.matrix[bx, by] == self.sand_surface.map_rgb(self.gray) and bx % 2 == 0 and by % 2 == 0:
self.falling_sand_particles.append(FallingSandParticle(self, (bx, by), color)) self.falling_sand_particles.append(FallingSandParticle(self, (bx, by), color))
def rainbow(self): def rainbow(self):