Schrittgeräusche?

Übersicht BlitzBasic Blitz3D

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

LorDtaiBsn

Betreff: Schrittgeräusche?

BeitragSo, Jan 03, 2010 17:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, ich habe mich jetzt mal daran gemacht, meine ganze Szenerie mit etwas Sound zu unterlegen. Als Atmosphäre habe ich aus Quake III einen Sound genommen, das funktioniert auch. Dann habe ich aus JK3 Fußschritte entnommen (alles natürlich nur zu Testzwecken!). Wenn ich die jetzt aber so einbinde wie ich das mal probiert habe, dann klingt das ganze wie ein einziges Störgeräusch. Hier der Code:

Vor der While-Schleife:
BlitzBasic: [AUSKLAPPEN]

Global laufsound
Global microphone

microphone=CreateListener(camera)
laufsound=Load3DSound("media/sounds/go1.mp3")


Und später:
BlitzBasic: [AUSKLAPPEN]
If KeyDown(17) MoveEntity cam,0,0,s  : EmitSound (laufsound,camera)


Gibt es einen Befehl, der den Sound zum Beispiel nur jede Sekunde ein mal abspielen lässt?

Danke im Voraus!

ozzi789

BeitragSo, Jan 03, 2010 17:47
Antworten mit Zitat
Benutzer-Profile anzeigen
So wird jede Sekunde *Schritt* ausgegeben, kannst dir ja noch anpassen Wink
Code: [AUSKLAPPEN]
While Not KeyHit(1)
If MilliSecs()>curtime+1000 ; Falls die aktuelle Zeit grösser ist als curtime und eine Sekunde (1000 ms)
   curtime=MilliSecs() ; curtime aktualisieren
   Print "*Schritt*"
EndIf
Wend


mfg
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Midimaster

BeitragSo, Jan 03, 2010 17:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Wahrscheinlich wird die Funktion mehrmals aufgerufen, da du ja die Taste nicht so schnell loslassen kannst wie Blitz arbeitet. Lösung:

BlitzBasic: [AUSKLAPPEN]
If KeyDown(17)
MoveEntity cam,0,0,s
If TrittZeit < MilliSecs() Then
TrittZeit = MilliSecs() +1000
EmitSound (laufsound,camera)
EndIf
EndIf
  • Zuletzt bearbeitet von Midimaster am So, Jan 03, 2010 18:01, insgesamt einmal bearbeitet
 

Fredko

BeitragSo, Jan 03, 2010 17:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Gibt es nicht, du müsstest das schon über Millisecs regeln. Falls du aber
ein Mesh mit Animation nutzt kannst du auch per Animating gucken ob
gerade eine Animation läuft, dann mit AnimSeq die Sequenz überprüfen
und dann bei AnimTime gucken wie weit die Animation ist. Was das
bringen würde? Du könntest einmal gucken, ob überhaupt was passiert.
Dann, wenn es genau eine Laufanimation ist, immer dank AnimTime an
bestimmten Stellen den Sound abspielen, bzw. wäre es eine Rennanimation
dies mit einem verkürzten Intervall, da beim Rennen Laufgeschwindigkeit
natürlich größer ist, ganz logisch also.
!
 

LorDtaiBsn

BeitragSo, Jan 03, 2010 17:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Midimaster hat Folgendes geschrieben:
Wahrscheinlich wird die Funktion mehrmals aufgerufen, da du ja die Taste nicht so schnell loslassen kannst wie Blitz arbeitet. Lösung:

BlitzBasic: [AUSKLAPPEN]
If KeyDown(17)
MoveEntity cam,0,0,s
If TrittZeit = MilliSecs() Then
TrittZeit = MilliSecs() +1000
EmitSound (laufsound,camera)
EndIf
EndIf


Hab' ich grad mal eingefügt, aber funktioniert so irgendwie nicht.
Da die ganzen If-Befehle für die Bewegung der Kamera in 'ner Funktion stehen, sagter mir dann "End Function without Function".
Ist da vielleicht nen If oder nen Endif zu viel?

Midimaster

BeitragSo, Jan 03, 2010 18:00
Antworten mit Zitat
Benutzer-Profile anzeigen
sorry blöder Copy-Fehler von mir:

If TrittZeit < MilliSecs() Then
 

LorDtaiBsn

BeitragSo, Jan 03, 2010 18:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Immernoch der End Function-Fehler... Sad

EDIT: Ich glaub' mein Problem ist, dass ich nicht wirklich weiß, wo ich die Trittzeit überall einfügen muss?!

EDIT2: Könnte's daran liegen, dass der Befehl nicht in der Hauptschleife, sondern in ner Funktion hinter der Schleife steht?

Midimaster

BeitragSo, Jan 03, 2010 18:08
Antworten mit Zitat
Benutzer-Profile anzeigen
aber nich von unserem Code...

Eine Function gibts doch da gar nicht...

