Einen Text auf Tastendruck erscheinen lassen

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

TheMagician

Betreff: Einen Text auf Tastendruck erscheinen lassen

BeitragSa, Apr 09, 2005 2:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen!
Ich habe mir gestern die Trial-Version von Blitz3D runtergeladen um mich da mal ein bisschen einzulernen.
Hier kommt die absolute Anfänger-Frage:

Ich möchte, dass auf Tastendruck der Text "Hello World" nur ein einziges Mal, in einer einzigen Zeile erscheint.
Im Moment drücke ich einmal kurz auf die Taste und Blitz schreibt mir den ganzen Bildschirm (also in viele Zeilen untereinander) voll mit "Hello World".

Mein Code ist
Code: [AUSKLAPPEN]

Graphics 640,480

While Not KeyHit(1)
   If KeyDown(31) Print "Hello World"
Wend
End


Kann mir da jemand helfen?

Und noch eine Frage: Hat die Vollversion von Blitz3D eine Auto-Complete Funktion für den Code oder nicht?

Vielen Dank im Vorraus,
Stefan
 

Apocalyptic

BeitragSa, Apr 09, 2005 2:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Nimm ql:Keyhit .

Autocomplete gibts nicht... da brauchst du einen anderen Editor.
Suum cuique

[ www.ffs-net.de.vu ] [ Raycaster ]
  • Zuletzt bearbeitet von Apocalyptic am Sa, Apr 09, 2005 2:34, insgesamt einmal bearbeitet
 

hitokiri

BeitragSa, Apr 09, 2005 2:34
Antworten mit Zitat
Benutzer-Profile anzeigen
ups, verlesen ^^'.
also das problem ist, dass der computer ungefähr wohl eine 100.000stel sekunde braucht um den code durchzugehen und somit du bei einer sekunde gedrückt halten der taste 100000 mal den text bekommen würdest. kedown prüft nur, ob eine taste gedrückt ist oder nicht, wie dingens schon sagte, nimm keyhit .
 

TheMagician

BeitragSa, Apr 09, 2005 2:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Aha!
Ihr seit aber auch die ganze Nacht wach, oder? Very Happy

Euer Tip hat natürlich funktioniert! Vielen Dank ... damit bin ich wohl in die wunderbare Welt von Blitz eingestiegen ...

Man könnte ja jetzt noch ein bisschen an dem Problem arbeiten:

Was, wenn ich wollte, dass beim einmaligen (kurzen) anschlagen der Taste der Text nur einmal (in einer Zeile) erscheint, wenn ich aber die Taste sagen wir mal 1 Sekunde lang gedrückt halte möchte ich, dass der Text immer wieder neu angezeigt wird?
So wie in Word, wenn ich den Buchstaben "A" einmal drücke erscheint er einmal, wenn ich ihn aber gerdückt halte kommt er so oft bis ich die Taste loslasse.

Stefan
 

hitokiri

BeitragSa, Apr 09, 2005 4:26
Antworten mit Zitat
Benutzer-Profile anzeigen
also das kapiere ich jetzt nicht so ganz *kopfkratz* ich verstehe das so, dass nach einer sekunde wartezeit der screen mit dem text vollgemüllt wird, dann musst du das so machen:
Graphics 640,480
oldtime
While Not KeyHit(1)
If KeyHit(31) Print "Hello World"
oldtime=Millisecs()
Endif
If Millisecs()-oldtime>1000 then
while KeyDown(31) print"hello world"
Endif
Wend



Millisecs() gibt die momentane systemzeit in millisekunden an. wenn man die taste nur hittet wird der timer aktiviert und somit auch jedesmal auf 0 resettet wenn man die taste neu drückt. also ich denke der code ist selbstverständlich wenn du millisecs() on der command reference durchliest Smile
 

TheMagician

BeitragSa, Apr 09, 2005 12:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi hitokiri!

Ich wollte deinen Code gerade testen und bekomme beim compilieren immer eine Fehlermeldung "Endif without If".

Woran kann das liegen?

