Einen Text auf Tastendruck erscheinen lassen
Übersicht

TheMagicianBetreff: Einen Text auf Tastendruck erscheinen lassen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Aha!
Ihr seit aber auch die ganze Nacht wach, oder? ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
TheMagician |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
BlitzBasic: [AUSKLAPPEN] If MilliSecs()-oldtime > 1000 Thenanstatt While ein IF, dann sollte es laufen! |
||
[BB2D | BB3D | BB+]
|
TheMagician |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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]
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
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()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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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]
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]
|
||
![]() |
Spikespine |
![]() Antworten mit Zitat ![]() |
---|---|---|
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]
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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]
|
||
Apocalyptic |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() Und Variablen sind immer null wenn ihnen kein Wert zugewiesen wurde. Das hätte man aber auch ausprobieren können ![]() |
||
Suum cuique
[ www.ffs-net.de.vu ] [ Raycaster ] |
![]() |
Egon Dragon |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group