Tasten sperren während Sprachausgabe

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Sereyanne

Betreff: Tasten sperren während Sprachausgabe

BeitragDi, März 18, 2008 14:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, da bin ich wieder. Sorry wenn ich nerve aber ich komm echt nicht weiter.
1. Wenn ich meinen NPC anlaber flackert der Text nur ganz kurz auf.
Code: [AUSKLAPPEN]
If Playerposx=2 And Playerposy=9 And KeyHit(reden) Then Reden()

Function Reden()
Text 500,200,"hallo"
End Function

Mit delay kann ich daran auch nichts ändern. Ich habe auch kein Tutorial dazu gefunden. Wer eins kennt, ich nehm jede Hilfe! (hauptssache auf deutsch Cool )

2. Wenn das denn mal klappen sollte, dass der Text länger da bleibt: Wie krieg ich das hin, dass man während der Textausgabe nicht herumlaufen kann?
meine idee:
Code: [AUSKLAPPEN]
Speak=0
If playerposx=2 And playerposy=9 And KeyHit(reden) Then Reden()

Function Reden()
Speak=1
If speak=1 Then Text 500,200,"hallo"
Delay 500
If KeyHit(reden) Then speak=0
If speak=0 Then
EndIf
End Function

naja oder so ähnlich. ist auch nur mehr ein ansatz. Wer bessere Vorschläge hat, immer her damit.
Danke für eure Mühe!!

Eingeproggt

BeitragDi, März 18, 2008 15:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Am einfachsten, aber auch am unflexibelsten wär ne eigene Warteschleife:

Code: [AUSKLAPPEN]
Function reden()
  Text 500,200,"hallo"
  Flip 0
  Repeat
    Delay 20
  Until KeyHit(reden)
End Function


mfG, Christoph.

Sereyanne

BeitragDi, März 18, 2008 15:21
Antworten mit Zitat
Benutzer-Profile anzeigen
unflexibel? na egal, jedenfalls klappt es.
danke schön!!!

jetzt wunder ich mich nur noch warum es nicht auch von anderen seiten aus geht.
Code: [AUSKLAPPEN]
If px=2 And py=9 And KeyHit(reden) Then Reden()
If px=3 And py=8 And KeyHit(reden) Then Reden()
If px=2 And py=7 And KeyHit(reden) Then Reden()

es klappt nur von unten!

skey-z

BeitragDi, März 18, 2008 15:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Eigen dir Types an, darin kannst du dann zum Beispiel den Text speichern und eine Wartezeit,

In jedem Schleifendurchlauf fragst du ab, ob die Wartezeit schon rum ist, oder ob der Text angezeigt und die Tasten gesperrt sind.

Die Tastensperre kannst du mit einer einfachen Variablen realisieren
Code: [AUSKLAPPEN]

if (not warten) then
   if taste_x
   if taste_y
   etc...
endif
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter

Eingeproggt

BeitragDi, März 18, 2008 16:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Und zum Problem mit den anderen Seiten: KeyHit() liefert nur einal ein Ergebnis zurück, danach ist es ausgelesen und der Benutzer muss erst wieder was reintippen, sprich die Taste erneut drücken.

Um dein Problem zu lösen:
Entweder
Code: [AUSKLAPPEN]
redetaste_gedrueckt=KeyHit(reden)
If px=2 And py=9 And redetaste_gedrueckt Then Reden()
If px=3 And py=8 And redetaste_gedrueckt Then Reden()
If px=2 And py=7 And redetaste_gedrueckt Then Reden()

Oder
Code: [AUSKLAPPEN]
If KeyHit(reden) Then
  If px=2 And py=9 Then Reden()
  If px=3 And py=8 Then Reden()
  If px=2 And py=7 Then Reden()
Endif


Viel Spass, Christoph.

Sereyanne

BeitragMi, März 19, 2008 9:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Herzlichen Dank. Jetzt klappt es Very Happy
Eine Frage noch: Die "unflexible"Warteschleife von Eingeproggt gefällt mir.
Wenn ich jetzt viel Text habe, taucht der ja (je nach angegebener Position) bei mir unter dem vorherigen Text auf. Wie kriege ich den ersten Text wieder weg? cls löscht mir gleich alles, gibt es sowas wie "clear text"?
Code: [AUSKLAPPEN]
Function Reden()
Text 200,200,"hallo"
   Flip 0
   Repeat
     Delay 20
   Until KeyHit(reden)
Text 200,230, "ich bin ein NPC"
   Flip 0
   Repeat
     Delay 20
   Until KeyHit(reden)
End Function

The_Nici

BeitragMi, März 19, 2008 15:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Alles nochmals Zeichnen.

Setze dich mit Schleifen und Bedinngungen auseinander.

BladeRunner

Moderator

BeitragMi, März 19, 2008 17:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Methode von Eingeproggt vergisst du besser ganz schnell, denn mit solchem Geflippe zersaut man sich ruckzuck den Bildschirmaufbau.


Wenn ein Text eine Zeitlang auf dem Bildschirm stehen soll benutze einen Millisecs-gestützten Timer, sprich eine Hilfszeitvariable die gesetzt wird solange der Text anzuzeigen sein soll.

