CLS an einer stelle aussetzen lassen

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Maxi17

Betreff: CLS an einer stelle aussetzen lassen

BeitragFr, März 07, 2008 16:33
Antworten mit Zitat
Benutzer-Profile anzeigen
hi, ich bin neu hier und kenne mich noch nicht so mit bb aus.
ich programmiere gerade etwas, wo ich jede sekunde das cls benötige.
nun habe ich aber einen bereich, der mehrere sekunden vom cls "verschont" werden sollte, sodass der text der da steht längere zeit lesbar ist.
ich hoffe ihr könnt mir helfen, danke schonmal

SpionAtom

BeitragFr, März 07, 2008 16:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Schreib doch nach dem CLS den Text einfach neu, das ist üblich.
Ansonsten könntest du auch mit dem Befehl Viewport einen rechteckigen Bereich festlegen, für den das Zeichnen (und auch das Cls) gelten soll.
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080
 

ChristianK

BeitragFr, März 07, 2008 16:47
Antworten mit Zitat
Benutzer-Profile anzeigen
So kannst du eine Funktion jede Sekunde ( sprich jede 1000 Millisekunden ) aufrufen:

Code: [AUSKLAPPEN]
time = MilliSecs( )

While Not KeyDown( 1 )

   If MilliSecs( ) - time > 1000
      time = MilliSecs( )
      Print "An dieser Stelle muss der Befehl stehen!"
   End If
Wend
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT
 

Maxi17

BeitragFr, März 07, 2008 17:30
Antworten mit Zitat
Benutzer-Profile anzeigen
erstmal danke für die schnellen antworten.
nunja, das mit dem viewport hatte ich vorher schon probiert, hat leider ned geklappt, und auch die andere version hat nicht den gewünschten effekt gehabt.

Code: [AUSKLAPPEN]
Graphics 1280,600
ClsColor 255,255,255
font1=LoadFont("Times New Roman",100,0,0,0)   
font2=LoadFont("Times New Roman",50,0,0,1)
font3=LoadFont("Arial Black",50,0,0,0)
For t = 1 To 5600
A=GetKey()
tor = LoadSound("tooor.wav")                  
If A=104 Then x=x+1
SetFont font2
Color 0,0,0
If A=104 Then Text 50,400,"Die Heimmannschaft hat ein Tor geschossen"
If A=104 Then PlaySound tor
If A=97 Then y=y+1
SetFont font2
If A=97 Then Text 50,400,"Die Auswärtsmannschaft hat ein Tor geschossen"
If A=97 Then PlaySound tor
If A=106 Then x=x-1;S
If A=115 Then y=Y-1;N
Color 255,240,0
If A=119 Then Rect 750,300,50,100,1
If A=119 Then Text 50,400,"Die Auswärtsmannschaft hat eine Gelbe Karte bekommen"
If A=117 Then Rect 750,300,50,100,1
If A=117 Then Text 50,400,"Die Heimmannschaft hat eine Gelbe Karte bekommen"
Color 255,0,0
If A=113 Then Rect 750,300,50,100,1
If A=113 Then Text 50,400,"Die Auswärtsmannschaft hat eine Rote Karte bekommen"
If A=122 Then Rect 750,300,50,100,1
If A=122 Then Text 50,400,"Die Heimmannschaft hat eine Rote Karte bekommen"
Color 255,240,0
If A=101 Then Rect 750,300,50,100,1
If A=105 Then Rect 750,300,50,100,1
Color 255,0,0
If A=101 Then Rect 775,300,50,100,1
If A=101 Then Text 50,400,"Die Auswärtsmannschaft hat eine Gelb-Rote Karte bekommen"
If A=105 Then Rect 775,300,50,100,1
If a=105 Then Text 50,400,"Die Heimmannschaft  hat eine Gelb-Rote Karte bekommen"
Color 0,0,0
SetFont font1
Text 100,300,x,True
Text 350,290, ":",True
Text 600,300, y,True
SetFont font3
Color 255,0,0
Text 100,200,"VfB",True
Color 0,0,255
Text 600,200,"KSC",True
SetFont font1
Color 0,0,0
v=v+1
If v=10 Then n=n+1
If v=10 Then v=0
If n=6 Then b=b+1
If n=6 Then n=0
If b=10 Then m=m+1
If b=10 Then b=0
k =LoadImage ("C:\2508.bmp")
DrawImage k,750,50
Text 250,100,m,True
Text 300,100,b,True
Text 350,90,":",True
Text 400,100,n,True
Text 450,100,v,True

