Laufen/Rennen Problem

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

BlackError

Betreff: Laufen/Rennen Problem

BeitragMi, Jan 23, 2008 18:20
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jan 24, 2008 13:47
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jan 24, 2008 18:10
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jan 24, 2008 19:47
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jan 24, 2008 20:41
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile
Hast warhscheinlch übersehen oder anders gemeint.

Hoffe auf weitere Antworten

Gruß BlackError

PSY

BeitragDo, Jan 24, 2008 22:14
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn der balken leer ist, und du gehst permanent, OHNE die rennentaste zu drücken, kommt auch kein sound?
 

BlackError

BeitragDo, Jan 24, 2008 22:47
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile

Müsste einleuchten.

Hoffe, ich habe dich nicht falsch verstanden.

Ich habe mal die Dateien + Code hochgeladen, vielleciht findet dann jemand den fehler Smile

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

BeitragDo, Jan 24, 2008 22:59
Antworten mit Zitat
Benutzer-Profile anzeigen
BlackError hat Folgendes geschrieben:


Hoffe, ich habe dich nicht falsch verstanden.


doch, komplett Wink

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 Wink

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 Smile

l8er,
PSY
 

BlackError

BeitragFr, Jan 25, 2008 17:34
Antworten mit Zitat
Benutzer-Profile anzeigen
WOW, erstmal vielen Dank für dein langes und gründliches Probleme klären Smile

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

BeitragFr, Jan 25, 2008 22:16
Antworten mit Zitat
Benutzer-Profile anzeigen
np Very Happy

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

BeitragSa, Jan 26, 2008 13:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey PSY,

Super, vielen Dank für deine Hilfe. Dein Code funktioniert prima. muss nur noch nen "schnaufsound" einfügen Smile

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 Smile

Gruß BlackError

PSY

BeitragSa, Jan 26, 2008 18:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group