Hintergrundfarbe

Anfängerfragen zum Programmieren mit PureBasic.
Baba_Smurf
Beiträge: 55
Registriert: 01.03.2015 12:05
Wohnort: Saarland / Püttlingen
Kontaktdaten:

Hintergrundfarbe

Beitrag von Baba_Smurf »

Hallo,

ich möchte in einem Gadget die Hintergrundfarbe ändern, bekomme aber irgendwie den Code nicht so platziert, das es funktioniert.
wollte es so machen mit:

Code: Alles auswählen

If StartDrawing(SpriteOutput(0))
        Box(10,5 0,500, 500, RGB(255, 0, 155))
                StopDrawing()
hier soll er rein:

Code: Alles auswählen

Enumeration
  #FENSTER_HAUPT
EndEnumeration

UsePNGImageDecoder()            ;PNG Decoder initialisieren
UseJPEGImageDecoder()
UseJPEG2000ImageDecoder()

Global Ende.i = #False  ;ende
Global pos_x.i          ;zufallsgenerator x achse
Global pos_y.i          ;zufallsgenerator y achse
Global Winkel.i         ; zufallsgenerator rotation von sprites

; Sprite initialisieren

If InitSprite() = 0
    MessageRequester("Fehler", "Es konnte kein Fenster erstellt werden", 0)
    End
  EndIf
  
