Laufen/Rennen Problem
Übersicht

BlackErrorBetreff: Laufen/Rennen Problem |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo Zusammen,
In letzter Zeit habe ich ein wenig Probleme mit dem Rennen in meinem Game. Ich habe 2 Sounds: Channel_Walking und Channel_Running Für die Laufgeschwindigkeiten habe ich diese Variablen: Speed_X_Walking_Left# Speed_X_Walking_Right# Speed_X_Running_Left# Speed_X_Running_Right# Speed_Z_Walking_Forward# Speed_Z_Walking_Backward# Speed_Z_Running_Forward# Speed_Z_Running_Backward# Sind zwar etwas viele, jedoch muss ich sie dadurch nicht immer *(-1) und so machen, um sie umzukehren. Um Festzulegen, was laufen und was Rennen ist, habe ich diesen Code: Code: [AUSKLAPPEN] If Walking = 1 Speed_X_Walking_Left# = -3 Speed_X_Walking_Right# = +3 Speed_Z_Walking_Forward# = +5 Speed_Z_Walking_Backward# = -5 If ChannelPlaying (Channel_Walking) = 0 Channel_Walking = PlaySound (Laufen) End If Sprint_Power# = Sprint_Power# + 0.2 End If If Running = 1 Speed_X_Running_Left# = -8 Speed_X_Running_Right# = +8 Speed_Z_Running_Forward# = +10 Speed_Z_Running_Backward# = -10 If ChannelPlaying (Channel_Running) = 0 Channel_Running = PlaySound (Rennen) End If Sprint_Power# = Sprint_Power# - 1 End If If Walking = 0 Then StopChannel Channel_Walking If Running = 0 Then StopChannel Channel_Running If Not KeyDown(17) Or KeyDown(31) Or KeyDown(30) Or KeyDown(32) ;Falls gar nichts gedrückt wird StopChannel Channel_Walking StopChannel Channel_Running End If Sprint_Power# ist hierbei der Sprintbalken, der sich entweder entleert oder füllt. Dazu diesen Code: Code: [AUSKLAPPEN] Sprint_Power# = Sprint_Power# + 0.2 ;Hochzählen wenn gar keine Taste gedrückt If Sprint_Power# > 350 Then Sprint_Power# = 350 ;Sprint Begrenzung If Sprint_Power# < 15 Sprint_Power# = 15 Walking = 1 Running = 0 End If und für das Bewegen: Code: [AUSKLAPPEN] If KeyDown(17) Then Walking = 1 Running = 0 MoveEntity Cam, 0,0,Speed_Z_Walking_Forward# If KeyDown(42) Running = 1 Walking = 0 MoveEntity Cam, 0,0,Speed_Z_Running_Forward# End If End If If KeyDown(31) Then Walking = 1 Running = 0 MoveEntity Cam, 0,0,Speed_Z_Walking_Backward# If KeyDown(42) Running = 1 Walking = 0 MoveEntity Cam, 0,0,Speed_Z_Running_Backward# End If End If If KeyDown(30) Then Walking = 1 Running = 0 MoveEntity Cam, Speed_X_Walking_Left#,0,0 If KeyDown(42) Running = 1 Walking = 0 MoveEntity Cam, Speed_X_Running_Left#,0,0 End If End If If KeyDown(32) Then Walking = 1 Running = 0 MoveEntity Cam, Speed_X_Walking_Right#,0,0 If KeyDown(42) Running = 1 Walking = 0 MoveEntity Cam, Speed_X_Running_Right#,0,0 End If End If Nun zu meinem Problem: Wenn ich laufe, Renne oder stehen bleibe klappt alles. Aber wenn der Balken leer ist und somit Laufen=1 ist, läuft gar kein laufton mehr. Ich denke, es müsste etwas logisches sein, was ich hier übersehe. Ich hoffe, man kann mir helfen. Vielen Dank, Gruss BlackError |
||
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du könntest auch alle Töne zusammen abspielen , mit Lautstärke "0" als LOOP .
Und dir Variablen nehmen die sagen Laufen 0 bis 1 (bzw. 1-0) Rennen 0-1 Stöhnen 0-1 und dann einfach die Lautstärke ändern . Und dann wenn das geht bei den Lautstärke Werten mit =0 Stop Channel und >0 Play Channel machen . Speed X= 1 oder -1 Speed X Gesamt = Speed X * ( Laufen + Rennen *2 - Stöhnen *0.5) |
||
BlackError |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Erstmal danke für deine Antwort,
Ich glaube, dass es kein unterschied macht, ob ich die lautstärke ändere oder den sound direkt abspiele. Das Kernproblem liegt ja eigentlihc daran, dass der Moment wohl gar net eintritt, bei dem er abgesprielt werden soll. Jedoch verringert sich ja die geschwindigkeit, wenn die Sprint power leer ist. Muss also was mit dem hier zu tun haben, oder?? Code: [AUSKLAPPEN] If Walking = 1 Speed_X_Walking_Left# = -3 Speed_X_Walking_Right# = +3 Speed_Z_Walking_Forward# = +5 Speed_Z_Walking_Backward# = -5 If ChannelPlaying (Channel_Walking) = 0 Channel_Walking = PlaySound (Laufen) End If Sprint_Power# = Sprint_Power# + 0.2 End If If Running = 1 Speed_X_Running_Left# = -8 Speed_X_Running_Right# = +8 Speed_Z_Running_Forward# = +10 Speed_Z_Running_Backward# = -10 If ChannelPlaying (Channel_Running) = 0 Channel_Running = PlaySound (Rennen) End If Sprint_Power# = Sprint_Power# - 1 End If If Walking = 0 Then StopChannel Channel_Walking If Running = 0 Then StopChannel Channel_Running If Not KeyDown(17) Or KeyDown(31) Or KeyDown(30) Or KeyDown(32) ;Falls gar nichts gedrückt wird StopChannel Channel_Walking StopChannel Channel_Running End If Es dürfte sich nur um etwas logisches handeln, was nur mit nem Sound befehl zu tun hat, dass die geschwindigkeiten für beide Zustände ja funktionieren. |
||
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Vieleicht so
If Walking = 0 and ChannelPlaying (Channel_Walking )>0 Then StopChannel Channel_Walking If Running = 0 and ChannelPlaying (Channel_Running)>0 Then StopChannel Channel_Running If Not KeyDown(17) Or KeyDown(31) Or KeyDown(30) Or KeyDown(32) ;Falls gar nichts gedrückt wird StopChannel Channel_Walking StopChannel Channel_Running Walking = 0 Running = 0 End If Du hast auch viele Sachen doppelt was du eleganter lösen kannst und ein Aufruf reicht wenn Walking oder Running . MoveEntity Cam, x,y,z Wenn die Variable laufen gesetzt ist machst du 100000x unnötiges Werte setzen . Also einmalig wenn Walking =1 wird fände ich besser . Dafür kann man sich eine kleine Funk. machen . If Walking = 1 Speed_X_Walking_Left# = -3 Speed_X_Walking_Right# = +3 Speed_Z_Walking_Forward# = +5 Speed_Z_Walking_Backward# = -5 |
||
BlackError |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
1. Kann ich leider net nur 1 mal moveentity x,y,z verwenden, da ich ja mehrere x und z variablen habe.
Dein Codestück funktioniert leider genau gleich wie meins. Erziehlt also auch keinen Erfolg. und die "if laufen = 1" funktion habe ich doch schon bereits ![]() Hast warhscheinlch übersehen oder anders gemeint. Hoffe auf weitere Antworten Gruß BlackError |
||
![]() |
PSY |
![]() Antworten mit Zitat ![]() |
---|---|---|
wenn der balken leer ist, und du gehst permanent, OHNE die rennentaste zu drücken, kommt auch kein sound? | ||
BlackError |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nunja, wenn der Balken leer ist, zeigt das, dass ich gerannt bin. Das heisst, während ich renne, um den Balken zu leeren, kann ich nicht gleichzeitig NICHT laufen ![]() Müsste einleuchten. Hoffe, ich habe dich nicht falsch verstanden. Ich habe mal die Dateien + Code hochgeladen, vielleciht findet dann jemand den fehler ![]() https://www.blitzforum.de/upload/file.php?id=2602 Hoffe, der code ist einigermaßen übersichtlich. Vielleicht kann mir jemand noch ein paar verschönerungsvorschläge geben (was z.B. effekte oder grundlegende dinge angeht) Gruss BlackError |
||
![]() |
PSY |
![]() Antworten mit Zitat ![]() |
---|---|---|
BlackError hat Folgendes geschrieben: Hoffe, ich habe dich nicht falsch verstanden. doch, komplett ![]() ich meinte folgendes: du bist gerannt, der balken ist leer. du kannst also im moment nur noch GEHEN. du gehst also, der balken füllt sich wieder, aber du drückst zu keiner zeit die rennen-taste. dann kommt trotzdem kein sound? (edit) aah, code. super ![]() so, mal angeschaut. dein problem ist folgendes: sagen wir mal du rennst, irgendwann geht deine sprint_power unter 15, und wird direkt in der nächsten zeile auf 15 gesetzt! dann walking = 1, running = 0. neue loop, walking ist ja 1, also wird der walkingsound gestartet (man hört noch nix, wurde ja gerade erst gestartet) zu sprint_power kommen 0.2 dabei, sprint_power ist also jetzt 15.2 (!!) blabla, der weitere code wird nicht ausgeführt, da walking =1. hier gehts dann weiter: Code: [AUSKLAPPEN] If KeyDown(17) Then
Walking = 1 Running = 0 MoveEntity Cam, 0,0,Speed_Z_Walking_Forward# If KeyDown(42) Running = 1 Walking = 0 MoveEntity Cam, 0,0,Speed_Z_Running_Forward# End If End If ich fasse zusammen: der sound wurde gerade eben erst gestartet (!!) running wurde gerade auf 1 gesetzt, da keydown(42) = true sprint_power ist zu dieser zeit 15.2, also >15. jetzt kommen wieder 0.2 zu sprint_power dabei, also haben wir insgesamt 15.4.... Code: [AUSKLAPPEN] Sprint_Power# = Sprint_Power# + 0.2 ;Hochzählen wenn gar keine Taste gedrückt
folgender code Code: [AUSKLAPPEN] If Sprint_Power# > 350 Then Sprint_Power# = 350 ;Sprint Begrenzung
If Sprint_Power# < 15 Sprint_Power# = 15 Walking = 1 Running = 0 End If kommt somit nicht zur ausführung (!!!) neue loop. running ist ja 1, also wird der runningsound GESTARTET, der walking sound gleich darauf durch Code: [AUSKLAPPEN] If Walking = 0 Then StopChannel Channel_Walking
gestoppt. wir haben bis jetzt also noch nix gehört, die sounds wurden ja beide NUR KURZ GESTARTET.... es werden wieder 1 von sprint_power abgezogen, sprint_power fällt unter 15, wird also 15....running wird 0, walking wird 1...der running sound wird also wieder gestoppt (bevor man was hören konnte)...der walking sound wird gestartet...blabla..gleiches spiel von vorn. im endeffekt folgende quintessenz: 10 walking sound wird gestartet 20 walking sound wird gestoppt, bevor man was hören konnte, running sound wird gestartet 30 running sound wird gestoppt, bevor man was hören konnte..... 40 GOTO 10 hoffe, is leuchtet ein ![]() l8er, PSY |
||
BlackError |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
WOW, erstmal vielen Dank für dein langes und gründliches Probleme klären ![]() Darauf ware ich auch noch net gekommen ^^ Gut, die Fehlerquelle weiß ich nun, jedoch weiss ich leider noch nicht so recht, wie ich ihn beseitigen muss. Könnte mir in der Sache noch einen Tipp/bzw. Code geben, der den Fehler behebt? Vielen Dank schonmal. Gruss Marcel |
||
![]() |
PSY |
![]() Antworten mit Zitat ![]() |
---|---|---|
np ![]() machs doch einfach zeitabhängig...z.b. sobald balken leer, 3 sekunden ausruhen, erst dann kann man wieder laufen. ist auch realistischer... Code: [AUSKLAPPEN] If KeyDown(17) Then
Walking = 1 Running = 0 MoveEntity Cam, 0,0,Speed_Z_Walking_Forward# If KeyDown(42) And MilliSecs()-start_chilling > 3000 ;========== NEW ========== Running = 1 Walking = 0 MoveEntity Cam, 0,0,Speed_Z_Running_Forward# End If End If If KeyDown(31) Then Walking = 1 Running = 0 MoveEntity Cam, 0,0,Speed_Z_Walking_Backward# If KeyDown(42) And MilliSecs()-start_chilling > 3000 ;========== NEW ========== Running = 1 Walking = 0 MoveEntity Cam, 0,0,Speed_Z_Running_Backward# End If End If If KeyDown(30) Then Walking = 1 Running = 0 MoveEntity Cam, Speed_X_Walking_Left#,0,0 If KeyDown(42) And MilliSecs()-start_chilling > 3000 ;========== NEW ========== Running = 1 Walking = 0 MoveEntity Cam, Speed_X_Running_Left#,0,0 End If End If If KeyDown(32) Then Walking = 1 Running = 0 MoveEntity Cam, Speed_X_Walking_Right#,0,0 If KeyDown(42) And MilliSecs()-start_chilling > 3000 ;========== NEW ========== Running = 1 Walking = 0 MoveEntity Cam, Speed_X_Running_Right#,0,0 End If End If Sprint_Power# = Sprint_Power# + 0.2 ;Hochzählen wenn gar keine Taste gedrückt If Sprint_Power# > 350 Then Sprint_Power# = 350 ;Sprint Begrenzung If Sprint_Power# < 15 Sprint_Power# = 15 start_chilling = millisecs() ;========== NEW ========== Walking = 1 Running = 0 End If hab 4mal die keydown(42) abfrage erweitert und weiter unten 1 zeile eingebaut...habs markiert. l8er, PSY |
||
BlackError |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hey PSY,
Super, vielen Dank für deine Hilfe. Dein Code funktioniert prima. muss nur noch nen "schnaufsound" einfügen ![]() Habe jetzt übrigens die Bewegungsgeschwindigkeiten in 4 statt 6 variablen hinbekommen. Code: [AUSKLAPPEN] Speed_X_Walking# Speed_X_Running# Speed_Z_Walking# Speed_Z_Running# Hab erstmals den befehl "abs" kennen gerlernt, der die Sache wesentlich erleichtert hat. Muss mich noch mehr mit dem Zeitabhängigen Programmieren beschäftigen. Was wäre der richtige Ansatz, wenn ich will, dass z.B. alle 10 oder 15 sekunden ein Donner ertönt?? Das mit dem Millisecs() verwirrt mich derzeit noch ein wenig. Bzw. das rechnen damit. Noch eine kleine Frage. Findet ihr die Wassertropfen, die auf der Cam herunterlaufen einigermaßen realistisch?? Ich denke in Verbindung mit dem richtigen Regen (den ich erst noch machen muss), siehts das schon nett aus, oder? Trotzdem vielen Dank an alle, die mir hier wirklcih geholfen haben ![]() Gruß BlackError |
||
![]() |
PSY |
![]() Antworten mit Zitat ![]() |
---|---|---|
BlackError hat Folgendes geschrieben: Muss mich noch mehr mit dem Zeitabhängigen Programmieren beschäftigen. Was wäre der richtige Ansatz, wenn ich will, dass z.B. alle 10 oder 15 sekunden ein Donner ertönt?? Das mit dem Millisecs() verwirrt mich derzeit noch ein wenig. Bzw. das rechnen damit. das ist gar nicht so schwer. millisecs() gibt die zeit, die seit dem systemstart verstrichen ist, in millisekunden an. alle 15 sekunden ein donner : Code: [AUSKLAPPEN] SFX_thunder=loadsound("thunder.ogg") ;sound laden
lastThunder% = MilliSecs() ;damits nicht gleich bei programmstart donnert :D Repeat If MilliSecs() - lastThunder > 15000 ;aktuelle zeit - zeitpunkt letzter donner > 15 sekunden? PlaySound SFX_thunder ;wenn ja, sound abspielen lastThunder = MilliSecs() ;zeitpunkt merken EndIf Until KeyHit(1) End l8er, PSY |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group