Problem mit meinem Script [Problem gelöst]

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Nova

Betreff: Problem mit meinem Script [Problem gelöst]

BeitragMo, Aug 18, 2008 7:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe ein Problem bei meinem Code.

Eigendlich soll diese Funktion Buchstaben aus einem Satz immer nach einer gewissen Zeit anzeigen. Wie als würden sie gerade erst mit der Tastatur geschrieben werden.
Dazu habe ich eine Funktion geschrieben. Jetzt braucht man nurnoch mit "echo satz$" etwas abschicken, das wird dann buchstabenweise auf den Bildschirm gebracht.

Das Problem jetzt ist aber, das irgendwie immer zwei Buchstaben geschrieben werden und dann erst gewartet wird.

Ebenso funktioniert das ganze nur ein mal. Beim zweiten "echo" wird einfach nichts gemacht. Anscheind funktioniert das "Exit" nicht richtig. (Vermute ich nur.)

Da ich bereits mehrmals gelesen habe das "delay" als Zeitbegrenzung viel Leistung frisst wollte ich auf "WaitTimer" umsteigen. Vor allem auf alten Computern soll das vorkommen.

Und zuletzt bin ich mir nicht sicher ob mein Code wirklich optimal geschrieben wurde. Ich habe zwar Erfahrung mit PHP allerdings ist mit BlitzBasic neu.

Hier also meine Fragen:
-> Wieso werden immer zwei Buchstaben und nicht immer einer ausgegeben?
-> Wieso funktioniert "echo" nur einmal, wird die "Repeat/Forever"-Schleife vielleicht nicht richtig beendet?
-> Ist "delay" wirklich der Tod für alte Computer wenn man ihn als Zeitbegrenzung benutzt?
-> Sollte ich lieber "delay" statt "CreateTimer/WaitTimer" nehmen?
-> Kann man den Code sonst noch auf irgendeine Art optimieren?[/list]


Mit freundlichen Grüßen, Nova.


Der Code:
Code: [AUSKLAPPEN]
Graphics 640, 480, 32, 2
Global kurz = CreateTimer(2)
Global lang = CreateTimer(1)
start = MilliSecs()
echo "Ein kleiner Test, hoffentlich klappt es!"
echo "Test Nummer 2 ist das hier, yippie!"
ende = MilliSecs()
zeit = ende - start
WaitKey
echo "Und Nummer 3 folgt sogleich. Zeit:" +zeit
WaitKey
End

Function echo(satz$)
   zahl = Len(satz$)
   spalte = 0
   Repeat
      zeichen$ = Mid(satz$, spalte+1, spalte+1)
      Text (spalte*8)+1, (zeile*13)+1, zeichen$
      spalte = spalte+1
      If spalte+1 >= zahl Then
         Exit
      EndIf
      WaitTimer kurz
   Forever
   zeile = zeile + 1
   WaitTimer lang
End Function
AMD Athlon II 4x3,1GHz, 8GB Ram DDR3, ATI Radeon HD 6870, Win 7 64bit
  • Zuletzt bearbeitet von Nova am Di, Aug 19, 2008 8:25, insgesamt einmal bearbeitet
 

Phlox

BeitragMo, Aug 18, 2008 10:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Graphics 640, 480, 32, 2
Global kurz = CreateTimer(5)
Global lang = CreateTimer(4)
start = MilliSecs()
echo "Ein kleiner Test, hoffentlich klappt es!"
echo "Test Nummer 2 ist das hier, yippie!"
ende = MilliSecs()
zeit = ende - start
WaitKey
echo "Und Nummer 3 folgt sogleich. Zeit:" +zeit
WaitKey
End

Function echo(satz$)
   zahl = Len(satz$)
   spalte = 0
   Repeat
      zeichen$ = Mid(satz$, spalte+1, 1)
      Write zeichen$
      spalte = spalte+1
      If spalte+1 >= zahl Then
         Exit
      EndIf
      WaitTimer kurz
   Forever
   zeile = zeile + 1
   WaitTimer lang
   Print
End Function


Ist jetzt aber leider mit Write und Print.
Delay ist in diesem Fall besser, da man es genauer einstellen kann.

Nova

BeitragMo, Aug 18, 2008 10:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, zwei Probleme hat deine Version (Aber zum Glück weniger als meine! Very Happy):
> Der Timer "lang" funktioniert irgendwie nicht, der zweite Text kommt sofort nach dem ersten. (Ist nicht tragisch, werde ich mit "delay" lösen.)
> Ich brauche für das Programm, in dem ich dieses Script nutzen möchte, "Cls". Blöder weise wird der Text dann nicht wieder am Anfang geschrieben, sondern eine Zeile weiter, wo der letzte Text stand. Das war auch der einzige Grund, wieso ich "Text" genommen habe.
AMD Athlon II 4x3,1GHz, 8GB Ram DDR3, ATI Radeon HD 6870, Win 7 64bit
 