Die TrittZeit wird nur da erneuert wo ein EmitSound steht. Läuft deine Figur nur bei Dauerdrücken der Taste oder auch von alleine?

zeig doch mal die ganze Funktion...
 

LorDtaiBsn

BeitragSo, Jan 03, 2010 18:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Nur, wenn ich drücke.
Hier die Funktion:

BlitzBasic: [AUSKLAPPEN]
Function MouseLook(cam)



Local t=MilliSecs()
Local dt = t - DeltaTimeOld
DeltaTimeOld = t
Local dk# = Float(dt)/16.666
DeltaTimeK = dk
s#=0.08*dk
dx#=(GraphicsWidth()/2-MouseX())*0.2
dy#=(GraphicsHeight()/2-MouseY())*0.2
TurnEntity cam,-dy,dx,0
RotateEntity cam,EntityPitch(cam,1),EntityYaw(cam,1),0,1
y# = EntityY(cam,1)
If y<-50 Then y=-50
If y>50 Then y=50
PositionEntity cam, EntityX(cam,1),y,EntityZ(cam,1)
MoveMouse GraphicsWidth()/2, GraphicsHeight()/2
RotateEntity cam,EntityPitch(cam,1),EntityYaw(cam,1),0,1


If y<0 Then ; WENN UNTER WASSER
; LoopSound unterwasser
If KeyDown(17) MoveEntity cam,0,0,(s*0.55)
If KeyDown(31) MoveEntity cam,0,0,(-s*0.55)
If KeyDown(32) MoveEntity cam,(s*0.55),0,0
If KeyDown(30) MoveEntity cam,(-s*0.55),0,0
If KeyHit(57) MoveEntity cam,0,Rand(1.8,2.1),0
If KeyDown(17) And KeyDown(42) MoveEntity cam,0,0,(s*0.8)
If KeyDown(31) And KeyDown(42) MoveEntity cam,0,0,-(s*0.8)
If KeyDown(32) And KeyDown(42) MoveEntity cam,(s*0.8),0,0
If KeyDown(30) And KeyDown(42) MoveEntity cam,-(s*0.8),0,0
Else ; WENN ÜBER WASSER

If KeyDown(17) MoveEntity cam,0,0,s

If trittzeit < MilliSecs() Then
trittzeit = MilliSecs() + 1000
EmitSound (laufsound,camera)
EndIf

If KeyDown(31) MoveEntity cam,0,0,-s
If KeyDown(32) MoveEntity cam,s,0,0
If KeyDown(30) MoveEntity cam,-s,0,0
If KeyHit(57) MoveEntity cam,0,Rand(1.2,1.4),0
If KeyDown(17) And KeyDown(42) MoveEntity cam,0,0,(s*1.1)
If KeyDown(31) And KeyDown(42) MoveEntity cam,0,0,-(s*1.1)
If KeyDown(32) And KeyDown(42) MoveEntity cam,(s*1.1),0,0
If KeyDown(30) And KeyDown(42) MoveEntity cam,-(s*1.1),0,0

EndIf

End Function

Midimaster

BeitragSo, Jan 03, 2010 18:20
Antworten mit Zitat
Benutzer-Profile anzeigen
klar da fehlt das zweite ENDIF in:

Zitat:
EmitSound (laufsound,camera)
EndIf

If KeyDown(31) MoveEntity cam,0,0,-s


so ist es besser:
BlitzBasic: [AUSKLAPPEN]
      EmitSound (laufsound,camera)
EndIf
EndIf
If KeyDown(31) MoveEntity cam,0,0,-s
 

LorDtaiBsn

BeitragSo, Jan 03, 2010 18:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann sagter aber wiederum "'Endif' without 'If'"

EDIT: Hab's grad mal in die Hauptschleife getan, damit kann ich dann auch das Spiel starten und mit W funktioniert alles. Nun hab ich's auf die anderen Tasten übertragen, aber seitdem ich If KeyHit(17) mit dem Rest in die Hauptschleife getan habe und bei KeyHit(17) die Einstellungen mit dem MilliSecs etc. übernommen habe, fliege ich immer aus der Karte in Richtung -y, wenn ich A, S oder D drücke. Kann mir einer sagen, wieso?
  • Zuletzt bearbeitet von LorDtaiBsn am So, Jan 03, 2010 18:38, insgesamt einmal bearbeitet

Midimaster

BeitragSo, Jan 03, 2010 18:37
Antworten mit Zitat
Benutzer-Profile anzeigen
ja, weil du nach dem KeyDown gleich einen Befehl geschrieben hast:

Zitat:
If KeyDown(17) MoveEntity cam,0,0,s
If trittzeit < MilliSecs() Then
trittzeit = MilliSecs() + 1000
EmitSound (laufsound,camera)
EndIf
; EndIf



so ist es besser:
BlitzBasic: [AUSKLAPPEN]
If KeyDown(17)
MoveEntity cam,0,0,s
If trittzeit < MilliSecs() Then
trittzeit = MilliSecs() + 1000
EmitSound (laufsound,camera)
EndIf
EndIf
 

