first push

This commit is contained in:
2024-12-11 18:31:41 +01:00
parent ed89f20720
commit 7a80477890
15 changed files with 406 additions and 0 deletions

57
experiments/window_gtk.py Normal file
View File

@@ -0,0 +1,57 @@
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk, GdkPixbuf, cairo
class VPetWindow(Gtk.Window):
def __init__(self):
super().__init__()
# Fensterkonfiguration
self.set_title("vPet")
self.set_default_size(48, 48)
self.set_app_paintable(True)
self.set_decorated(False)
self.set_keep_above(True)
self.set_accept_focus(False)
# Entferne den Fensterschatten und wende RGBA-Visual an
screen = self.get_screen()
visual = screen.get_rgba_visual()
if visual:
self.set_visual(visual)
# Mausereignisse ignorieren
self.connect("screen-changed", self.on_screen_changed)
self.set_app_paintable(True)
self.on_screen_changed(None)
# Lade und zeige das Sprite (virtuelles Haustier)
self.image = Gtk.Image()
pixbuf = GdkPixbuf.Pixbuf.new_from_file("vpet_sprite.png") # Ersetze mit deinem Sprite
self.image.set_from_pixbuf(pixbuf)
self.add(self.image)
self.show_all()
def on_screen_changed(self, screen):
gdk_window = self.get_window()
if gdk_window:
# Eingabeform auf das Sprite beschränken
region = Gdk.cairo_region_create_from_surface(self.get_mask())
gdk_window.input_shape_combine_region(region)
def get_mask(self):
# Maske für die Eingabe basierend auf der Sprite-Form erstellen
pixbuf = self.image.get_pixbuf()
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, pixbuf.get_width(), pixbuf.get_height())
cr = cairo.Context(surface)
Gdk.cairo_set_source_pixbuf(cr, pixbuf, 0, 0)
cr.paint()
return surface
if __name__ == "__main__":
win = VPetWindow()
win.connect("destroy", Gtk.main_quit)
Gtk.main()

View File

@@ -0,0 +1,90 @@
import pygame
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import sys
import os
# Pet Attribute
class VirtualPet:
def __init__(self):
self.happiness = 50
self.hunger = 50
def feed(self):
self.hunger -= 10
self.happiness += 5
def pet(self):
self.happiness += 10
def update(self):
self.hunger += 0.1
self.happiness -= 0.05
# OpenGL-Setup
def init_opengl():
glEnable(GL_BLEND) # Aktiviert Transparenz
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
glEnable(GL_DEPTH_TEST)
glClearColor(0.2, 0.6, 0.8, 0.0) # Himmelblau mit Transparenz (Alpha = 0.5)
gluPerspective(45, (800 / 600), 0.1, 50.0)
# Pet zeichnen (Würfel als Platzhalter)
def draw_pet():
glPushMatrix()
glColor4f(0, 0, 0, 0.2)
glTranslatef(0.0, 0.0, -5)
glRotatef(pygame.time.get_ticks() * 0.05, 0, 1, 0) # Rotation
glutWireCube(1) # Zeichnet den Würfel
glPopMatrix()
# Hauptprogramm
def main():
# Setze Umgebungsvariablen für transparentes Fenster
os.environ['SDL_VIDEODRIVER'] = 'x11'
os.environ['SDL_VIDEO_WINDOW_POS'] = '0,0'
os.environ['SDL_VIDEO_CENTERED'] = '1'
pygame.init()
display = pygame.display.set_mode((48, 48), pygame.DOUBLEBUF | pygame.OPENGL | pygame.NOFRAME | pygame.SRCALPHA)
pygame.display.set_caption("Transparent Virtual Pet")
clock = pygame.time.Clock()
display.set
pet = VirtualPet()
glutInit() # Initialisiert GLUT
init_opengl()
# Setze Transparenz für das Fenster
# pygame.display.set_mode((800, 600), pygame.OPENGL | pygame.DOUBLEBUF | pygame.NOFRAME | pygame.SRCALPHA)
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_f:
pet.feed()
elif event.key == pygame.K_p:
pet.pet()
pet.update()
# OpenGL Rendering
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
draw_pet()
pygame.display.flip()
clock.tick(60)
pygame.quit()
sys.exit()
if __name__ == "__main__":
main()