extrem pseudo:
Code: [AUSKLAPPEN]
if zeit < millisecs then text ....


noch besser allerdings ist es wenn du dir einen extra Message-Type bastelst der das für alle anstehenden messages übernehmen kann:

Code: [AUSKLAPPEN]
type message
   field nachricht$
   field generiert
   field gueltigkeit
endtype


Wenn eine neue Message gebraucht wird, einfach ne neue Instanz erschaffen, generiert ist die erschaffungszeit, gueltigkeit die zeit die der Text zu sehen sein soll. Der type ist noch unvollständig, man kann zB noch Anzeigekoordinaten einbauen.
Irgendwo in deiner Hauptschleife machst du dann mit for...each alle Instanzen durch und zeichnest sie ein.
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

Sereyanne

BeitragDo, März 20, 2008 12:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde ja gern mit Types arbeiten. Nur irgendwie klappt das nicht so recht.
Wenn ich die Koordinaten für die einzusammelnden Gegenstände angebe....
Tja früher hat das mal geklappt. Jetzt seit ich eine scrollfunktion eingebaut habe werden die Items zwar angezeigt, "laufen" aber vor mir weg...
Ich kann jetzt keinen Code posten weil ich nicht an meinem Rechner bin.
Wie gebe ich die Koordinaten für die Items oder den Text in Types so an, dass sie trotz scolling nicht weglaufen?

The_Nici

BeitragDo, März 20, 2008 13:00
Antworten mit Zitat
Benutzer-Profile anzeigen
betrachte das x und y der gegenstände als die Scrollvariablen und nicht die Variablen auf dem Bildschirm.
Dann zeichnest du die Bilder an der Position Spieler_Scroll-Item_Scroll und freust dich.
Aber Achtung: Zeichne die Bilder nur wenn sie im sichtbaren Bereich sind

Sereyanne

BeitragDi, März 25, 2008 12:26
Antworten mit Zitat
Benutzer-Profile anzeigen
das kapier ich jetzt nicht.
Code: [AUSKLAPPEN]
;px Variable des Spielers
px = 10
;py Variable des Spielers
py = 9

;Types für die Items
Global anzahl=0
Global info.item

Type item
Field Pos_x
Field Pos_y
End Type

;Bewegung des Spielers
moving=False

    If KeyDown(200) Then
If map(px,py-1) = 8 Then
py = py - 1
scrolly = scrolly - 32
move = 1
moving=True
        richtung = HOCH
    EndIf
EndIf

;(analog für die anderen richtungen)

;ANIMATIONSLOGIK
    If timer <MilliSecs() ;alle 100 ms wird weiteranimiert
        timer = MilliSecs() +100 ;timer resetten
        frame = frame +1 ;frame weiterzählen
        frame = frame Mod 3 ;der modulo sorgt dafür das frame zwischen 0 und 3 bleibt
    EndIf

    If moving = False
        frame = 0 ;und wenn nix gedrückt wird wird auch nichts animiert.
    EndIf
   
   ;BEWEGUNG
   If movetimer < MilliSecs() Then
      movetimer = MilliSecs() +25 ;Bewegung findet nur maximal alle 25 ms statt, sprich: maximal 40 Pixel/Sekunde
      If moving = True Then ;und nur wenn auch noch bewegt werden soll
         Select richtung
            Case HOCH
               If y >0 Then y = y-1
            Case RUNTER
               If y < GraphicsHeight()-32 Then y = y +1
            Case LINKS
               If x >0 Then x = x-1
            Case RECHTS
               If x < GraphicsWidth()-32 Then x = x +1
         End Select
      EndIf
   EndIf

;OUTPUT
 ;wenn move = 1 dann übertrage x auf px*32
If move = 1 Then x = px * 32: y = py * 32:DrawImage Magier,x-scrollx,y-scrolly,richtung+frame: Delay 100

; Die Items malen
Function DrawItem()
   For info.item = Each item               
      DrawImage Item, info\Pos_x, info\Pos_y   
   Next
End Function

Function SetupLevel()
;Itemdaten lesen
Restore item_level1
Read anzahl   ;der erste Wert in der Dataschleife gibt die Anzahl der Items an
For i = 1 To anzahl      ;Zählt durch die einzelnen Einträge 
   info.item = New item   ;Neues Item erstellen
   Read x, y            ;Koordinaten lesen
   info\Pos_x = x         ;x und y Werte an dem Typ übergeben
   info\Pos_y = y
Next    
End Function

; Hier sind die Daten abgelegt, die zur Positionierung der Items notwendig sind - und die nicht funktionieren
.item_level1
Data 19
Data 32,94 ;oben links
Data 64,94
Data 96,94
Data 128,94
Data 160,94
Data 384,94 ;oben rechts
Data 416,94
Data 448,94
Data 480,94
Data 512,94
Data 32,320 ;unten links
Data 64,320
Data 96,320
Data 128,320
Data 160,320
Data 384,320 ;unten rechts
Data 416,320
Data 448,320
Data 480,320

wo soll ich jetzt die scroll postion ändern/angeben?

The_Nici