LorDtaiBsn

BeitragSo, Jan 03, 2010 18:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab' meinen vorigen Post grad' nochmal editiert, einmal nach oben schauen wäre ganz nett Very Happy

Midimaster

BeitragSo, Jan 03, 2010 18:41
Antworten mit Zitat
Benutzer-Profile anzeigen
machs wieder zurück in die funktion und verbessere den fehler!
 

LorDtaiBsn

BeitragSo, Jan 03, 2010 18:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Hat funktioniert, klappt alles, tausend Dank! Smile

skey-z

BeitragSo, Jan 03, 2010 18:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Noch ein Tipp, speicher die Tastatureingabe in einer Variablen, du fragst mehrmals in einer Schleife die gleichen Tasten ab.

zb


key_left = keyhit(203)
etc.

Das ganze am Anfang der Schleife und du kannst do oft auf die Variable zugreifen wie du möchtest
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter
 

LorDtaiBsn

BeitragSo, Jan 03, 2010 19:00
Antworten mit Zitat
Benutzer-Profile anzeigen
skey-z hat Folgendes geschrieben:
Noch ein Tipp, speicher die Tastatureingabe in einer Variablen, du fragst mehrmals in einer Schleife die gleichen Tasten ab.

zb


key_left = keyhit(203)
etc.

Das ganze am Anfang der Schleife und du kannst do oft auf die Variable zugreifen wie du möchtest


Gute Idee, sollte ich mir mal angewöhnen!
 

LorDtaiBsn

BeitragMo, Jan 04, 2010 0:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Jetzt habe ich noch eine letzte Frage, ist es möglich, mehrere Schrittgeräusche zu benutzen, die zufällig verwendet werden? Irgendwie zum Beispiel mit dem Rand - Befehl?

Danke im Voraus!

Midimaster

BeitragMo, Jan 04, 2010 0:36
Antworten mit Zitat
Benutzer-Profile anzeigen
klar, du lädst sie alle und wechselst per RAND zwischen ihnen durch. Wss spricht dagegen?

BlitzBasic: [AUSKLAPPEN]
;ganz am Anfang
Dim LaufSound(9)
LaufSound(0)=Load3DSound("Schritt.ogg")
LaufSound(1)=Load3DSound("SchrittB.ogg")
LaufSound(2)=Load3DSound("SchrittC.ogg")

;und später dann
If KeyDown(17)
MoveEntity cam,0,0,s
If trittzeit < MilliSecs() Then
trittzeit = MilliSecs() + 1000
EmitSound LaufSound(Rand(1,3)) , camera
EndIf
EndIf
 

LorDtaiBsn

BeitragMo, Jan 04, 2010 1:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke! Hat funktioniert!

Aber es winkt schon das nächste Problem, ich habe nämlich jetzt eine Lagerhalle eingebettet, welche aber nur von außen Kollision hat. Hab' sie also folgendermaßen geladen:

BlitzBasic: [AUSKLAPPEN]

; :: GEBÄUDE ::

haus=LoadMesh("media/lagerhalle.3ds")
ScaleEntity haus,0.03,0.03,0.03
PositionEntity haus,90,10,-70
EntityFX haus,16
EntityType haus,TER_COL ; TER_COL hab' ich vorher mit dem Typen 1 festgelegt, CAM_COL, also die Kamera, hat bei mir den Wert 2

; :: GEBÄUDE ENDE ::


Natürlich vor der Hauptschleife. Wie krieg ichs hin, dass es auch von innen eine Kollision gibt?


EDIT: Mir ist aufgefallen, dass sich der Hintergrundsound nicht wiederholt.
Ich lade ihn folgendermaßen ein:
BlitzBasic: [AUSKLAPPEN]

bgsound=LoadSound ("media/sounds/loop_deep_01.ogg")
PlaySound bgsound

Wenn ich statt PlaySound den Befehl LoopSound verwende, höre ich erst gar nichts. Wie ist der Befehl dafür,dass sich der Sound beliebig oft wiederholt?

Für diejenigen, die einmal gerne einen Einblick hätten, hab' ich das Ganze mal hochgeladen:

Das nächste Spiel aller Zeiten

Das ganze läuft auf 'ner Auflösung von 1280*1024 Pixeln im Vollbildmodus, hab's jetzt gerade nicht wirklich gerafft, ne anständige Auflösung reinzuzaubern, tut mir Leid :/
Wäre gut möglich, dass viele von euch jetzt erstmal noch ein paar Objekte aus dem FastExt-Libary wiedererkennen, hab' die mal eingebettet, um wenigstens etwas Atmosphäre zu kreieren und das ganze ein bisschen mit Materie zu füllen...
  • Zuletzt bearbeitet von LorDtaiBsn am Mo, Jan 04, 2010 2:05, insgesamt 5-mal bearbeitet

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group