Delay 1000
Cls
Next


das ist meine programmierung. nun möchte ich, dass die texte wie wenn jmd ein tor geschossen hat oder eine gelbe karte kassiert hat, ein wenig länger als eine sekunde auf dem bildschirm erscheinen.
vllt auch an der seite, so wie eine tabelle, mit minutenzahl und so.
vllt könnt ihr mir ja nun bissle weiter helfen, thx

SpionAtom

BeitragFr, März 07, 2008 18:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Als Anfänger solltest du dich zunächst mit dem Backbuffer() befassen. Ich kann dir noch eine Lösung mit Types anbieten, allerdings tun sich Neulinge oftmals schwer damit.

Code: [AUSKLAPPEN]
Type anzeige
   Field txt$
   Field dauerLaenge, dauerSZ
End Type
Local Anzeige.Anzeige


   SetBuffer BackBuffer()

   Repeat
   
      ;neues Ereignis anfügen
      z = Rand(200)
      If z <= 3 Then
         Anzeige = New Anzeige
         Select z
            Case 0: Anzeige\txt$ = "Tor für die Heimmannschaft (" + CurrentTime() + ")"
            Case 1: Anzeige\txt$ = "Tor für die Gastmannschaft (" + CurrentTime() + ")"
            Case 2: Anzeige\txt$ = "Elfmeter Heimmannschaft (" + CurrentTime() + ")"
            Case 3: Anzeige\txt$ = "Elfmeter Heimmannschaft (" + CurrentTime() + ")"
         End Select
         Anzeige\dauerLaenge = 3000
         Anzeige\dauerSZ = MilliSecs()
      End If      
      
      Cls
      
      ;Ereignisse anzeigen und ggf. Löschen
      zeile = 0
      For Anzeige = Each Anzeige
         If Anzeige\dauerSZ + Anzeige\dauerLaenge <= MilliSecs() Then
            Delete Anzeige
         Else
            Text (GraphicsWidth() - StringWidth(Anzeige\txt$)) / 2, zeile, Anzeige\txt$
            zeile = zeile + 20
         End If
      Next
      
      Flip()
   
   Until KeyDown(1)
   End


(Vielleicht solltest du dich mit SNIPER zusammentun Rolling Eyes der muss ähnliche Sachen machen...)
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

BladeRunner

Moderator

BeitragFr, März 07, 2008 18:39
Antworten mit Zitat
Benutzer-Profile anzeigen
~VERSCHOBEN~
Dieser Thread passte nicht in das Forum, in dem er ursprünglich gepostet wurde.


Ich behaupte mal die beiden sind schon ein Team.
Und es sind immer noch Beginnerprobleme Wink
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

SNIPER

BeitragFr, März 07, 2008 22:07
Antworten mit Zitat
Benutzer-Profile anzeigen
jo du hast es erfasst
 

Maxi17

BeitragFr, März 07, 2008 22:17
Antworten mit Zitat
Benutzer-Profile anzeigen
hi, na dann werde ich dass gleich mal versuchen. ähm, sniper ist mein klassenkammerat, aber der macht sein eigenes thema, da wir nicht das selbe machen wollten.
thx

skey-z

BeitragFr, März 07, 2008 22:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Da ich Sniper in seinem Thread schon in paar Tipps gegeben habe und sein Programm kenne, würde ich mit 99%iger Sicherheit behaupten, dass es genau das gleiche Thema ist, beides sind Spiele/Programme zum Thema Fußball.

Macht ihr das in Informatik oder so, falls euch euer Lehrer das was ihr uns bisher hier präsentiert habt, beigebracht hat, sagt ihm bitte er soll erst mal selber programmieren lernen, bevor er es euch lehrt.
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter
 

SNIPER

