BPS #9: Input-Funktion - Auswertung

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Xeres

Moderator

Betreff: BPS #9: Input-Funktion - Auswertung

BeitragSo, Jun 26, 2011 14:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Alle sind gespannt auf die Auswertung - also warten wir nicht bis zum Abend.

Das war die Aufgabe

Postet hier eure Ergebnisse, Codes, Gedanken. Lernt von den anderen, seht euch deren Quelltext an und versucht euren eigenen zu verbessern.

Diskussion
Postet zu euren Codes stets eine kurze Erklärung mit euren Gedanken in denen ihr simpel gesagt die Frage "Wieso habe ich XY auf diese Art gelöst?" beantwortet. Beiträge, die nur den Code enthalten werden wir aus dem Thread entfernen.

Nächste Aufgabe
In zwei Wochen, wird die Musterlösung nach editiert und die nächste Aufgabe eingestellt.

Viel Spaß & viel Erfolg!

Musterlösung:
BlitzMax: [AUSKLAPPEN]
SuperStrict 'Aktivieren um saubere Programmierung zu erzwingen
AppTitle = "Input" 'Fenstertitel erstellen
Graphics 600, 300 'Fenstergröße festlegen
'Deklaration der Eingabevariable. Hier Lokal, da durch die Übergabe
'der Variable als Funktionsparameter keine Globale gebraucht wird.
Local Eingabe:String
Local Timer:TTimer = CreateTimer(60) 'Erstellt einen Timer zur Verhinderung hoher Prozessorlast

Repeat 'Haupt-Schleife
Cls 'Löschen des Bufferinhalts
Eingabe = NewInput(Eingabe) 'Aufruf der eigenen Input-Funktion
DrawText Eingabe + "|", 0, 10 'Ausgabe inklusive Cursor-Symbol
TRect.UpdateAll() 'ruft den Beweis, dass das Programm nicht angehalten wird, (siehe unten) auf.
Flip 0'Tauscht der Buffer
WaitTimer(Timer) 'Wartet auf den Timer
Until KeyDown(KEY_ESCAPE) Or AppTerminate() 'Ende der Hauptschleife mit ESC
End

'Funktionsteil
Function NewInput:String(currentText:String) 'Übergabe des Parameters
'Es ist notwendig die bereits erfolgte Eingabe zu übergeben, damit
'sie ergänzt oder gelöscht werden kann.
Local localChar:Byte = GetChar() 'Deklaration und gleichzeitiger Abruf der Tasteneingabe
Local length:Short 'Deklaration deer Variable fur die Zeichenanzahl
If (localChar > 0) And (localChar <> 8 ) Then 'Überprüft ob es sich um eine gültige Eingabe handelt
currentText = currentText + Chr(localChar) 'und fügt die Eingabe dem Text hinzu.
ElseIf localChar = 8 Then 'bei Eingabe von BackSpace
length = Len(currentText) 'wird die Zeichenanzahl ermittelt
If length > 0 Then 'und wenn bereits etwas eingegeben worden ist
currentText = Left(currentText, length - 1) 'wird das letzte Zeichen entfernt.
EndIf
EndIf
Return currentText 'Schließlich wird der Text zurück gegeben.
End Function

'############################################################################################
'Code ab hier dient nur zum Beweis, dass das Programm weiterläuft, also einfach ignorieren :)

Type TRect
Global LRect:TList
Const GFX:Short = 600, GFY:Short = 300
Const RectSize:Byte = 20

Field x:Float
Field y:Float
Field speedX:Float
Field speedY:Float

Method New()
If LRect = Null Then
LRect:TList = New TList
EndIf
LRect.Addlast(Self)
EndMethod

Function Create:TRect(_x:Float, _y:Float)
Local R:TRect = New TRect
R.x:Float = _x
R.y:Float = _y
R.RandomSpeed()
Return R
EndFunction

