Problem mit Eingabefeld?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

M0rgenstern

Betreff: Problem mit Eingabefeld?

BeitragDi, Mai 18, 2010 16:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Leute.
Ich hab ein Problem.
Ich bin dabei eine kleine GUI zu programmieren damit mein Spiel besser aussieht.
Die Hauptschleife ist mit select/case unterteilt. Beim Übergang vom Menü zum Spiel selbst soll ein Eingabefeld angezeigt werden, in welchem der Spielername angezeigt werden soll, bzw eingegeben werden soll.
Aber diese ganze Stelle funktioniert nicht ganz.
Wenn man enter drückt sollte man zum Spiel wechseln, aber das geht gar nicht. Und die Eingabe wird auch nicht richtig angezeigt.

Hier ist der Type für das Eingabefeld:

BlitzMax: [AUSKLAPPEN]
Type TEditField
Global tlAllEditFields:TList = New TList
Field iX:Int, iY:Int
Field tmImage:TMyImage
Field sInput:String

Function Create:TEditField(px:Int, py:Int, pimage:TImage)
Local EditField:TEditField = New TEditField
editfield.iX = px
editfield.iY = py
editfield.tmImage = TMyImage.Create(pimage)
Return editfield
EndFunction

Method Draw()
' DrawImage(tmimage.tiimage, ix, iy)
DrawText(sinput, ix + 20, iy + 20)
End Method

Method Destroy()
tlalleditfields.remove(Self)
End Method

Method New()
tlalleditfields.addlast(Self)
End Method

End Type


Und hier ist die Stelle in der Hauptschleife:

BlitzMax: [AUSKLAPPEN]
Case iGameStart
FlushKeys
Local c:Int
Local w:String
'Local word:String

' Repeat
' Cls
c = GetChar()
If (c <> 13) Then
If c <> 8 Then
w = Chr(c)
EndIf
EndIf
' DrawText("Bitte Spielernamen eingeben: " + word, 100, 100)
' Flip
' Until KeyHit(KEY_ENTER)

NameBox.sInput = NameBox.sInput + w
NameBox.Draw()

DebugLog NameBox.sInput

If KeyHit(key_enter) Then
Player1.sName = NameBox.sInput
iLevelnumber = 0

NameBox.sInput = ""

Player1.iLevel = 1
Player1.iScore = 0

For Local Item:Titem = EachIn Titem.tlallitems
Item.destroy()
Next
For Local Shoot:TShoot = EachIn TShoot.tlallshoots
Shoot.destroy()
Next
For Local Part:TParticle = EachIn TParticle.tlAllParticles
part.destroy()
Next
For Local Enemy:TEnemy = EachIn TEnemy.tlallenemies
Enemy.destroy()
Next
Player1.ikadenz = Player1.iOldKadenz
Player1.fspeedx = Player1.fOldSpeedx

iGameState = iGamePlay '!
iLastWave = MilliSecs()
End If


Also der müsste ja nach einem Druck auf die Entertaste zumindest zum Spiel übergehen. Aber selbst das passiert nicht.

Und wenn ich hier folgendes Debuglog einfüge:
BlitzMax: [AUSKLAPPEN]
NameBox.sInput = NameBox.sInput + w
NameBox.Draw()

DebugLog NameBox.sInput

DebugLog NameBox.sInput


Dann sieht mein Debuglog folgendermaßen aus:
Zitat:
DebugLog:DebugLog:DebugLog:DebugLog:DebugLog:DebugLog:DebugLog:DebugLog:DebugLog:DebugLog: DebugLog:DebugLog:DebugLog:DebugLog:DebugLog:DebugLog:DebugLog:DebugLog:DebugLog:DebugL...

EDIT durch BladeRunner: Debuglogs gekürzt.
Ich verstehs echt nicht.
Vor allem dass er die Entertaste auch nicht annimmt.

Hoffe, ihr könnt mir helfen.

Lg, M0rgenstern.

mpmxyz

Betreff: *HUST*

BeitragDi, Mai 18, 2010 17:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Schuldige ist eindeutig zu bestimmen:
BlitzMax: [AUSKLAPPEN]
FlushKeys '*HUST*
'[...]
c = GetChar()
'[...]
If KeyHit(key_enter) Then

Kürze bitte deine DebugLog-Reihe!
Die zerschießt die Forendarstellung.
(Sind bei dir wirklich keine Zeilenumbrüche vorhanden?)
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Midimaster