BeitragFr, März 07, 2008 22:57
Antworten mit Zitat
Benutzer-Profile anzeigen
wir machen des in technik und abenzu kann ers selber net aber er sagt uns auch nix weil wir des selber rausfinden sollen obwohl wir so was noch nie gemacht haben
 

Maxi17

BeitragSa, März 08, 2008 12:56
Antworten mit Zitat
Benutzer-Profile anzeigen
alles was der kann hat unser lehrer aus einem buch -_- und wenn er uns was beibringt das muss er vorher ablesen. naja, wenn wir fragen haben hat er keine antwort darauf. wir sollen eine Fußballuhr mit toranzeige uns verschiedenen ereignissen programmieren. er weiß selber ned wie es geht, aber wir sollen es dann machen. naja, kann man nix machen
 

Maxi17

BeitragSa, März 08, 2008 13:37
Antworten mit Zitat
Benutzer-Profile anzeigen
also des mit den types is für mich für den anfang wirklich zu schwer.
habs mal mit dem veiwport probiert. jetzt erscheint die anzeige schonmal immer an der seite.
aber da ich die zeit mit verschiedenen variablen gemacht habe läuft diese dann in der anzeige weiter Sad

Code: [AUSKLAPPEN]
Graphics 1280,600
ClsColor 255,255,255
Viewport 1,1,1000,1400
font1=LoadFont("Times New Roman",100,0,0,0)   
font2=LoadFont("Times New Roman",50,0,0,1)
font3=LoadFont("Arial Black",50,0,0,0)
For t = 1 To 5600
pfiff = LoadSound("pfiff.wav")
If t=1 Then PlaySound pfiff
If t=2 Then PlaySound pfiff
A=GetKey()
tor = LoadSound("tooor.wav")                  
If A=104 Then x=x+1
SetFont font2
Color 0,0,0
If A=104 Then Text 50,400,"Die Heimmannschaft hat ein Tor geschossen"
If A=104 Then PlaySound tor
If A=97 Then y=y+1
SetFont font2
If A=97 Then Text 50,400,"Die Auswärtsmannschaft hat ein Tor geschossen"
If A=97 Then PlaySound tor
If A=106 Then x=x-1;S
If A=115 Then y=Y-1;N
Color 255,240,0
If A=119 Then Rect 750,300,50,100,1
If A=119 Then Text 50,400,"Die Auswärtsmannschaft hat eine Gelbe Karte bekommen"
If A=119 Then PlaySound pfiff
If A=117 Then Rect 750,300,50,100,1
If A=117 Then Text 50,400,"Die Heimmannschaft hat eine Gelbe Karte bekommen"
If A=117 Then PlaySound pfiff
Color 255,0,0
If A=113 Then Rect 750,300,50,100,1
If A=113 Then Text 50,400,"Die Auswärtsmannschaft hat eine Rote Karte bekommen"
If A=113 Then PlaySound pfiff
If A=122 Then Rect 750,300,50,100,1
If A=122 Then Text 50,400,"Die Heimmannschaft hat eine Rote Karte bekommen"
If A=122 Then PlaySound pfiff
Color 255,240,0
If A=101 Then Rect 750,300,50,100,1
If A=105 Then Rect 750,300,50,100,1
Color 255,0,0
If A=101 Then Rect 775,300,50,100,1
If A=101 Then Text 50,400,"Die Auswärtsmannschaft hat eine Gelb-Rote Karte bekommen"
If A=101 Then PlaySound pfiff
If A=105 Then Rect 775,300,50,100,1
If A=105 Then Text 50,400,"Die Heimmannschaft  hat eine Gelb-Rote Karte bekommen"
If A=105 Then PlaySound pfiff
Color 0,0,0
SetFont font1
Text 100,300,x,True
Text 350,290, ":",True
Text 600,300, y,True
SetFont font3
Color 255,0,0
Text 100,200,"VfB",True
Color 0,0,255
Text 600,200,"KSC",True
SetFont font1
Color 0,0,0
v=v+1
If v=10 Then n=n+1
If v=10 Then v=0
If n=6 Then b=b+1
If n=6 Then n=0
If b=10 Then m=m+1
If b=10 Then b=0
Text 250,100,m,True
Text 300,100,b,True
Text 350,90,":",True
Text 400,100,n,True
Text 450,100,v,True
Delay 1000
Cls
Viewport 1,1,10000,4000
SetFont font3
If A=104 Then g=g+1
If g>0 Then Text 1100,100,"H: Tor"
If g>1 Then Text 1100,150,"H: Tor"
Next