Dreamora

BeitragMo, Aug 18, 2008 11:22
Antworten mit Zitat
Benutzer-Profile anzeigen
1. du nutzt kein Script. Blitz ist eine Programmiersprache, nicht eine Scriptsprache -> code
2. Delay hält das ganze programm an. Sowas macht man normalerweise indem man zeitdifferenzen misst (millisecs).
3. Wenn du mit CLS dafür sorgen willst das alles an der alten position ist -> neu zeichnen
wenn es 1 - x zeilen rauf rutschen will musst du die text zeilen irgendwo speichern (ich rate zu types) und dann einfach zählen auf dem wievielten type du bist und diese zahl (i) * zeilenhöhe für die y koordinate verwenden.
dann kommts schön oben ran immer wieder
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Nova

BeitragMo, Aug 18, 2008 13:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Dreamora hat Folgendes geschrieben:
1. du nutzt kein Script. Blitz ist eine Programmiersprache, nicht eine Scriptsprache -> code

Auch gut.

Dreamora hat Folgendes geschrieben:
2. Delay hält das ganze programm an. Sowas macht man normalerweise indem man zeitdifferenzen misst (millisecs).

Da ich allerdings keine Animationen oder ähnliches habe ist "delay" gar nicht mal so falsch.

Dreamora hat Folgendes geschrieben:
3. Wenn du mit CLS dafür sorgen willst das alles an der alten position ist -> neu zeichnen
wenn es 1 - x zeilen rauf rutschen will musst du die text zeilen irgendwo speichern (ich rate zu types) und dann einfach zählen auf dem wievielten type du bist und diese zahl (i) * zeilenhöhe für die y koordinate verwenden.
dann kommts schön oben ran immer wieder

Genau das macht ich doch oben! Immer wenn ich z. b. "Cls" schreibe werde ich natürlich auch die Variable "zeile" wieder auf 0 setzen. Deine Methode ist zu umständlich. Indem ich "zeile" auf die gewünschte Zeile setze kann ich das auch machen.
Ich bin Anfänger, da sinst Types der Horror. Wobei ich noch kein gutes Tutorial für die gefunden habe.
AMD Athlon II 4x3,1GHz, 8GB Ram DDR3, ATI Radeon HD 6870, Win 7 64bit

The_Nici

BeitragMo, Aug 18, 2008 17:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Kannst auch Dim-Felder nehmen, die verbrauchen zwar unter umständen etwas mehr Speicher als benötigt und du musst sie vordefinieren, sind aber einfach zu handhaben. ;D

Code: [AUSKLAPPEN]

;Grafikmodus
Graphics 800,600,0,2
;BackBuffer setzen
SetBuffer BackBuffer()

;Konstanten für Zeilen.
Const zeilen%=99

;Das Dim-Feld
Dim zeichen$(zeilen)
;Zeilenvariable
zeilenzaehler%=0

While Not KeyHit(1)   ;Start Hauptschleife
   Text 500,0,"Leertaste für neuen Text!"
   If KeyHit(57) Then   ;Wenn Leertaste gedrückt wurde...
      zeichen$(zeilenzaehler)="Lolwut h4x!"   ;Ins Feld eintragen
      zeilenzaehler=zeilenzaehler+1   ;Zeilencounter erhöhen
   EndIf
   For i=0 To zeilenzaehler   ;Forschleife, fürt sich zeilenzählermal aus. ;D Aktueller Schleifendurchlauf wird in "i" gespeichert.
      Text 0,12*i,zeichen$(i)   ;Das Zeugs zeichnen.
   Next   ;Ende Forschleife
   Flip   ;Buffer vertauschen
   Cls      ;Buffer löschen
Wend      ;Ende Hauptschleife
End         ;Ende Programm


Ich hoffe ich hab dein Problem richtig verstanden, kam auch schon vor dass ich reine shice gequatscht hab :o

EDIT: Mal wieder voll am Thema vorbeigeredet, sry. ._.

Nova

BeitragDi, Aug 19, 2008 8:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Das problem wurde gelöst. Ich habe mir Mid nochmal angeguckt, leider habe ich erst dann gemekrt das die zwei letzten Parameter nicht dafür sind von wann bis wann kopiert werden soll sondern von wann wieviele Zeichen.
Ist ein bischen schwer zu kapieren aber egal, danke für die Hilfe! Wink

@The_Nici: Du hast es wenigstens versucht!
AMD Athlon II 4x3,1GHz, 8GB Ram DDR3, ATI Radeon HD 6870, Win 7 64bit

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group