Text im Graphikmodus bei B+

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

bmurray

Betreff: Text im Graphikmodus bei B+

BeitragSa, Nov 17, 2012 19:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

nachdem ich nun stundenlang rumprobiert habe, weiß ich nicht mehr weiter, und hoffe, dass mir hier jemand helfen kann Very Happy

Ich möchte einen Fußball-Manager programmieren, komme aber jetzt zum ersten Mal nicht mehr wirklich weiter. Es geht einfach nur um die Anzeige von Ereignissen während des Spiels. Dabei nutze ich die Repeat/Forever-Schleife um die Ereignisse zeitlich zu sortieren. Das Problem ist, dass durch den Delay-Befehl zwar die Minutenanzeige korrekt funktioniert, während die Anzeige einer Chance (siehe im Code mein Beispiel) nur für Sekundenbruchteile zu sehen ist, und zwar kurz nach dem das Spiel für eine Sekunde (delay(1000)) angehalten wurde. Der Text ist also nicht für die volle Sekunde zu sehen, sondern blinkt nur kurz auf. Ich habe es schon mit einer For/Next-Schleife probiert, oder mit einem Timer, aber dann friert das Spiel ein.

Vielleicht kann mir jemand weiterhelfen, für Ratschläge wäre ich sehr dankbar!


Code: [AUSKLAPPEN]
      Repeat
         DrawBlock anstossh,0,0 ;Das Hintergrundbild
         If start$="nein" Then DrawImage maus,MouseX(),MouseY(); Die Maus wird nur gezeichnet, wenn das Spiel noch nicht angepfiffen wurde
         

            font=LoadFont("Arial",50,False,False,False) ; Spielstand
            SetFont font
            Color 255,255,255
               Text 490,79, th+":"+ta
         
                        
         If start$="ja" Then ;Beginn des Ablaufs, nachdem der Spieler die rechte Maustaste gedrückt hat
      
            font=LoadFont("Courier",20,False,False,False)
            SetFont font
            i=i+1
            Text 460,135,i+". Minute" ; Dieser Text läuft wie geplant
                  
               If i =13 Then ; Dies ist nur ein Beispiel, die Spielroutine kommt noch rein
                  Text 360,160,"Chance für Freiburg"  ; Dieser Text blinkt nur kurz auf, anstatt die volle Sekunde dazustehen
                  Delay (1000)
               EndIf
   
            Delay(200) ;Die normale Verzögerung für den Minutenzähler
            
         EndIf
      
         If i=90 Then WaitMouse : Gosub mainloop ; Bei Spielende geht's mit einem Klick ins Hauptmenü
         If GetMouse()=2 Then start$="ja" ; Abfrage für rechte Maustaste
         Flip
      Forever

ZEVS

BeitragSa, Nov 17, 2012 19:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Delay-Befehl ist hier ungeeignet (benutze lieber MilliSecs). Dergleichen wird unter https://www.blitzforum.de/foru...hp?t=34436 gut erklärt.

Außerdem:
Benutze bitte niemals GoSub.
Benutze Timer.
Die Variable start könne man wesentlich schneller als Int verwenden, da das Vergleichen von Strings eher langsam ist.
ZEVS

count-doku

BeitragSa, Nov 17, 2012 19:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Als Lösung nur für diesen Beispielcode würde es auch reichen zwischen dem Text und Delay befehl noch ein Flip einzufügen.

Grundsätzlich hat ZEVS aber natürlich recht, Delay ist immer problematisch, da das Programm angehalten wird.
Für eine Geschwindigkeitsbegrenzung nutze CreateTimer und WaitTimer,
für Ereignisse die in bestimmten Abständen/für bestimmte Zeiten auftreten: MilliSecs

Oh und man sollte den Font nicht jeden Schleifendurchlauf neu laden Zieht ziemlich viel Resourcen.
Lieber vor der Schleife laden und dann nachher nurnoch SetFont

lg,
Count-Doku

bmurray

BeitragSa, Nov 17, 2012 20:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, ich habe schon gelesen, dass man Delay und gosub meiden soll. Gosub war hier nur die "Notlösung", die ich noch ausbessern möchte. Delay ist auch eine sehr unelegante Lösung, das stimmt, nur hat bei all meinen Versuchen delay als einziger befehl bisher so geklappt, wie ich das möchte. Mit Timer und Millisecs kriege ich noch nicht diesen "Fließeffekt" hin, also dass die Minuten langsam runterlaufen; die Minutenanzeige rauscht einfach runter. Ich werde den Code ausbessern, ich krieg das bestimmt noch hin, muss mich einfach noch ein bisschen reinlesen. Danke für eure Anregungen!!