Um meine Frage nochmal ein bisschen anders zu formulieren. Ich hätte gerne, dass wenn man die Taste "A" einmal kurz drückt nur

A

auf dem Bildschirm erscheint.
Wenn man die Taste "A" aber gedrückt hält sollte es so aussehen:

AAAAAAAAAAAAAAAAAAAA

bis man die Taste eben wieder loslässt.

skey-z

BeitragSa, Apr 09, 2005 13:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
If KeyHit(31) Print "Hello World"
oldtime=Millisecs()
Endif


muss heissen:

Code: [AUSKLAPPEN]
 If KeyHit(31) then
Print "Hello World"
oldtime=Millisecs()
Endif


das was du machen willst sollte folgendermaßen funktionieren:

Code: [AUSKLAPPEN]


SetBuffer BackBuffer()

While Not KeyHit(1)

Cls
keyget=GetKey()
     If keyget>31 Then eingabe$=eingabe$+Chr$(keyget)
     If (keyget=8) And Len(eingabe$)>0 Then eingabe$=Left$(eingabe$, Len(eingabe$)-1)

Text 0,0, eingabe$+"_"

Flip

Wend

End


damit kannste auf tastendruck jeden möglichen buchstaben einfügen, jedoch nur einen buchstaben pro tastendruck, auch wenn du die tast gedrückt hältst.

MfG skey-z

ps. Code: [AUSKLAPPEN]
if (keyget=8)
ist die Backspace Taste, somit kannste auch einzelne Buchstaben löschen.
 

TheMagician

BeitragSa, Apr 09, 2005 13:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Sehr seltsam.
Ich habe jetzt den Code aktualisiert wie du es gesagt hast, skey-z, aber bekomme immernoch die gleiche Fehlermeldung "Endif without If"

Code: [AUSKLAPPEN]

Graphics 640,480

oldtime

While Not KeyHit(1)

   If KeyHit (31) Then
      Print "Hello World"
      oldtime=MilliSecs()
   EndIf

   If MilliSecs()-oldtime > 1000 Then
      While KeyDown (31) Print "Hello world"
   EndIf    ; <----- In dieser Zeile meckert der Debugger
   
Wend


Das ist ja ein cooler Code zum eingeben von Text. Danke skey-z!
Schade ist nur, dass man bei der Backspace-Taste jeden einzelnen Buchstaben durch einen separaten Tastendruck löschen muss.
Irgendeine Idee wie man das schafft, dass er am Stück löscht, so lange wie ich die Backspace-Taste drücke?

Hoffe ich nerve nicht,
Stefan

Spikespine

BeitragSa, Apr 09, 2005 13:45
Antworten mit Zitat
Benutzer-Profile anzeigen
jo. Dazu verwendest du anstatt Keyhit() KeyDown() .
Dass es nicht zu schnell geht, baust du halt noch einen Takt ein.
Athlon 64 3700+ | 1024 MB RAM | GeForce 7900 GT | Blitz2D, Blitz3D, BlitzPlus, BlitzMax

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragSa, Apr 09, 2005 13:46
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
If MilliSecs()-oldtime > 1000 Then 
While KeyDown (31) Print \"Hello world\"
EndIf
anstatt While ein IF, dann sollte es laufen!
[BB2D | BB3D | BB+]
 

TheMagician

BeitragSa, Apr 09, 2005 14:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Hilfe mit dem Code Rallimen. Der If Else Fehler ist jetzt weg.
Jetzt haben wir noch dieses kleine Problem

BlitzBasic: [AUSKLAPPEN]

Graphics 640,480

oldtime ; <----- Fehler \"Function 'oldtime' not found\"

While Not KeyHit(1)

If KeyHit (31) Then
Print \"Hello World\"
oldtime=MilliSecs()
EndIf

If MilliSecs()-oldtime > 1000 Then
If KeyDown (31) Print \"Hello world\"
EndIf

Wend


Glaubt mir, bei jedem so primitiven Fehler den ihr mir erklährt kapier ich das Programm viel mehr!