Method Update()
x = x + speedX
y = y + speedY
If x < 0 Or x > GFX Then
speedX = speedX * -1
EndIf
If y < 0 Or y > GFY Then
speedY = speedY * -1
EndIf
EndMethod

Method Draw()
DrawRect x, y, RectSize, RectSize
EndMethod

Method setSpeed(_sx:Float, _sy:Float)
speedX:Float = _sx
speedY:Float = _sy
EndMethod

Method getSpeedX:Float()
Return speedX
EndMethod

Method getSpeedY:Float()
Return speedY
EndMethod

Function UpdateAll()
Local i:Short = 0
Local K_BACKSPACE:Byte
Local K_R:Byte

If KeyHit(KEY_R) Then K_R:Byte = True
If KeyHit(KEY_BACKSPACE) And LRect <> Null Then
K_BACKSPACE:Byte = True
If LRect.IsEmpty() = True Then
K_BACKSPACE = False
EndIf
EndIf

If LRect <> Null Then

For Local R:TRect = EachIn LRect
i = i + 1
R.Update()
R.Draw()
If K_BACKSPACE = True Then
LRect.RemoveFirst()
K_BACKSPACE = False
EndIf
Next
EndIf
If i = 1 Then
Local Text:String = "Ich beweise, dass das Programm weiterlaeuft"
DrawText Text, ((GFX - TextWidth(Text)) / 2), (GFY / 2 + 10)
ElseIf i > 1 Then
Local Text:String = "Wir beweisen, dass das Programm weiterlaeuft"
DrawText Text, (GFX - TextWidth(Text)) / 2, GFY / 2 + 10
EndIf
If i < 10 Then
Local Text:String = "Zum Erstellen von Rechtecken bitte 'R' druecken"
DrawText Text, (GFX - TextWidth(Text)) / 2, GFY / 2
If K_R = True Then
Create(Rand(0, GFX), Rand(0, GFY - RectSize))
EndIf
EndIf
K_R = False
EndFunction

Method RandomSpeed()
setSpeed(Rnd(-3.5,3.5), Rnd(-3.5,3.5))
EndMethod

EndType
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
  • Zuletzt bearbeitet von Xeres am So, Jul 10, 2011 20:04, insgesamt einmal bearbeitet

Ana

BeitragSo, Jun 26, 2011 15:27
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMax: [AUSKLAPPEN]
Global MausX:Int,MausY:Int,Maus1:Byte,Maus2:Byte,Maus3:Byte,MausXSpeed:Int,MausySpeed:Int
Global MausZSpeed:Float,Textfieldlist:TList = New TList
Rem Diese Funciton erstellt ein Gebiet, in dem der Übergebene Text mit Zeilenumbrüchen angegeben werden kann. Der Text wird automatisch umgebrochen oder bei jedem \.
end rem