#FLAGS = #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget
If OpenWindow(#FENSTER_HAUPT, 0, 0, 1280, 720, "VISUAL TERRAZZO", #FLAGS)
  
  LoadFont(#FENSTER_HAUPT,"Arial", 14)        ;Schriftart & Größe initialisieren

    ;Spritefenster erstellen
  If OpenWindowedScreen(WindowID(0), 10, 50, 500, 500)
  
    Define a.i ;zählervariable für schleife
    Define SpriteHeight.i
    Define SpriteWidth.i
    For a.i = 0 To 300
      LoadSprite(0, "C:\VTerrazzo\1.png",#PB_Sprite_AlphaBlending)
     
    pos_y = Random(500)
    pos_x = Random(500)
    Winkel.i = Random(360)
    
    RotateSprite(0,winkel.i,#PB_Absolute)
    
    DisplayTransparentSprite(0, pos_x-SpriteHeight/2,pos_y-SpriteWidth/2)
       
   Next a.i
   FlipBuffers()
      EndIf
    Else
      MessageRequester("Fehler", "Es konnte kein Fenster erstellt werden", 0)
      End
    EndIf
     EndIf
    Repeat
     Global Ereignis.i
     Ereignis.i = WaitWindowEvent()
     
     ForEver
mfg
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Hintergrundfarbe

Beitrag von Bisonte »

Kannst Du dir vorstellen, dass die geneigten Helfer nicht über die Bilder verfügen, die du dort benutzt ?

Aber davon abgesehen, ohne den Code zu starten :

Das erste was mir spontan auffällt, Variablendefinitionen gehören eigentlich an den Anfang eines Programms,
und nicht überall verteilt.

Innerhalb der Eventschleife des Fensters (Zwischen Repeat und Forever) machst Du .... nichts.
Dort solltest du den Hintergrund, die Sprites und alles weitere neuzeichnen lassen, mit einem abschliessenden
FlipBuffers(), damit die Änderungen auch zu sehen sind.

Ausserdem hält dein Programm an der Stelle an.... solange bis ein Window Event anliegt.
An dieser Stelle ist ein WaitWindowEvent() fehl am Platz, besser eignet sich ein WindowEvent, oder ein
WaitWindowEvent mit Timeout, von 1ms oder so....

z.B. so eine Schleife :

Code: Alles auswählen

Repeat
  
  Ereignis = WaitWindowEvent(1) ; 1 ms warten auf Ereignis, wenn nix dann weiter...
  
  DisplayTransparentSprite(0, x, y, Intensity, Color) ; < ist der Parameter Color vielleicht die Antwort ?
  
  If StartDrawing(ScreenOutput())
    ; z.B. Punktestand per DrawText() schreiben.
    StopDrawing()
  EndIf
  
  FlipBuffers()
  
  ; Jetzt noch die Windows Events abfragen
  
  If Ereignis = #PB_Event_CloseWindow
    Break ; Schleife verlassen
  EndIf
  
ForEver
Nun hab ich allerdings nicht wirklich die Frage verstanden :oops:
Weil ein Gadget sehe ich nirgends ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Hintergrundfarbe

Beitrag von STARGÅTE »

Der Code ist zimlich verwirrend:
  • #FENSTER_HAUPT wird nicht nur für ein Window genutzt sondern auch für LoadFont, warum?
  • OpenWindowedScreen(WindowID(0), ...
    verweißt auf das Fenster mit der Nummer 0, hier muss die Konstante #FENSTER_HAUPT hin, da es aktuell nur "zufällig" läuft, weil #FENSTER_HAUPT = 0 ist.
  • For a.i = 0 To 300 : LoadSprite(0, ...
    Warum lädst du 301 mal das gleiche Sprite, und dann noch immer mit der selben Nummer?
    Das Laden kann vor die Schleife
  • Damit dein "Hintergrund" dauerhaft angezeigt wird, muss der Screen regelmäßig aktualisiert werden (FlipBuffers()).
    Dazu müssen deine Sprite die ebenfalls immer wieder neu gezeichnet werden.
    Da du hier Random() nutzt, wäre RandomSeed() wichtig, damit der Zufall immer gleich ist.
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
Baba_Smurf
Beiträge: 55
Registriert: 01.03.2015 12:05
Wohnort: Saarland / Püttlingen
Kontaktdaten:

Re: Hintergrundfarbe

Beitrag von Baba_Smurf »

Hallo,

und erst einmal danke.

zu dem Code den habe ich jetzt nur per copy & paste aus meinem hauptcode rauskopiert.
das ich 301 mal das gleiche Bild lade ist im moment nur noch ein Versuch, ich tue es mir generell etwas schwer mit dem programmieren, in so fern steht für mich erst einmal das Ergebnis im VorderGrund.

Ziel wäre es gewesen den Hintergrund des screens per colorrequester einzufärben,und darauf dann die Sprites laden.
Zu dem Bild das geladen wird ist einfach ein kleiner Stein, es geht mir wie gesagt darum erst einmal mit Purebasic klar zukommen.


mfg Peter
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Hintergrundfarbe

Beitrag von STARGÅTE »

Den Screen kannst du mit ClearScreen(Farbe) einfärben.
Allerdings wie schon gesagt, nicht nur einmal, sondern in jedem Frame, in dem du auch FlipBuffers() ausführst.

Zwei Beispiele findest du in der Hilfe unter Screen.
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
Baba_Smurf
Beiträge: 55
Registriert: 01.03.2015 12:05
Wohnort: Saarland / Püttlingen
Kontaktdaten:

Re: Hintergrundfarbe

Beitrag von Baba_Smurf »

Hallo,

@STARGATE

super das hab ich gesucht, danke
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Hintergrundfarbe

Beitrag von edel »

@Bisonte

WindowEvent kann man sich sparen, diese Funktion ruft nur WaitwindowEvent mit 0 auf.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Hintergrundfarbe

Beitrag von STARGÅTE »

edel hat geschrieben:WindowEvent kann man sich sparen, diese Funktion ruft nur WaitwindowEvent mit 0 auf.
Kannst du das belegen?
Mir ist so, dass WaitwindowEvent(0) immer noch n Pause macht, wohin gegen WindowEvent wirklich garkeine macht.
Denn auch Delay(0) macht ja eine winzige Pause, die deutlich größer ist, als garkeine Pause ^^
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
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Hintergrundfarbe

Beitrag von ts-soft »

STARGÅTE hat geschrieben:Denn auch Delay(0) macht ja eine winzige Pause, die deutlich größer ist, als garkeine Pause ^^
https://msdn.microsoft.com/en-us/librar ... 85%29.aspx
Sleep hat geschrieben:Windows XP: A value of zero causes the thread to relinquish the remainder of its time slice to any other thread of equal priority that is ready to run. If there are no other threads of equal priority ready to run, the function returns immediately, and the thread continues execution. This behavior changed starting with Windows Server 2003.
Das sollte also nicht mehr der Fall sein, ausser jemand nutzt noch XP. Ansonsten hängt die Genauigkeit von Delay/Sleep von mehreren Faktoren ab, sollte aber um 20 - 30 ms liegen.
Ob nun eine Pause gemacht wird, kann ich nicht sagen, aber wenn sollte sie mind. 20 ms betragen, weil drunter geht schlecht.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Hintergrundfarbe

Beitrag von Danilo »

ts-soft hat geschrieben:Ob nun eine Pause gemacht wird, kann ich nicht sagen, aber wenn sollte sie mind. 20 ms betragen, weil drunter geht schlecht.
Wieso geht unter 20ms schlecht? (Das war mal bei Win95/98 so, ohne timeBeginPeriod_(ms) aufzurufen)

Code: Alles auswählen

For i = 0 To 100
    start_time = ElapsedMilliseconds()
    Delay(0) ; 0,1,2,3
    ms = ElapsedMilliseconds() - start_time
    Debug ms
Next
Auf neueren, NT-basierenden, Systemen ist eine Auflösung von +1 ms möglich.
Zuletzt geändert von Danilo am 18.03.2015 14:37, insgesamt 3-mal geändert.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Antworten