@Spikespine:
Mit "bau halt noch nen Takt ein" meinst du, eine Zeitabfrage oder sowas? Also dass prakisch immer wenn ein Millisekunden-Timer auf null gelaufen ist ein Buchstabe gelöscht wird?
Bin ich da auf dem richtigen Weg?

Spikespine

BeitragSa, Apr 09, 2005 14:35
Antworten mit Zitat
Benutzer-Profile anzeigen
jo. Ich würde dir einen Code machen, aber dabei lernst du ja nichts...^^

Edit:
Wenn in einer Zeile 'oldtime' steht, glaubt Blitz, dass es eine funktion wäre. Da sie nicht existiert, kommt die Fehlermeldung.
Schreibe also

oldtime=MilliSecs()

oder lass es weg...
Athlon 64 3700+ | 1024 MB RAM | GeForce 7900 GT | Blitz2D, Blitz3D, BlitzPlus, BlitzMax

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragSa, Apr 09, 2005 14:37
Antworten mit Zitat
Benutzer-Profile anzeigen
oldtime ist eine Variable!
wenn du diese Variable oben hinschreibst mußt du entweder die auf global setzten oder ihr einen Wert zuweisen, BlitzBasic: [AUSKLAPPEN]
olttime = MilliSecs() 
;oder
Global oldtime
da BB sonst davon ausgeht das es eine Function ist!

Wenn diese Variable so benutzt wird wie es in deinem Code der Fall ist dann lösche diese Zeile!
[BB2D | BB3D | BB+]
 

TheMagician

BeitragSa, Apr 09, 2005 17:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Erklärung mit der Variablen und einer Funktion.

Ich hab jetzt mal ein bisschen rumprobiert und bin bei folgenden Script gelandet:

BlitzBasic: [AUSKLAPPEN]

Graphics 640,480

SetBuffer BackBuffer()

While Not KeyHit(1)

Cls
keyget=GetKey()

If keyget>31 Then eingabe$=eingabe$+Chr$(keyget)

If KeyHit(8) Then timer=MilliSecs()

If (keyget=8) And Len(eingabe$)>0 Then
eingabe$=Left$(eingabe$, Len(eingabe$)-1)

If MilliSecs()-timer > 1000 Then
eingabe$=Left$(eingabe$, Len(eingabe$)-1)
timer=MilliSecs()
EndIf

EndIf

Text 0,0, eingabe$+\"_\"

Flip

Wend

End


Leider funktioniert er nicht so wie ich mir das vorstelle:
Wenn ich Backspace drücke wird zwar ein Buchstabe gelöscht, aber auch nicht mehr. Eigentlich dachte ich, dass die Abfrage des Timers jede Sekunde einen weiteren Buchstaben löschen würde.

Könnte ihr mir einen Tip geben?

Und noch eine Frage: Warum krieg ich bei dem gleichen Code, nur etwas anders gruppiert eine Fehlermeldung:

BlitzBasic: [AUSKLAPPEN]

Graphics 640,480

SetBuffer BackBuffer()

While Not KeyHit(1)

Cls
keyget=GetKey()

If keyget>31 Then eingabe$=eingabe$+Chr$(keyget)

If KeyHit(8) Then timer=MilliSecs()

If (keyget=8) And Len(eingabe$)>0 Then
eingabe$=Left$(eingabe$, Len(eingabe$)-1)
EndIf

If MilliSecs()-timer > 1000 Then
eingabe$=Left$(eingabe$, Len(eingabe$)-1) ; <-- Fehler: \"Parameter must be positive\"
timer=MilliSecs()
EndIf


Text 0,0, eingabe$+\"_\"

Flip

Wend

End

Spikespine

BeitragSa, Apr 09, 2005 17:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Dein erster Code klappt so nicht.
Ich würde für das Löschen KeyDown(14) verwenden. (14 ist der Scancode der Lösch-Taste)

Naja, hier mal ein Codebeispiel.


BlitzBasic: [AUSKLAPPEN]

Graphics 640,480,16,2

SetBuffer BackBuffer()