Function Textarea (t$,pX:Int,pY:Int,w:Int,h:Int)
Local ny:Int,nx:Int,i:Int,lt:Int,Zeilenumbruch:Int,Zeilenumbruch2:Int,nt$,zeilen:Int,j:Int
t = t + " "
nx = pX
ny = pY
zeilen = 0
nt$ = ""
i = 0
lt = Len(t$)
While Len(t$) > 0
i = i + 1
Zeilenumbruch = Instr (t$,"\")
Zeilenumbruch2 = Instr (t$,Chr(10))
If i = zeilenumbruch Or i = Zeilenumbruch2 Then
DrawText nt$,nx, ny
t$ = Mid$(t$, i + 1, -1)
i = 0
nt$ = ""
ny = ny + 1.2 * TextHeight(t$) * 0.8
zeilen = zeilen + 1
If (zeilen + 1) * (1.2 * TextHeight(t$) * 0.8) => h Then Exit
ElseIf TextWidth(Left$(t$, i)) < w And i <= Len(t$) Then
nt$ = Left$(t$, i)
Else
For j = Len(nt$) To 1 Step -1
If Mid$(nt$, j, 1) = " " Then
nt$ = Left$(nt$, j)
i = j + 1
Exit
End If
Next

DrawText nt$,nx, ny
t$ = Mid$(t$, i, -1)
i = 0
nt$ = ""
ny = ny + 1.2 * TextHeight(t$) * 0.8
zeilen = zeilen + 1
If (zeilen + 1) * (1.2 * TextHeight(t$) * 0.8) => h Then Exit
End If
Wend
End Function

Type Textfield
Field x:Int,y:Int
Field value:String
Field Beschriftung:String
Field Pos:Int
Field Ctimer:Int
Field Cu:Byte

Method Draw:Textfield(S:Textfield)
Local tx:Int = GraphicsWidth()*(1/8),ty:Int = GraphicsHeight()/2
If Self <> s
SetColor 125,125,125
Else
SetColor 125,125,255
EndIf
DrawRect x,y,TextWidth(Beschriftung),TextHeight(Beschriftung)
SetColor 255,255,255
text2(beschriftung + ": " + value,x,y)
If maus1 And mouseoverlape(x,y,TextWidth(Beschriftung + ": " ) +5,TextHeight(Beschriftung )) Then Return Self
If s = Self
If MilliSecs() > Ctimer + 125
Cu = (Cu + 1)Mod 2
Ctimer = MilliSecs()
EndIf
Local Cursor:String =" "
If Cu Then Cursor = "|"
Local va:String = Left(value,pos) + Cursor + Right(value,Len(value) - pos)
Textarea (beschriftung + ": " + va,tx,ty,GraphicsWidth() - tx * 2,GraphicsHeight() - ty)
EndIf
Return s
End Method


Method Selected()
Local v:Int = GetChar()
If KeyHit(KEY_LEFT)
If pos > 0 Then pos :- 1
ElseIf KeyHit(KEY_RIGHT)
If pos < Len(value) Then pos :+ 1
ElseIf v = 0
Return
ElseIf v = 8
value = Left(value,pos-1) + Right(value,Len(value) - pos)
If pos > 0 Then pos:-1
Else
value = Left(value,pos) + Chr(v) + Right(value,Len(value) - pos)
pos :+ 1
EndIf
End Method

Method GetValue:String()
Return Value
End Method
End Type

Rem Erstellt ein Textfield
End Rem

Function Create_Textfield:textfield(B:String,V:String,x:Int,y:Int)
Local Tf:Textfield = New textfield
tf.value = v
tf.x = x
tf.y = y
tf.beschriftung = b
tf.pos = Len(v)
ListAddLast(Textfieldlist,tf)
Return tf
End Function

Rem Muss in jedem Schleifenaufruf vorkommen um die Textfelder nutzen zukönnen.
End Rem

Function TextfieldUpdate()
Global S:Textfield
For Local tf:Textfield = EachIn Textfieldlist
s = tf.draw(s)
Next
If s <> Null Then s.selected()
End Function

Function Text2(t$,x:Int,y:Int,w:Int = 0,h:Int = 0)
If h = True Then x = x - TextWidth(t)/2
If w = True Then y = y - TextHeight(t)/2
DrawText t,x,y
End Function

Function MouseUpdate()
MausX = MouseX()
MausY = MouseY()
Maus1 = MouseHit(1)
Maus2 = MouseHit(2)
Maus3 = MouseHit(3)
MausXSpeed = MouseXSpeed()
MausYSpeed = MouseYSpeed()
MausZSpeed = MouseZSpeed()
End Function

Rem
bbdoc: Überprüft, ob die Maus in dem Angegeben Bereich ist
return: True falls ja, False falls nicht
about:
Gibt zurück, ob die Maus sich in dem Rechteck mit den Koordinaten X/Y und der Breite W und der Höhe H befindet.
Benötigt MausUpdate() um zu funktionieren.
End Rem

Function Mouseoverlape:Byte(x:Int,y:Int,w:Int,h:Int)
If Mausx >= x And mausx <= x + w And mausy >= y And mausy <= y + h Then Return True
Return False
End Function

Graphics 800,600
Create_Textfield:textfield("Feld1","Inhalt1",100,100)
Create_Textfield:textfield("Feld2","Inhalt2",100,200)

Repeat
Cls
MouseUpdate()
TextfieldUpdate()
Flip
Until AppTerminate()


Edit: So nun ist aber alles drin und ein Testprogramm mit dabei
Edit: Nun sollte es eventuell auch funktionieren wenn man weiter als der Text lang ist scrollt.
Don't only practice your art,
but force your way into its secrets,
for it and knowledge
can raise human to divine
  • Zuletzt bearbeitet von Ana am Mi, Jun 29, 2011 21:18, insgesamt 7-mal bearbeitet
 

PhillipK

BeitragSo, Jun 26, 2011 16:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Ana!

Ich weiß nicht, ob es an mir liegt, allerdings kann ich dein Programm nicht Testen.
Grund:
'Identifier "test2" not found' - in line 63.
Hier die zeile: BlitzMax: [AUSKLAPPEN]
		text2(beschriftung + ": " + value,x,y)


[Edit:] Eine weitere funktion fehlt: mouseoverlape(x,y,TextWidth(Beschriftung + ": " )
Direkt eine Zeile darunter :3
[/edit]

Hast du vergessen, eine ausgelagerte funktion beizufügen? :3

Ausserdem ist ganz unten - bei "Function TextfieldUpdate()" ein 'End Rem' zu wenig -
die komplette funktion ist ge-rem-t ^^

Lg, Phillipk

Xeres

Moderator

BeitragDi, Jun 28, 2011 15:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Etwas verbuggt, Ana. Manche Zeichen erscheinen hinter dem Cursor und lassen sich nicht wieder löschen. Etwas kleines im Hintergrund, das zeigt, dass das Programm nicht angehalten wird, wäre auch noch nett.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Ana

BeitragMi, Jun 29, 2011 21:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Xeres hat Folgendes geschrieben:
Etwas kleines im Hintergrund, das zeigt, dass das Programm nicht angehalten wird, wäre auch noch nett.


Dafür ist doch der Cursor?

Der Code ist nun um ein BlitzMax: [AUSKLAPPEN]
If pos > 0 
reicher und sollte nun auch funktionieren wenn man außerhalb seiner Grenzen rum gescrollt.... was vermutlich dein bug ist oder?

Ihr seid so negativ und anspruchsvoll, kein wunder das ich hier die Einzige bin die was "inhaltliches" gepostet hat Wink
Don't only practice your art,
but force your way into its secrets,
for it and knowledge
can raise human to divine

Xeres

Moderator

BeitragMi, Jun 29, 2011 21:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Also sooo anspruchsvoll bin ich nicht - deine Lösung ist schon gut elaboriert. Es geht halt nur immer etwas besser. Wink
Noch ist ja genug Zeit um "pünktlich" mit zu machen - wer sich Inspiration holen will, ist herzlich eingeladen! Darum gibt es ja zwei Wochen Zeit.
Ich würde auch gerne Lob an weitere Teilnehmer verteilen. Einen Keks für die kürzeste Umsetzung!
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Ana

BeitragMi, Jun 29, 2011 23:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich find allgemein die Haltung nicht gerade optimal und ein paar andere Dinge laufen auch eher so, das es nicht wirklich hilfreich ist.

1.Teilnehmer
Arrow hazumu-kun
Arrow totensturm
Arrow Ana

Bei Totensturm weiß ich es nicht, hazumu-kun würde ich unterstellen das er es nicht braucht, und ich hab meinen Code so oder so geschrieben, und dachte bevor da gar kein Beitrag steht, kopier ich das eben. Schon mal also irgendwie eine schlecht Anfängerausbeute.

2. Codeinhalte

Gerade wenn ich selbst nicht so gute Codes schreiben könnte, würde es mich doch eher einschüchtern wenn hier viel zu komplexe und übers Ziel hinaus schießende Codes gepostet werden, die noch viele coole Sachen können, die nicht gefordert sind. Da würde mir mein kleiner schlichter, eventuell unübersichtlich oder zu lange Code doch unangenehm sein.

3. Feedback

"Etwas verbuggt, Ana."
"Hast du vergessen,..."
"Eine weitere funktion fehlt"
"Ich sehe nur einen leeren, blinkenden Kasten..."
"Fehlt eine Absicherung von Backspace gegen..."

Ha da ist man doch motiviert, sich direkt in die nächste Aufgabe zu stürtzen! Oh moment eigentlich so gar nicht ...
Alles berechtigt ohne Zweifel, doch meiner Unterricht und Trainingserfahrung nach ist es gerade am Anfang auch wichtig, dass man auch mal was positves sagt. Für den Fortschritt ist es essenziel, das man nicht nur die Fehler ausbügelt, sondern gerade auch die Motivation zum weitermachen aufrecht erhält.

Also vielleicht auch mal einfach ein "das war eine gute Idee", oder ein "ja so kann man das aufjedenfall auch machen" oder ähnliches über Tasten bekommen, vielleicht gibs dann ja auch "wirkliche" Anfänger.

Also das mein ich nun allgemeiner und weil ich den BPS eigentlich wirklich gut finde und auch schätze wie viel arbeit sich da einige gemacht haben und nicht, weil ich beleidigt bin weil du meinst da ist ein Bug drin, stimmt ja auch und das würde ganz anders klingen =D

so richtig passt das hier nicht rein aber in ermangelung einer besseren idee wo es hin könnte ...
Don't only practice your art,
but force your way into its secrets,
for it and knowledge
can raise human to divine

Xeres

Moderator

BeitragDo, Jun 30, 2011 9:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh, ich kann deine Einwände gut verstehen.
Sollen wir Erfahrene User ausschließen? Dann haben wir womöglich 0 Teilnehmer, weil die wenigen Anfänger noch nicht so im Forum aktiv sind um die BPS zu kennen, der Teil der die Aufgabe gelesen hat, hat keine Lust (und programmiert lieber eigenes) und der letzte Teil mag nicht ganz allein in der Öffentlichkeit stehen.
Von den 200 Aktiven Mitgliedern sind maximal 6-8 bei der BlitzCodeCompo dabei und Abstimmen tun nie mehr als ein viertel. Ein Großteil bleibt immer der stille Beobachter - darum hoffe ich auch, dass wir mehr erreichen als es den Anschein hat.

Okay, positiveres Feedback, kapiert! Es darf übrigens jeder Feedback geben - ja auch du (der das gerade liest). Ich bin im Prinzip nur dafür da, die Themen zu posten - wenn sich mehr Leute um eine freundliche Einschätzung der Beiträge bemühten ("Sieht gut aus! Sehe keine Probleme.") könnte das auch nicht schaden.

Verbesserungsvorschläge zur BPS sind gern gesehen - danke Ana!
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

PhillipK

BeitragDo, Jun 30, 2011 12:05
Antworten mit Zitat
Benutzer-Profile anzeigen
@Xeres:
Ich würde gerne Testen, allerdings habe ich nur BlitzMax vorrätig :> Und nur ein Programm alleine möchte ich nicht austesten - wenn dann möchte ich vergleichen.

Ich habe übrigends auch ein programm hierzu angefertigt, mal so schnell wie es nur ging, total unkommentiert und einzig ergebnisorientiert.
Mit dem Fazit, das ichs besser sein lasse Very Happy Hochstellen werde ich es nicht, ich glaube das ist zusammen mit meinen Temporären dateien von BLIde untergegangen.
zum BCC versuche ich mich allerdings, sobald mir die zündende idee fürs spielelement gekommen ist^^

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group