Regentropfen auf dem Desktop

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Regentropfen auf dem Desktop

Beitrag von STARGÅTE »

Tachchen,

hat jemand Interesse an Regentropfen,
dann soll er sich die (Link veraltet) saugen.

Einfach die EXE starten (am besten
auf dem Desktop) und kurz warten.
Beenden mit jeder Taste.
Danach müsste man nur kurz den Desktop "trocknen",
weil er danach "durchnässt" ist.

Ich kann die Teile leider (zur Zeit) für nix gebrauchen,
aber vllt hat ein von euch eine Idee,
für was man sie Brauchen kann.

Code: Alles auswählen

InitKeyboard()

Global DesktopOutput_Memory.l 
DesktopOutput_Memory = AllocateMemory(1024, 1024)
Procedure.l DesktopOutput() 
 PokeL(DesktopOutput_Memory, 1)
 ProcedureReturn DesktopOutput_Memory
EndProcedure 

Procedure DesktopX()
 ProcedureReturn GetSystemMetrics_(0)
EndProcedure
Procedure DesktopY()
 ProcedureReturn GetSystemMetrics_(1)
EndProcedure

#b = 0.01745329
xP = DesktopX()
yP = DesktopY()

Dim Punkt(xP, yP)

Procedure DisplayTropfen(x,y,r)
 rr = r*r
 Ar.f = 1/rr 
 For yy = -r To r
  sr = Sqr(rr-yy*yy)
  For xx = -sr To sr
   d = xx*xx+yy*yy
   Px = Int(x+xx*d*Ar)
   Py = Int(y+yy*d*Ar)
   Plot(xx+x,yy+y,Punkt(Px,Py))
  Next xx
 Next yy
EndProcedure

Procedure Desktop()
 xx = DesktopX() : yy = DesktopY()
 For y = 0 To yy
  For x = 0 To xx
   Punkt(x,y) = Point(x,y)
  Next x
 Next y
EndProcedure

Structure T
 x.l
 y.l
 r.l
EndStructure
NewList T.T()
Procedure NeuerTropfen()
 AddElement(T())
 T()\x = Random(DesktopX()-100)+50
 T()\y = Random(DesktopY()/2)+50
 T()\r = Random(25)+15
EndProcedure

For n = 1 To 10 : NeuerTropfen() : Next n

StartDrawing(DesktopOutput())
 Desktop()
 Repeat
  ExamineKeyboard() : If KeyboardPushed(#PB_Key_All) : End : EndIf
  ResetList(T())
  While NextElement(T())
   T()\y + 3
   DisplayTropfen(T()\x,T()\y,T()\r)
   If T()\y-T()\r > yP
    DeleteElement(T())
    NeuerTropfen()
   EndIf
  Wend
 ForEver
StopDrawing()
Zuletzt geändert von STARGÅTE am 27.08.2010 01:03, insgesamt 2-mal geändert.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Kevin
Beiträge: 236
Registriert: 11.06.2007 12:55

Beitrag von Kevin »

cool das script :allright:
mach doch ein bildschirmschoner draus
das hab ich gemacht :)
Benutzeravatar
dige
Beiträge: 1241
Registriert: 08.09.2004 08:53

Beitrag von dige »

@Stargate: uiii, gar nicht mal so schlecht :allright:

Ich habe den Code bischen aufgeräumt und nach PB4 portiert:

Code: Alles auswählen

Structure T
  x.l
  y.l
  r.l
EndStructure

Global xP.l, yP.l, DesktopOutput_Memory.l
Global NewList T.T()

Procedure.l DesktopOutput()
  PokeL(DesktopOutput_Memory, 1)
  ProcedureReturn DesktopOutput_Memory
EndProcedure
Procedure DesktopX()
  ProcedureReturn GetSystemMetrics_(0)
EndProcedure
Procedure DesktopY()
  ProcedureReturn GetSystemMetrics_(1)
EndProcedure

DesktopOutput_Memory = AllocateMemory(1024)

#b = 0.01745329
xP = DesktopX()
yP = DesktopY()

Global Dim Punkt(xP, yP)

Procedure DisplayTropfen(x,y,r)
  rr = r*r
  Ar.f = 1/rr
  For yy = -r To r
    sr = Sqr(rr-yy*yy)
    For xx = -sr To sr
      d = xx*xx+yy*yy
      pX = Int(x+xx*d*Ar)
      pY = Int(y+yy*d*Ar)
      Plot(xx+x,yy+y,Punkt(pX,pY))
    Next xx
  Next yy
EndProcedure

Procedure Desktop()
  xx = DesktopX() : yy = DesktopY()
  For y = 0 To yy
    For x = 0 To xx
      Punkt(x,y) = Point(x,y)
    Next x
  Next y
EndProcedure

Procedure NeuerTropfen()
  AddElement(T())
  T()\x = Random(DesktopX()-100)+50
  T()\y = Random(DesktopY()/2)+50
  T()\r = Random(25)+15
EndProcedure

For n = 1 To 10 : NeuerTropfen() : Next n

If StartDrawing(DesktopOutput())
  Desktop()
  
  Repeat
    If GetAsyncKeyState_ (#VK_ESCAPE) : Break : EndIf
    ResetList(T())
    While NextElement(T())
      T()\y + 3
      DisplayTropfen(T()\x,T()\y,T()\r)
      If T()\y-T()\r > yP
        DeleteElement(T())
        NeuerTropfen()
      EndIf
    Wend
  ForEver
  StopDrawing() 
EndIf
End
Ist allerdings noch ein Bug drin. Plot zeichnet wohl über den Bildschirm-
rand hinaus ....
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

jo, naja, was unter dem Bildschirmrand passiert war mir eigentlich egal :D

aber wenn der Tropfen drunter läutf, dann kommts indirekt zum BUG, weil er ja ein Farbwert lesen will den es garnicht gibt :D

PS: danke für's Übersetzen
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
D@nte
Beiträge: 324
Registriert: 24.04.2007 15:33
Wohnort: Berlin

Beitrag von D@nte »

@Stargåte
Für die exe sollteste ggf noch sowas wie

Code: Alles auswählen

Sleep_(5000)
InvalidateRect_(#False,#False,#False)
(mir fallen grad die äquivalenten PB-Befehle ein) einfügen um den Screen auch wieder aufzuräumen damit man nicht "trocken wischen" muss

Zur Verwendung:
Kannst es ja an M$ mailen die VISTA User scheinen ja auf so Effektchen zu stehen :twisted:
Benutzeravatar
HeX0R
Beiträge: 3054
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

D@nte hat geschrieben: [...]
(mir fallen grad die äquivalenten PB-Befehle ein)
[...]
Wenn sie dir einfallen, wieso verwendest du sie dann nicht ? :lol:
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

D@nte hat geschrieben:Zur Verwendung:
Kannst es ja an M$ mailen die VISTA User scheinen ja auf so Effektchen zu stehen :twisted:
...das Programm funktioniert aber unter Vista so garnicht :D
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
Knight_Rider_2000
Beiträge: 145
Registriert: 05.02.2007 20:46
Kontaktdaten:

Beitrag von Knight_Rider_2000 »

@dige
Dein Code hat noch den fehler das du plot benutzt und deswegen wenn ein tropfen aus den bildschirm kommt der compiler meckert. Könntest du den fehler vielleicht mit einer If Endif abfrage verbessern?
PB 4.20,Blitz3D 1.98,Microsoft Visual Studio 2005 Professional, Microsoft Visual Studio 2008 Professional
Antworten