Tasten sperren während Sprachausgabe
Übersicht

![]() |
SereyanneBetreff: Tasten sperren während Sprachausgabe |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Herzlichen Dank. Jetzt klappt es ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Alles nochmals Zeichnen.
Setze dich mit Schleifen und Bedinngungen auseinander. |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
![]() |
Sereyanne |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group