count-doku

BeitragSa, Nov 17, 2012 20:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe mal einen kleinen Beispielcode mit der Grundlage deines Codes geschrieben.

Er sollte MilliSecs und Timer veranschaulichen, hoffe er hilft.

BlitzBasic: [AUSKLAPPEN]
Graphics 800,600,0,2
SetBuffer BackBuffer()

Local fontArial=LoadFont("Arial",50,False,False,False) ; Fonts vor der Schleife laden
Local fontCourier=LoadFont("Courier",20,False,False,False)

Local start$="nein"


Local timer=CreateTimer(30) ; Timer erstellen mit 30Hertz bzw. ticks pro Sekunde

Local lastMinute=MilliSecs() ; Millisekunden beim letzten minuten erhöhen
Local virtMinute=200 ; Dauer einer "virtuellen" Minute in Millisekunden
Repeat

If start$="nein" Then Rect MouseX(),MouseY(),10,10; Die Maus wird nur gezeichnet, wenn das Spiel noch nicht angepfiffen wurde

SetFont fontArial
Color 255,255,255
Text 490,79, th+":"+ta


If start$="ja" Then ;Beginn des Ablaufs, nachdem der Spieler die rechte Maustaste gedrückt hat

SetFont fontCourier

Text 460,135,i+". Minute" ; Dieser Text läuft wie geplant

If i =13 Then ; Dies ist nur ein Beispiel, die Spielroutine kommt noch rein
Text 360,160,"Chance für Freiburg" ;
Flip ; Text auch anzeigen!
Delay (1000) ; 1sek warten
EndIf

If MilliSecs()-lastMinute>virtMinute ; Wenn die aktuellen Millisekunden - letzteMs > Zeit der virtuellen minute. Dann ist eine vergangen
i=i+1
lastMinute=MilliSecs() ; LetzteMs wieder anpassen
End If

EndIf

If i=90 Then WaitMouse ; Bei Spielende geht's mit einem Klick ins Hauptmenü
If GetMouse()=2 Then start$="ja" ; Abfrage für rechte Maustaste

WaitTimer timer ; Auf den Timer warten
Flip 0 ; Flippen
Cls ; Bild auch wieder löschen sonst schreibts den text so hässlich übereinander
Forever


guten Abend noch,
Count-Doku

Midimaster

BeitragSa, Nov 17, 2012 20:13
Antworten mit Zitat
Benutzer-Profile anzeigen
genau hierzu gibt es ein tutorial von mir:

Timer, Millisecs() und zeitliche Abläufe für Anfänger

https://www.blitzforum.de/foru...hp?t=34436


Das System ist immer das gleiche: Du speicherst die aktuelle Zeit Millisecs() in eine Variable, zählst dann was dazu und wartest nun, bis diese Variable wieder kleiner als Millisecs() geworden ist:

Code: [AUSKLAPPEN]
Global MyTime%=Millisecs()+2*1000 ; 2 sekunden, dann wird der text sichtbar
Global OnOffFlag%=0

Repeat
     Cls
     If MyTime<Millisecs()
          MyTime =Millisecs()+ 10*1000; 10sec bis er wieder verschwindet
          OnOffFlag=OnOffFlag+1
     Endif
     If OnOffFlag=1         
               ; Display something
     Endif
     Flip 1
Until KeyHit(1)

In diesem Moment setzt du eine Flag auf 1, dass dann woanders dafür sorgt, dass etwas zu sehen ist.

Willst Du, dass dieser Text dann wieder irgendwann verschwindet, addierst Du einfach wieder was zu der Variable,die dann das Flag auf 2 schaltet
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

bmurray

BeitragSa, Nov 17, 2012 20:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab's jetzt mit millisecs hinbekommen, super!! @Midimaster. Ja, ich habe dein Tutorial gelesen, hab's aber trotzdem nicht richtig hingekriegt, hab aber jetzt meinen Fehler gefunden. Danke schön!! @Count-Doku: Danke, ich schau mir das gleich mal an!!

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group