CLS an einer stelle aussetzen lassen
Übersicht

Maxi17Betreff: CLS an einer stelle aussetzen lassen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080 |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
~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 ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
jo du hast es erfasst | ||
Maxi17 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
SNIPER |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group