While Not KeyHit(1)

Cls
keyget=GetKey()

If keyget>31 Then eingabe$=eingabe$+Chr$(keyget)

If KeyDown(14) And Len(eingabe$)>0 Then
If MilliSecs()-timer > 200 Then
eingabe$=Left$(eingabe$, Len(eingabe$)-1)
timer=MilliSecs()
EndIf

EndIf

Text 0,0, eingabe$+\"_\"

Flip

Wend

End


zu 2.:
Der Parameter muss positiv sein! Ist er aber nicht, solange Len(eingabe) = 0 ist, denn du ziehst 1 ab. Das wäre demnach -1.
Athlon 64 3700+ | 1024 MB RAM | GeForce 7900 GT | Blitz2D, Blitz3D, BlitzPlus, BlitzMax
 

TheMagician

BeitragSa, Apr 09, 2005 18:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Zu meinem Code:
Wie du richtig sagst funktioniert mein Code auch nicht wenn ich den Scancode für KeyHit in 14 ändere.
Kannst du mir vielleicht knapp erklären warum nicht?
Ich dachte sobald ich Backspace drücke wird ein timer gesetzt:

BlitzBasic: [AUSKLAPPEN]
If KeyHit(14) Then timer=MilliSecs() 


Und solange ich die Backspace-Taste gedrückt halte

BlitzBasic: [AUSKLAPPEN]
 If (keyget=8) And Len(eingabe$)>0   Then 


wird geprüft ob der timer "1000 erreicht" und dann wird wieder ein Buchstabe gelöscht und der Timer wird aktualisiert.

Wo ist mein Denk- (oder Programmier-) Fehler?

2. Die Fehlermeldung:
Es wundert mich aber, dass die Fehlermeldung "Parameter must be positive" nur an der einen Stelle im Script kommt und nicht schon vorher.
Denn ich benutze exakt die selbe Zeile (für das löschen der Buchstaben) ja schon ein paar Zeilen darüber, und da meckert er nicht.

3. Zu deinem Code:

BlitzBasic: [AUSKLAPPEN]

If KeyDown(14) And Len(eingabe$)>0 Then
If MilliSecs()-timer > 200 Then ; <-- Hier benutzt du \"timer\" obwohl du ihn noch garnicht
eingabe$=Left$(eingabe$, Len(eingabe$)-1) ; deklariert hast. Welchen Wert hat er dann? Null?
timer=MilliSecs()
EndIf

EndIf
 

Apocalyptic

BeitragSa, Apr 09, 2005 21:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem ist, das Getkey() wie Keyhit() funktioniert: Auch wenn die Taste ständig gedrückt wird, wird nur beim ersten Tastenanschlag ein Wert zurückgeliefert.

Zitat:
Denn ich benutze exakt die selbe Zeile (für das löschen der Buchstaben) ja schon ein paar Zeilen darüber, und da meckert er nicht.


Genau das ist das Problem Rolling Eyes Du frägst ab, ob der String größer null ist. Wenn das der Fall ist, löschst du den letzten Buchstaben. Und dann löschst du nochmal einen Buchstaben... Das kann ja nicht gut gehen...

Und Variablen sind immer null wenn ihnen kein Wert zugewiesen wurde. Das hätte man aber auch ausprobieren können Wink
Suum cuique

[ www.ffs-net.de.vu ] [ Raycaster ]

Egon Dragon

BeitragMo, Apr 11, 2005 9:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Warum so kompliziert?
wenn ich das jetzt richtig verstanden habe, willst du auf tastendruck
"Hallo Welt" in der ersten zeile erscheinen lassen.

das kann man mit print so machen:
Code: [AUSKLAPPEN]

Graphics 640,480

While Not KeyHit(1)
   If KeyDown(31) Then Locate 0,0:Print "Hello World"
Wend
End


Oder mit Text so:
Code: [AUSKLAPPEN]

Graphics 640,480

While Not KeyHit(1)
   If KeyDown(31) Then Text 0,0,"Hello World"
Wend
End

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group