BeitragDi, März 25, 2008 17:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Dort wo du es zeichnest z.B.?

Wenn du mitm Spieler läufst, erhöht sich die Scrollvariable ja. Die Scrollvariable des Items aber nicht.
Nun kannst du die Scroll-Position des Spielers von der Scroll Position des Gegenstands abzählen, dann hast du die Entfernung vom Spieler. Dann zählst du zum Ergebnis die Hälfte der Screenlänge bzw Screenhöhe dazu, weil du ansonsten das verschoben hast.

Code: [AUSKLAPPEN]

DrawImage Item,item_scrollx-spieler_scrollx+GraphicsWidth/2(), item_scrolly-spieler_scrolly+Graphicsheight/2()


Etwa so oder so

Sereyanne

BeitragMi, Apr 02, 2008 14:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry. Ich hab es jetzt mehrmals ausprobiert mit allen möglichen (und unmöglichen) Codes. Entweder die Items bewegen sich gar nicht, oder sie laufen weg wenn ich den Spieler bewege.
Vielleicht könnte sich jemand mal meinen Code (weiter oben) ansehen und diesen korrigieren.

The_Nici

BeitragMi, Apr 02, 2008 16:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Entweder die Items bewegen sich gar nicht

Dachte das war die Idee?

Ich werd nachher einen Code eineditieren. Deinen werde ich sicher nicht korrigieren.

EDIT:

Code: [AUSKLAPPEN]

timer=CreateTimer(60)   ;Timer, damit es nicht 100% CPU raubt und auf allen PCs gleich schnell läuft.
Type item   ;Der Item-Type
   Field xpos   ;x-Position (Also Scrollvariable)
   Field ypos   ;y-Position (Also Scrollvariable)
End Type

Graphics 800,600,32,1
SetBuffer BackBuffer()

Global p_x   ;SpielerScroll
Global p_y   ;SpielerScroll

i.item=New item   ;Neues Item erstellen
i\xpos=200
i\ypos=100

While Not KeyDown(1)
   ;Bewegen
   If KeyDown(203) Then p_x=p_x-2
   If KeyDown(205) Then p_x=p_x+2
   If KeyDown(200) Then p_y=p_y-2
   If KeyDown(208) Then p_y=p_y+2
   ;Spieler zeichnen
   Oval 400-16,300-16,32,32
   ;Jedes Item durchgehen. (Each=engl. Jedes)
   For i.item=Each item
      ;Gut. Ich Prüfe jetzt ob das Item im Bild ist. Dazu guck ich ob es grösser -32, also noch was zu sehen, ist, oder so halt ja...^^ Dazu Prüfe ich auch ob es nicht über
      ;GraphicsWidth() hinausgeht oder GraphicsHeight(). Diese Funktionen geben die Breite und Höhe der aktuellen Auflösung im Programm an.
      If i\xpos-p_x+GraphicsWidth()/2>-32 And i\ypos-p_y+GraphicsHeight()/2>-32 And i\xpos-p_x+GraphicsWidth()/2<GraphicsWidth() And i\ypos-p_y+GraphicsHeight()/2<GraphicsWidth()
         Rect i\xpos-p_x+GraphicsWidth()/2,i\ypos-p_y+GraphicsHeight()/2,32,32,1      ;Klotz zeichnen
      EndIf
   Next
   Flip
   Cls
   WaitTimer(timer)   ;Auf den Timer warten.
Wend
FreeTimer(timer)   ;Und Timer wieder wegwerfen.
End


Hoffe du liest es auch durch und verstehst es, und kopierst nicht einfach raus und fragst dann: "HÄÄÄÄ??!!!?!1111" Danke.

Sereyanne

BeitragMi, Apr 02, 2008 16:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Entweder die Items bewegen sich gar nicht

Dachte das war die Idee?

ähm nein sorry, das hab ich falsch ausgedrückt. sie sitzen dann oben links in der ecke, die ich niemals erreichen kann, und bleiben da.
Zitat:
Ich werd nachher einen Code eineditieren. Deinen werde ich sicher nicht korrigieren.

cool danke Smile freu mich schon auf deine hilfe![/code]

Sereyanne

BeitragMi, Apr 02, 2008 17:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Herzlichen Dank für deine Mühe.
Leider klappt der Code mit meinem Spiel nicht. Ich mache es genauso wie du sagst und schreibst, und der Mist rennt immer noch vor mir weg. Ich frage mich, wie du die Scrollfunktion da reinbekommen hast? Das sieht bei mir ganz anders aus!

The_Nici

BeitragMi, Apr 02, 2008 18:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Rect i\xpos-p_x+GraphicsWidth()/2,i\ypos-p_y+GraphicsHeight()/2,32,32,1 ;Klotz zeichnen

Diese Zeile ist das wichtige. Hier wird ausgerechnet wo das Ding sein soll. Die SpielerVariable und die Hälfte des Bildschirms wird abgezählt. Dann sollte es eigentlich gehen.
Also Hast du die Position des Items minus die Position des Spielers Minus die Hälfte der Auflösung.

Keine Ahnung, was du machst, aber so sollte es eigentlich wirklich gehen.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group