From 8affb416da2ddc6d3afa004fd8dc850e1332fa07 Mon Sep 17 00:00:00 2001 From: Linus Vogel Date: Sat, 13 Dec 2025 19:45:59 +0100 Subject: [PATCH] working on background --- .idea/.idea.StarSkyPresenter/.idea/.name | 1 - MainScript.cs | 20 ++++--- build/lib/controller/__init__.py | 0 build/lib/controller/controller.py | 28 ++++++++++ build/lib/controller/window.py | 29 ++++++++++ build/lib/main.py | 44 +++++++++++++++ build/lib/projection/__init__.py | 0 build/lib/projection/screen.py | 50 ++++++++++++++++++ node_2d.tscn | 4 ++ src/starsky.egg-info/PKG-INFO | 8 +++ src/starsky.egg-info/SOURCES.txt | 14 +++++ src/starsky.egg-info/dependency_links.txt | 1 + src/starsky.egg-info/entry_points.txt | 2 + src/starsky.egg-info/requires.txt | 2 + src/starsky.egg-info/top_level.txt | 3 ++ .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 362 bytes .../__pycache__/entry.cpython-313.pyc | Bin 0 -> 4409 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 178 bytes .../__pycache__/controller.cpython-313.pyc | Bin 0 -> 1928 bytes .../__pycache__/window.cpython-313.pyc | Bin 0 -> 2388 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 178 bytes .../__pycache__/screen.cpython-313.pyc | Bin 0 -> 8897 bytes 22 files changed, 198 insertions(+), 8 deletions(-) delete mode 100644 .idea/.idea.StarSkyPresenter/.idea/.name create mode 100644 build/lib/controller/__init__.py create mode 100644 build/lib/controller/controller.py create mode 100644 build/lib/controller/window.py create mode 100644 build/lib/main.py create mode 100644 build/lib/projection/__init__.py create mode 100644 build/lib/projection/screen.py create mode 100644 src/starsky.egg-info/PKG-INFO create mode 100644 src/starsky.egg-info/SOURCES.txt create mode 100644 src/starsky.egg-info/dependency_links.txt create mode 100644 src/starsky.egg-info/entry_points.txt create mode 100644 src/starsky.egg-info/requires.txt create mode 100644 src/starsky.egg-info/top_level.txt create mode 100644 src/starsky_presenter/__pycache__/__init__.cpython-313.pyc create mode 100644 src/starsky_presenter/__pycache__/entry.cpython-313.pyc create mode 100644 src/starsky_presenter/controller/__pycache__/__init__.cpython-313.pyc create mode 100644 src/starsky_presenter/controller/__pycache__/controller.cpython-313.pyc create mode 100644 src/starsky_presenter/controller/__pycache__/window.cpython-313.pyc create mode 100644 src/starsky_presenter/projection/__pycache__/__init__.cpython-313.pyc create mode 100644 src/starsky_presenter/projection/__pycache__/screen.cpython-313.pyc diff --git a/.idea/.idea.StarSkyPresenter/.idea/.name b/.idea/.idea.StarSkyPresenter/.idea/.name deleted file mode 100644 index e398f13..0000000 --- a/.idea/.idea.StarSkyPresenter/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -StarSkyPresenter \ No newline at end of file diff --git a/MainScript.cs b/MainScript.cs index 5fb7458..c4c31a1 100644 --- a/MainScript.cs +++ b/MainScript.cs @@ -15,7 +15,7 @@ public partial class MainScript : Node2D private Dictionary _stars = new Dictionary(); private List _scenes = new List(); - private Sprite2D _background = null; + private TextureRect _background = null; // Called when the node enters the scene tree for the first time. public override void _Ready() @@ -80,13 +80,19 @@ public partial class MainScript : Node2D this._stars.Clear(); Image bgImage = Image.LoadFromFile("resources/" + obj_conf.background); + GD.Print("bgImage: " + bgImage); + GD.Print("Resource Path: " + "resources/" + obj_conf.background); ImageTexture bgTexture = ImageTexture.CreateFromImage(bgImage); - this._background = new Sprite2D(); - this._background.SetTexture(bgTexture); - projection.AddChild(this._background); - this._background.Position = Vector2.Zero; - this._background.Scale = new Vector2(1, 1) * 100; - this._background.ZIndex = 5; + TextureRect background = this.GetNode("/root/Main/Projection/Background"); + //this._background = new TextureRect(); + background.SetTexture(bgTexture); + background.Position = Vector2.Zero; + background.Size = projection.GetSize(); + background.Visible = true; + //background.ZIndex = 5; + //this.GetNode("/root/Main/Projection").AddChild(this._background); + + foreach (StarConfig star_config in obj_conf.stars) { diff --git a/build/lib/controller/__init__.py b/build/lib/controller/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/build/lib/controller/controller.py b/build/lib/controller/controller.py new file mode 100644 index 0000000..868e497 --- /dev/null +++ b/build/lib/controller/controller.py @@ -0,0 +1,28 @@ +from PyQt6.QtCore import QObject, pyqtSlot + +from time import time + + +class Controller(QObject): + def __init__(self, window, parent=None): + super().__init__(parent) + self.window = window + self.last_close_press = 0 + self.successful_clicks = 0 + + @pyqtSlot() + def close_application(self): + now = time() + if now - self.last_close_press < 0.2: + self.successful_clicks += 1 + else: + self.successful_clicks = 0 + + if self.successful_clicks > 1: + self.window.running = False + + self.last_close_press = now + + @pyqtSlot(int) + def select_scene(self, scene: int): + self.window.selected_scene = scene \ No newline at end of file diff --git a/build/lib/controller/window.py b/build/lib/controller/window.py new file mode 100644 index 0000000..0e5fae1 --- /dev/null +++ b/build/lib/controller/window.py @@ -0,0 +1,29 @@ +from PyQt6.QtGui import QGuiApplication +from PyQt6.QtQml import QQmlApplicationEngine + +from src.controller.controller import Controller +from src.projection.screen import Screen + + +class ControlWindow: + def __init__(self): + self.app = QGuiApplication([]) + self.running = True + + self.engine = QQmlApplicationEngine(self.app) + self.controller = Controller(self) + self.engine.quit.connect(self.app.quit) + self.engine.rootContext().setContextProperty("controller_backend", self.controller) + self.engine.load("resources/main_window.qml") + + + def process_events(self): + return self.app.processEvents() + + def is_running(self): + return self.running + + def close(self): + self.app.quit() + self.app.exit(0) + self.app.processEvents() \ No newline at end of file diff --git a/build/lib/main.py b/build/lib/main.py new file mode 100644 index 0000000..02da1b5 --- /dev/null +++ b/build/lib/main.py @@ -0,0 +1,44 @@ +import sys + +import json +from random import random, seed + +from pygame.transform import scale +import pygame + +from src.controller.window import ControlWindow +from src.projection.screen import Screen, Star + + +def cli_main(): + seed(43) + image = pygame.image.load('resources/star.png') + + stars = [ + Star(**{ + "_id": i, + "x": random(), + "y": random(), + "alpha": random() * 360, + "rot": random() * 360, + "scale": random() * 0.5 + 0.25, + "offset": random(), + "image": image + }) + for i in range(4) + ] + + control_window = ControlWindow() + screen = Screen(stars) + + while control_window.is_running(): + control_window.process_events() + screen.update() + + screen.close() + control_window.close() + + + +if __name__ == "__main__": + cli_main() \ No newline at end of file diff --git a/build/lib/projection/__init__.py b/build/lib/projection/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/build/lib/projection/screen.py b/build/lib/projection/screen.py new file mode 100644 index 0000000..17000c8 --- /dev/null +++ b/build/lib/projection/screen.py @@ -0,0 +1,50 @@ +import pygame +from pygame import transform, gfxdraw, Vector2 +from math import sin, cos, pi + +from time import time, sleep +from random import random + +class Star: + def __init__(self, _id: int, x: int, y: int, alpha: float, rot: float, scale: float, offset: float, image: pygame.Surface): + self.id = _id + self.x = x + self.y = y + self.rot = rot + self.alpha = alpha + self.scale = scale + self.offset = offset + self.image = image + +class Screen: + def __init__(self, stars: list[Star]) -> None: + if not pygame.get_init(): + pygame.init() + self.screen = pygame.display.set_mode((1920, 1080)) + self.clock = pygame.time.Clock() + self.stars = stars + self.last = time() + self.brightness = 1.0 + + + def update(self): + self.screen.fill((0, 0, 0)) + now = time() + delta = now - self.last + self.last = now + for star in self.stars: + star.alpha += star.rot * delta + scaled = transform.rotozoom(star.image, star.alpha, star.scale) + (w, h) = scaled.get_size() + pos = (star.x*self.screen.get_width() - w/2, star.y*self.screen.get_height() - h/2) + self.screen.blit(scaled, pos) + + overlay = pygame.surface.Surface((1920, 1080), depth=32) + overlay.set_alpha(int(255 * (1 - self.brightness))) + self.screen.blit(overlay, (0, 0)) + + pygame.display.flip() + self.clock.tick(60) + + def close(self): + pygame.quit() \ No newline at end of file diff --git a/node_2d.tscn b/node_2d.tscn index 0d89216..4bf3177 100644 --- a/node_2d.tscn +++ b/node_2d.tscn @@ -63,3 +63,7 @@ oversampling_override = 1.0 position = Vector2i(0, 36) size = Vector2i(1920, 1080) script = ExtResource("2_0e48y") + +[node name="Background" type="TextureRect" parent="Projection"] +offset_right = 40.0 +offset_bottom = 40.0 diff --git a/src/starsky.egg-info/PKG-INFO b/src/starsky.egg-info/PKG-INFO new file mode 100644 index 0000000..04cb42e --- /dev/null +++ b/src/starsky.egg-info/PKG-INFO @@ -0,0 +1,8 @@ +Metadata-Version: 2.4 +Name: starsky +Version: 0.1.3 +Summary: Add your description here +Requires-Python: >=3.13 +Description-Content-Type: text/markdown +Requires-Dist: pygame>=2.6.1 +Requires-Dist: pyqt6>=6.10.0 diff --git a/src/starsky.egg-info/SOURCES.txt b/src/starsky.egg-info/SOURCES.txt new file mode 100644 index 0000000..3f08daf --- /dev/null +++ b/src/starsky.egg-info/SOURCES.txt @@ -0,0 +1,14 @@ +README.md +pyproject.toml +src/main.py +src/controller/__init__.py +src/controller/controller.py +src/controller/window.py +src/projection/__init__.py +src/projection/screen.py +src/starsky.egg-info/PKG-INFO +src/starsky.egg-info/SOURCES.txt +src/starsky.egg-info/dependency_links.txt +src/starsky.egg-info/entry_points.txt +src/starsky.egg-info/requires.txt +src/starsky.egg-info/top_level.txt \ No newline at end of file diff --git a/src/starsky.egg-info/dependency_links.txt b/src/starsky.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/starsky.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/src/starsky.egg-info/entry_points.txt b/src/starsky.egg-info/entry_points.txt new file mode 100644 index 0000000..a082b56 --- /dev/null +++ b/src/starsky.egg-info/entry_points.txt @@ -0,0 +1,2 @@ +[console_scripts] +starsky = main:cli_main diff --git a/src/starsky.egg-info/requires.txt b/src/starsky.egg-info/requires.txt new file mode 100644 index 0000000..734f1d8 --- /dev/null +++ b/src/starsky.egg-info/requires.txt @@ -0,0 +1,2 @@ +pygame>=2.6.1 +pyqt6>=6.10.0 diff --git a/src/starsky.egg-info/top_level.txt b/src/starsky.egg-info/top_level.txt new file mode 100644 index 0000000..13c4daf --- /dev/null +++ b/src/starsky.egg-info/top_level.txt @@ -0,0 +1,3 @@ +controller +main +projection diff --git a/src/starsky_presenter/__pycache__/__init__.cpython-313.pyc b/src/starsky_presenter/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..234f0920db53a589c365491a42a53a5f53cfb172 GIT binary patch literal 362 zcmZWkJx{|h5VaFi0&2ww>Qu%^sGhnZCd5#rsK_IORRyb^~QDvZo+**bY^ zT-H>zRLvSx)~&!eQ#J;qgH$>cUDoOPPu1F%w$XZCcV5tY-~=Nn-5n#mvUf3lTLSSo z@FOry3uO|A{`_Co9Pfb+1X}kYFd{}LAwuxcbx}RFxw(Ncw)8VMLHG_i=O66qM{s_& GxBmi@_fV1m literal 0 HcmV?d00001 diff --git a/src/starsky_presenter/__pycache__/entry.cpython-313.pyc b/src/starsky_presenter/__pycache__/entry.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ce61e637c8fa85b838133a159c4f033eb7efb3f GIT binary patch literal 4409 zcmbVPU2Gdw7QXXi#~yq9n;$1lsFO5=(B`L2ngZ>XLPFAxX$zjZN$OC`wa2Mbd+gqE zXcIs(t0G)jsX>4U(msUMJ`}-2dE>DHR*P1Pka3*rL;>fK}iyr_<(uO|WCTPS*u^fycZ~QvnBdfDTK* zDLAoHaAB9uw+7sT2YYmy3wVWkTwj%Mzzra83p5H%xJl>P13sY{Hw!Je1?K$p4$%QW z=k$&tv*>C;vn*~E-7N^WO+O-fo|;4`YC&katpn|^KGlzAs2QrqdzZ{l^w63$la=I1 zPP&}aY&v-^DM#^q52bNq$&?h7qHzhstX|B_;h2O@% zcOG`Ixnx>`6U;a&$1`b-RU|16d`n!Cvaw8-oMBR8(Ub%PKa!DiIFp)4g6t)-ON?Pj zk~LP$MX^T5_rh-<=#p}CSdP)v=a7M^{x%N-@jePugh^Tm?XS`@9ioFo?tvDf3<*C9 z(YsI&1t!6EkkZU^*?2T3^)T2CQ|uu;CNq~)h#J4&uZ{Gd&!naPR8pQ(`bQ<@LN1f- zCzlm3%)fvoMUrz8?pJWEUje3aVLp)sSz7Yg{wi8Y%eFKogxijmG}E+ELgHf0k+XI*FA+szku@|J zqm2GfO(sKwG0IffYaAz<#X958UUZs1%_vMiQfMzadJQ4sB4J{Ey=}S9Q}E@ZVT8g> zwKYn#5aWRkMxh5P8lFTbGbmaKf08EsV^#6!PH;qK`^rIBiPmq|I5`l~_ZV_yzj4!( zT)4Ta3iKH7iqOYFjSczXbeR#k%9$cZb`DUrz3rig-4(upao1na4K_1$zd#>V7h8ja#%;F7Z7=5j`}#Hyg4aISwkN~z z0b^CHc_XAqh^k6tB_5<0nUU!l*PK8-jVJDs52-l;-Sre1N$I(9f$KLo%0hjO>{nuv zEGd2S>C{5Q7B_QlR*L0xHYT`w*GhDn^wgm-N;0l-Imn|*GMCIiQiRkL#RS=6RksEb zA>zS=x%oTj4%1N4P$8&cj1T}Y1b(FjtKeBK*|EfZ*_WI8${VE|0@F)V84?EFkL zE#Y0j&{$$sjn_*QV-F^Iug8qri2$eXj%1#oKR?C;oDUG1u?efiPVj$yT9_{Ku1am13cMYleFl&BounhlAL|axC6x%C zljWp5qdBrTLku60UWW4&+yGLVDT|YExG9#(D3ZoroJ+z@q|3=%k4H0CLPe{q28Tu^ zp#(cOt8w~5L=OT2jreiWk+gvc5|WL2?dXVAipt0(y{go#si=~Rkg`;>>9&i+z>qnO z13OiVFfah|6J3UpGnX)lZM+9Mg_MBAVYas;M=H)^G5iDvK#C+s+0;y(|?>Qil>Vc)2jGVF*>70XG`MjZ+9=pZnS^=LO+%uW1T-lC}QYWdeFWnlSDEX(LzsW31 zA3gr*`5Ve7>02EK)$s|{KefS|t!Jp89PpO18=0IxA$VH35j8dEPnPXU#14wf1Y?#c`674G+(Zc+@tCvPsOgDkVTvc46zWu4{T4E#E9<@g{^GzhNa%2Vd7u#{U-3Sn+x}Ho9ngQ^-NHWh zPaPc41Y-zvMj|~sA%)E=8at~%^71Cr*$mF5lIQviAXhM{yD$r#=H9+cpj*+gYx}lz zGuMXFiBEc9RYvPt3#X)K$zrz4CM;aQBY&a|IP}AxhmPEPfx3f3{GRH zRFIBmS|j&BkFBl^{M=unwuDCgp68Nsj=*N5fYJu=(io~G>OF&eSpExFoSCIJ+{SD782>uOzidzqlw_zZfW3oLw1T02fWp&nqd)&&dHQ sh>y?A%PfhH*DI*J#bJ}1pHiBWYFESxv;pLTVi4maGb1Bo5i^hl0DdAaaR2}S literal 0 HcmV?d00001 diff --git a/src/starsky_presenter/controller/__pycache__/controller.cpython-313.pyc b/src/starsky_presenter/controller/__pycache__/controller.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9bc2b707a1db2161c18b000a473fa8b109b1aa7d GIT binary patch literal 1928 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 literal 0 HcmV?d00001 diff --git a/src/starsky_presenter/projection/__pycache__/screen.cpython-313.pyc b/src/starsky_presenter/projection/__pycache__/screen.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb4da68c38dc3fe3580cbb9907136db806b356e9 GIT binary patch literal 8897 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