BeitragDi, Mai 18, 2010 20:29
Antworten mit Zitat
Benutzer-Profile anzeigen
müsste er nicht statt...

BlitzMax: [AUSKLAPPEN]
If KeyHit(key_enter) Then

...eigentlich...
BlitzMax: [AUSKLAPPEN]
If C=13 Then

...schreiben?

Die Tastatur ist ja schon abgefragt und das Ergebnis liegt in der Variablen c%.

@morgenstern

da gibt es ein Kapitel in meinem Timer-Tutorial, das sich genau mit dem asynchronen Erfassen eines Spielernames beschäftigt. Vielleicht nutzt es dir was?

Kapitel IV: https://www.blitzforum.de/foru...555#364555

mpmxyz

BeitragDi, Mai 18, 2010 20:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, das ist schon so in Ordnung, wie er es gemacht hat.
GetChar und die Key...-Funktionen sind in diesem Aspekt voneinander getrennt.
"FlushKeys" setzt aber beide zurück.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

M0rgenstern

BeitragDi, Mai 18, 2010 21:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey.
Vielen Dank mpmxyz.
Das wars. Doofer Fehler, sorry.

@Midimaster: Dankeschön. Aber dein Tutorial ist eher für ein Eingabefeld geeignet. Bei mir läuft das über Types. Finde ich angenehmer.

@mpmxyz:
Es gibt schon Zeilenumbrüche in meinem Debuglog Fenster. Wenn die Fenstergröße erreicht wird. Nach 13 "Debuglog:" fängt dann eine neue Zeile an.
Ich versteh nur nicht ganz warum.
Selbst jetzt zeigt er nichts an außer das was ich oben schon geschrieben habe.
Der müsste doch eigentlich den Stringinhalt anzeigen.

EDIT:
Sorry, aber ich hab irgendwie ein Problem damit das letzte Zeichen zu löschen, wenn man Backspace drückt.
Ich hab schon im Forum gesucht und was gefunden. Aber wenn ich genau das mache, dann funktioniert es nicht.
Ich mache das so:

BlitzMax: [AUSKLAPPEN]
c = GetChar()
If (c <> 13) Then
If c <> 8 Then
w = Chr(c)
ElseIf c = 8 Then
NameBox.sInput = Left(NameBox.sInput, NameBox.sInput.Length - 1)
EndIf
EndIf


Das funktioniert auch nicht, wenn ich stattdessen hinter das Komma Len(Namebox.sInput)-1 schreibe.

Vielen Dank.

Lg, M0rgenstern

Midimaster

BeitragMi, Mai 19, 2010 1:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Ach, MOrgenstern....

wenn du nur nicht so beratungsresistent wärst...

Deine Eingaberoutine (ab "iGameStart") hat mit Types so wenig zu tun wie dieses Wetter mit Sommer! Rolling Eyes Das Tutorial würde dir bei den Problemen, die du gerade hast optimal helfen. Egal ob die Variable ein String (wie im Tutorial) oder ein Type-String (wie bei dir) ist, gilt doch für das Behandeln der GETCHAR() das Gleiche.

Aber nachdem du das Tutorial nicht sehen willst, hier ein Ansatz, der dich selber drauf bringen wird:

BlitzMax: [AUSKLAPPEN]
Graphics 800,600
Global sInput$ = ""
Repeat
Cls
c = GetChar()
Print c
If (c <> 13) Then
If c <> 8 Then
Print "dazu"
w$ = Chr(c)
sInput$ = sInput + w
ElseIf c = 8 Then
Print "weg"
sInput$ = Left(sInput, Len(sInput) - 1)
EndIf
EndIf
DrawText "String: " + sinput,100,100
DrawText "Stringlänge " + Len(sinput),100,200
Flip 0
Delay 100
Forever

M0rgenstern

BeitragMi, Mai 19, 2010 11:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey.

Sorry Midimaster.
Habs mir jetzt mal ganz genau durchgelesen (dein Tut).
Tut mir leid, aber hast schon recht. Hat auch geholfen. Weil mir was aufgefallen ist: Ich achte nicht darauf, ob die Eingabe = 0 ist. Mein String wird also immer länger, weil er trotzdem ein "Zeichen" angefügt hat.
Habe übrigens die Sache mit dem dem Blinken bei meinen Editfeldern eingefügt. Ist was feines.

Vielen Dank.
Und sorry nochmal.

Dein Tutorial ist übrigens gut geschrieben.

Lg, M0rgenstern

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group