habe jetzt erstmal in der anzeige die zeit weggelassen.
und dann stört mich da noch dieses dauernde erhöhen von g
"If g>0 Then Text 1100,100,"H: Tor"
If g>1 Then Text 1100,150,"H: Tor""
kann man das nicht auch anders machen, dass es da bei jedem tor etwas weiter unten schreibt, oder muss ich des immer manuell mit text und dann 50 weiter unten machen?
bitte nochmals um hilfe, da ich kurz vorm verzweifeln bin,
danke

garret

BeitragSo, März 09, 2008 14:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn der Text immer weiter unten erscheinen soll, benötigst du eine Variable, die sich merkt, in welche Zeile geschrieben wird. Ich nenne sie mal Zeile.
Angenommen, es fällt ein Tor, dann gibst du den Text aus und erhöhst diese Variable dann um 1, damit bei der nächsten Ausgabe der Text eine zeile tiefer steht.

Im Code sähe das dann so aus:
Code: [AUSKLAPPEN]

If Tor = 1
  Text 10, Zeile*20, "Tor gefallen"
  Zeile = Zeile + 1
EndIf


Am Anfang ist Zeile = 0. Fällt ein Tor, wird an die Stelle 10, Zeile (= 0)*20 der Text geschrieben. Anschließend wird Zeile um 1 erhöht (Zeile = Zeile (0) + 1; Zeile = 1).
Beim nächsten Tor wird der Text dann an die Stelle 10, Zeile (= 1) * 20 geschrieben, also an 10, 20. Beim dritten Tor an 10,40 ect.

Dein programm wird außerdem übersichtlicher, wenn du deine If-Abfragen zusammenfässt. Das geht mit EndIf...

Code: [AUSKLAPPEN]

If A = 1 Then (Befehl1)
If A = 1 Then (Befehl2)
If A = 1 Then (Befehl3)

; wird zu

If A = 1 Then
  (Befehl1)
  (Befehl2)
  (Befehl3)
EndIf


Nützlich ist auch das Befehlspaar Select/Case, wenn du viele Abfragen auf eine Variable hast. Es ersetzt dir viele If-Abfragen:
Code: [AUSKLAPPEN]

Select A
  Case 1; entspricht If A=1
    (Befehl1)
    (Befehl2)
    (Befehl3)
  Case 2; entspricht If A=2
    (Befehl1)
    (Befehl2)
    (Befehl3)
  Default; entspricht Else (A nicht 1 und nicht 2)
    (Befehl1)
End Select


Außerdem ist es besser, wenn du deinen Variablen sinnvolle Namen gibst, nicht nur Anfangsbuchstaben. Also statt A lieber Ballposition oder BallPos. Das erleichtert dir und anderen das Verständnis.

Und um auf deine Anfangsfrage zurückzukommen: Du willst einen Text zu einem bestimmten Zeitpunkt nicht durch Cls löschen lassen. Das gehst du falsch herum an: Lass den Text nur dann anzeigen, wenn du ihn brauchst. Dein Bildschirm wird ja sowieso gelöscht.

Du umgehst das also durch eine Abfrage:
Code: [AUSKLAPPEN]

Repeat
Cls

If Tor = 1
  Text 10, Zeile*20, "Tor gefallen"
  Zeile = Zeile + 1
EndIf

Flip
Until Keyhit(1)


Dein Text wird dann nur bei einem Tor angezeigt.
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht)

SpionAtom

