3D Text aus Draw-3D Archiv// Text Zeichen für Zeichen ändern
Übersicht

![]() |
Sir Gauss der III |
![]() Antworten mit Zitat ![]() |
---|---|---|
Gut, dann will ich mal näher auf eure Problematik eingehen.
Immerhin ist jetzt klar, dass ihr wisst was die Befehle Len und Mid machen, ebenso wie die angesprochenen Zeilen. 1. Programmstruktur Ob du's glaubst oder nicht, durch eine bessere Programmstrukur räumst du dir schon mal einige Fehler aus. Code: [AUSKLAPPEN] ......... ;hier fehlt noch immer der Kopf. gewöhn dir an, IMMER, auch im Testprogramm ;einen Programmkopf zu erstellen. (Graphics, Buffer ...) Local .... ;verzichte auf die deklarierung der Variablen mit Lokal. Dies hat häufig den Fehler, dass Variablen in einem ;größeren Programm in einer Funktion wieder den Wert 0 aufweisen. Und dann dauert es eine weile bis ;man rausgefunden hat, dass sie nur als Lokal deklariert wurden. ;Grundsätzlich: ALLE Variablen als Gloabl deklarieren, und nur die, die wirklich nur von einer Funktion ;benötigt werden als Lokal. Global Count = 0 ;schon mal gut, die Variablen stehen am Anfang MilliSecs () If Len(Text1)>Len(Text2) Then Laengeres=Len(Text1) Else Laengeres=Len(Text2) End If ...... Im Grunde kannst du ein fertiges Grundprogramm schreiben. Also eines, das ein Fenster öffnet und einstellt, das eine Schleife startet die mit ESC beendet wird und das richtig endet. Später kannst du dir auch noch eine Funktion für eine Maus dazu basteln usw.... dann musst du, wenn du ein neues Programm machst, nur noch die Datei öffnen und hast dir schon mal ... sagen wir... 15 Minuten Schreibarbeit gespart und einige möglich Fehlerquellen ausgeräumt. Setz einfach mal so ein Grundprogramm rein, dann schau ichs mal durch. 2. Programm durcharbeiten Dies ist einfach zu wichtig. Es ist etwas, das jeder Programmierer beherschen muss. Fragen und Denkansätze, die hierfür wichtig sind: # Überlegung: Der PC arbeitet zeile für Zeile stur ab. (also auch so ein Programm lesen) # Frage: Stimmen alle Variablen? (Lokal\Global, schreibfehler) # Frage: erhält eine Variable einen falschen Wert? (s.u.) # Frage: ist dieser Ort für den Befehl richtig? (> Programmstruktur) # Frage: was gibt der PC an dieser Stelle auf den Bildschirm? # Frage: hört eine Schleife dann auf wenn ich es will? # Frage: beginnt eine schleife dann wenn ich will? # Frage: stehen die Befehle dort wo sie sollen? ..... Das meiste machen wir schon automatisch. d.h. wir erkennen einfache Fehler recht schnell, da wir uns durchs programmieren automatisch der Denkstruktur des PC anpassen: Code: [AUSKLAPPEN] n=0
Repeat n=n+1 If n=100 Then n=0 EndIf Until n=1000 Jeder erkennt hier, dass es eine Endlosschleife ist. Warum? Wir gehen gedanklich schon automatisch den Code durch. 1. Zeile: n=0 stimmt, so soll es ja sein 2. Zeile: beginn der Schleife (auch i.o.) 3. n wird hochgezählt (muss so sein damit am Ende n irgend wann 1000 erreicht) 4. Zeile: n wird abgefragt (klar, da soll ja was passieren) 5. zeile: n wird wieder 0 (AHA) ... Nun ist euer Programm schon etwas größer. Hier geht es zwar auch, zeile für Zeile sich klar zu machen was passiert. Hilfreich ist dafür aber auch der Debugger. Einfach mal die Variablen an verschiedenen Stellen an ihn übergeben und eine kleine Notiz dazu machen. Code: [AUSKLAPPEN] n=0
DebugLog "n zu begin:"+n Repeat DebugLog "n in der schleife beim Start:"+n n=n+1 DebugLog "n nach dem hochzählen:"+n If n=100 Then DebugLog "n nach der Abfrage:"+n n=0 DebugLog "n nach der Aktion:"+n EndIf Until n=1000 klar, hier ist es schon lächerlich, aber macht es mal so ähnlich mit eurer Variablen Count, Timer und anzeige. also nicht nur einmal, sondern einfach mal an verschiedenen Stellen. Dass du rausgefunden hast, dass Millisecs() sich nicht erhöht, ist ein wichtiger Schritt. verfolge doch mal millisecs(), gern auch mal nach jeder zeile. Mit Kommentar, wo du gerade bist, und vlt. auch mit der Variable Timer (+count?). Code: [AUSKLAPPEN] Gut, das was ich nun erwarte ist folgendes (das hilft ja auch anderen, wenn sie mal das Thema anschauen weil sie ein ähnliches Problem haben): 1. Erstellt mal ein Grundprogramm und setzt es rein. Es soll nichts anderes können auser: * Fenster öffnen und einrichten * Platzhalter für Variable (als Kommentar : ; *** Variable****) * Platzhalter für Ladevorgänge * Platzhalter für Einrichtungen (änderungen und berechnungen vor Programmstart) * Starten einer Hauptschleife die sich mit ESC beenden lässt * Alle benötigten Befehle in der HS wie cls flip .... * evtl auch einen Timer (Variable an der richtigen Stelle, einstellen an der richtigen Stelle ....) * Ende der Schleife * Ende des Programms * Platzhalter für Funktionen Macht jetzt zwar ein wenig Arbeit, dafür hilft es euch in zukunft so richtig. 2. kommentiert mal euer Programm zeile für zeile durch. ähnlich wie ich es damit gemacht habe. schreibt dazu, was die Zeile macht, was sie genau machen soll, wo ihr am ende der Schleife jeweils sein wollt usw. wenn es ordentlich durchkommentiert ist, kann man recht schnell die entsprechende Zeile rausfinden. kommentiert z.b. so ähnlich wie hier gemacht wurde:Zitat: -Der Lenn befehl zehlt die Ziffern aus einen Wort/Variable -count erhöht sich immer um 1 (pro durchgang) bis es auf der ausgereschneten LEN ist -Die Zeile Anzeige gibt aus vom 2Text startziffer (1) und die Anzahl (COUNT)die mit hilfe von Len immer erhöht wird. Dannach wird noch dahinter geschrieben vom 1 Text von der Startposition (Count + 1), als anzahl wir der wert von LEN benutzt. bis dann Sir Gauss |
||
Cedric30003 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
SO, habe jetzt erstmal Grundgerüst gebaut:
Code: [AUSKLAPPEN] Graphics3D 800,600,32,2 ;Aufloesung,Bildtiefe,GraphicsMode(Fenster-/Vollbildmouds usw.)
SetBuffer BackBuffer() ;Erstellt einen BackBuffer, welcher weiter unten mit durch Flip mit dem Front-Buffer getauscht wird ;Variablen ;Dateinen Laden (GFX usw.) ;Functions While Not KeyHit (1) ;Schleife, welche solang durchläuft bis Key(1) [bzw. ESC] betätigt wird ;Das Hier ist die Hauptschleife ;Alles was hier steht wiederholt sich, bis ESC gedrückt wird! Flip ;Tauscht Front und BackBuffer aus Wend ;wiederholt die Schleife End ;Beendet das Programm (was für ein Wunder :D) So, das ist der aktuelle Stand, von uns Code: [AUSKLAPPEN] Global Text1$="Hallihallo"
Global Text2$="Da bin ich" Global Laengeres%=0 Global Timer = MilliSecs() +100 Global Count = 0 MilliSecs () If Len(Text1)>Len(Text2) Then Laengeres=Len(Text1) Else Laengeres=Len(Text2) End If While Not KeyHit (1) MilliSecs() If Count <> Laengeres Then ;Wenn Count ungleich mit Laengeres ist dann: If Timer < MilliSecs() Then ;Sollte der Timer kleiner als MS sein dann : Count = Count + 1 ;Wird Count immer um eins erhöht Timer = MilliSecs() + 100 ;Der Timer wird auf MS + 100 gestelt. Cls ;Löschen EndIf EndIf anzeige$ = Mid(Text2,1,Count)+Mid(Text1,Count+1,Laengeres) ;Auslesen der Len bzw Count werte! Text 0,0, anzeige$ ;Text gibt bei 0,0, Variable ANZEIGE AUS! |Text wird wieder angezeigt DebugLog "Anzeige: " + Anzeige DebugLog "Timer: " + Timer Flip Wend End EDIT: So jetzt geht´s bisschen rumtesten bewirkt doch wahre Wundern ![]() |
||
Windows 7 Enterprise (x64) | AMD Athlon II X4 620 (4x2,61GHz) | 8GB RAM | nVIDIA GeForce 9500GT (1024MB) |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich muss Sir Gauss an einer Stelle entscheidend widersprechen:
Gewöhnt euch bitte bitte bitte nicht an alle Variablen Global zu definieren. Damit zerstört man jegliche Datenkapselung, und diese ist ein mächtiges Instrument. Globale sollte man im Gegenteil nur dann verwenden, wenn es anders nicht möglich ist eine sinnvolle Datenweitergabe vom Hauptprogramm an die Funktionen darin (und umgekehrt) zu realisieren. Dies ist aber nur extremst selten der Fall. |
||
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 |
![]() |
PhillipB |
![]() Antworten mit Zitat ![]() |
---|---|---|
Vielen Dank an alle besonders an Sir Gauss der III.
Schönen Abend ![]() |
||
![]() |
The Shark |
![]() Antworten mit Zitat ![]() |
---|---|---|
1. Wie wäre es, wenn du jetzt noch beide Programme zusammenführst
2. Schau dir mal an - Wann der Text gezeichnet wird - Inwiefern der der Timer die Countvariable beeinflusst EDIT: Zu spät |
||
Cedric30003 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Welche beiden Progs zusammenfügen??
Das eine ist nur die Muster_Main, welche keine Funtionen hat, also nichts kann, das andere ist das Textwechselprogramm |
||
Windows 7 Enterprise (x64) | AMD Athlon II X4 620 (4x2,61GHz) | 8GB RAM | nVIDIA GeForce 9500GT (1024MB) |
![]() |
The Shark |
![]() Antworten mit Zitat ![]() |
---|---|---|
Eben, das Textwechselprogramm hat noch immer keinen Kopf und ist in seiner jetzigen Form zumindest für BlitzPlus-Nutzer nicht ausführbar.
Du hast jetzt eine Vorlage geschrieben, benutze sie doch auch ![]() |
||
![]() |
Sir Gauss der III |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] Graphics3D 800,600,32,2 ;Aufloesung,Bildtiefe,GraphicsMode(Fenster-/Vollbildmouds usw.)
SetBuffer BackBuffer() ;Erstellt einen BackBuffer, welcher weiter unten mit durch Flip mit dem Front-Buffer getauscht wird ;Variablen Local Timer ;Dateinen Laden (GFX usw.) timer=CreateTimer(60) While Not KeyHit (1) ;Schleife, welche solang durchläuft bis Key(1) [bzw. ESC] betätigt wird ;Das Hier ist die Hauptschleife ;Alles was hier steht wiederholt sich, bis ESC gedrückt wird! Flip 0 ;Tauscht Front und BackBuffer aus [b]WaitTimer (timer)[/b] Wend ;wiederholt die Schleife End ;Beendet das Programm (was für ein Wunder :D) ;Functions Schaut recht doch ganz ordentlich aus. drei kleine Verbesserungen: 1. Einen Timer erstellt. den benötigt man in so ziemlich jedem Programm. und wenn mal nicht, kann man ihn schnell löschen 2. Flip 0 3. Functionen nach unten. Hat den Grund, dass das HP, meist recht kurz, am Anfang steht. Eben so wie die Variablen etc. Nun zu eurem Programm. 1. "Fehler" wurde ja schon entdeckt, das Waitkey. da hast du recht, es ist föllig unnötig. könnte man aber drinlassen, und dann halt paarmal Taste drücken. gut, nun zu einem anderen, kleineren Problem. schau dir mal dein Grundprogramm an, und dann dein Testprogramm. ein kleiner Hinweis: Flip (nicht ob Flip 0, das ist hier gerade egal. Aber überleg den Befehl noch mal. was macht er?) Das als erstes. Dann: Der Hinweis mit den Millisecs ist sicher ein sehr wichtiger. schau also die Zeilen an: 1. Alles, was direkt mit Millisec zu tun hat (also wo Millisec oder Timer verwendet wird) Es kann manchmal sein, dass man (wie in meinem Beispielcode) man einer Variablen einen Wert an einer falschen Stelle zuweist oder einfach doppelt nutzt 2. Prüfe, unter welchen Bedingungen Timer verändert wird. Was muss alles sein, damit die Zeile Code: [AUSKLAPPEN] Timer=Millisecs()+10 aufgerufen wird? am besten gehst du hier mit stift und Papier los. beginne bei der 1. Bedingung, dann der zweiten usw. Überspringe keinen Befehl. erst wenn du bei einem endif, until oder wend ankommst streichst du die entsprechende Bedingung von deinem Blatt. wenn du dann bei Code: [AUSKLAPPEN] Timer=Millisecs()+10 angekommen bist, schau nach was alles zutreffen muss damit es soweit kommt.
vlt. ist hier ein Fehler. Gut, soweit zur Millisecs()problematik Prüf nachmals alle! wichtigen Variablen. also auch Count, Laengeres und Timer. schreibe dabei nicht nur Code: [AUSKLAPPEN] Debuglog n
debuglog variable debuglog b sondern viel eher (dient der Übersichtlichkeit beim prüfen): Code: [AUSKLAPPEN] Debuglog "Variable n: "+n
debuglog "variable variable: "+variable debuglog "variable b: "+b Tipp: ertelle doch auch mal eine Variable, die dier im Debugger anzeigt wie oft eine Function aufgerufen wird. Code: [AUSKLAPPEN] Global rundewhile
Global rundeif1 .... While Not KeyHit(1) rundewhile=rundewhile+1 If n=0 Then rundeif1=rundeif1+1 EndIf DebugLog "Programmdurchlauf gesammt: "+rundewhile DebugLog "If-Runden: "+rundeif1 Wend ..... Ich würd mal sagen, das hilf dir deutlich weiter. Jetzt also 1. Vergleiche Grundprogramm und Testprogramm (Tipp: Flip) 2. Timerproblem verfolgen (da muss ja was dran sein wenn er nicht mehr als 10 sein darf) 3. ALLE Variablen prüfen (am besten in jeder Schleife mindestens 1 mal) 4. Schleifendurchgänge zählen und im debugger ausgeben Edit: Hm... da hab ich mir wohl eine Falsche Struktur mit dem Global angewöhnt. den Teil dann mal einfach ignorieren. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group