BeitragSo, März 09, 2008 14:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problrm bei Garret ist, dass die Zeilen nicht mehr verschwinden. Was du brauchst, ist eine Queue/Schlange. Eine Struktur die Werte aufnimmt und ab und zu den ersten löscht. (Eine Type-Struktur brwerkstelligt dies zb.) Angenommen es fällt ein Tor, danach gibts Gelbe Karte, danach gibts Elfmeterschießen. Dann hast du drei Ereignisse, die ausgegeben werden müssen. Das erste Ereignis, das Tor, ist auch das erste Ereignis, dass wieder ausgeblendet werden soll. Darum brauchst du eine Queue. Mach dich mal schlau darüber was das ist. Dann kommst du sicherlich weiter.
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

The_Nici

BeitragSo, März 09, 2008 14:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
zum urpsrünglichen Thema:

Ich hatte das gleiche Problem bei meinem Xtremepong. Deshalb hatte ich 2 Variablen:
Code: [AUSKLAPPEN]

acutaltext$
texttime%


So, nun wollen wir sagen, dass die Gastmannschaft nen Tor geschossen hat.

Code: [AUSKLAPPEN]

actualtext$="Gastmannschaft hat ein Tor geschossen!"


Cool. Nun, wir wollen den natürlich auch ein weilchen lang zeichnen.
Also, wenn die gastmannschaft ein Tor geschossen hat, dann passiert folgendes:

Code: [AUSKLAPPEN]

actualtext$="Gastmannschaft hat ein Tor geschossen!"
texttime%=Millisecs()

So, was bewirkt ql:Millisecs()? Es gibt die Zeit in Millisekunden seit dem Systemstart zurück. Also eine willkürliche Zeit. Nun der Clou: Dies ist unser 'Anker'. Wir wissen nun wann der Text gestartet ist. Aber irgendwann soll er ja auch wieder aufhören!

Deshalb kommt folgendes in die Mainloop:
Code: [AUSKLAPPEN]

If Millisecs() - texttime%<=5000 then
   Text 0,0,actualtext$
EndIf



Folgendes: Wir überprüfen ob die jetzige Zeit seit dem Systemstart minus die damalige Zeit seit dem Systemstart kleiner oder gleich 5000 (Millisekunden) ist!
Wenn ja, dann zeichnen wir den Text.

Wunderbar, nicht? Wir können CLS behalten und haben trotzdem für ne Weile einen Text auf dem Bildschirm!

MfG Nici

PS: Es empfiehlt sich actualtext$ und texttime als Global zu deklarieren, falls du später mal eigene Functions nutzt um das abzufragen.
 

Maxi17

BeitragSa, März 15, 2008 13:00
Antworten mit Zitat
Benutzer-Profile anzeigen
habs jetzt mal mit dem viewport nochmal versucht. allesdings wird der text dort trotzdem wieder gelöscht, bzw der wiewport garnicht erst angezeigt

Code: [AUSKLAPPEN]
Text 350,90,":",True
Text 400,100,n,True
Text 450,100,v,True
Delay 1000
Cls
Viewport 1,1,2000,2000
ClsColor 255,255,255
SetFont font2
Color 0,0,0
If A=104 Then Text 800, Zeile*20, "Tor der Heimmannschaft"
If A=104 Then Zeile = Zeile + 1

Next


liegt es i-wie mal wieder am cls?

The_Nici

BeitragSa, März 15, 2008 14:37
Antworten mit Zitat
Benutzer-Profile anzeigen
CLS ist völlig in Ordnung.
Ich würde die Viewportsache eh vergessen, es ist sehr unsauber.

Siehe meinen Post oben, dort wird das ganze Schön erklärt. Smile

BladeRunner

Moderator

BeitragSa, März 15, 2008 14:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Kurz gefasst, Maxi: Wirf deinen Code weg und starte neu, nachdem du ein wenig mit den Befehlen von Blitz geübt hast.

Nur einen Teil des Bildschirms löschen zu wollen ist der falsche Weg. Der korrekte ist alles was gezeigt werden soll in jedem Durchgang neu einzuzeichnen (sich also zu merken was wo hinkommt).
Dazu gibt es so wundervolle Dinge wie Variablen, Arrays(ql:dim) und ql:type .
Lern die zu benutzen, und es wird klappen. Andernfalls kannst Du die Geschichte mit dem Programmieren haken. Klingt hart, ist aber so.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group