You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

58 lines
1.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using Duality;
using Duality.Audio;
using Duality.Resources;
using Duality.Components.Physics;
namespace DualStickSpaceShooter
{
[RequiredComponent(typeof(RigidBody))]
public class HitSoundController : Component, ICmpCollisionListener
{
private ContentRef<Sound> hitSound = null;
private float pitch = 1.0f;
private float volume = 1.0f;
public ContentRef<Sound> HitSound
{
get { return this.hitSound; }
set { this.hitSound = value; }
}
public float Pitch
{
get { return this.pitch; }
set { this.pitch = value; }
}
public float Volume
{
get { return this.volume; }
set { this.volume = value; }
}
public void NotifyHit(float strength)
{
if (this.hitSound != null && strength > 0.02f)
{
SoundInstance inst = DualityApp.Sound.PlaySound3D(this.hitSound, this.GameObj);
inst.Volume = this.volume * MathF.Clamp(strength, 0.0f, 1.0f);
inst.Pitch = this.pitch;
}
}
void ICmpCollisionListener.OnCollisionBegin(Component sender, CollisionEventArgs args) {}
void ICmpCollisionListener.OnCollisionEnd(Component sender, CollisionEventArgs args) {}
void ICmpCollisionListener.OnCollisionSolve(Component sender, CollisionEventArgs args)
{
RigidBodyCollisionEventArgs bodyArgs = args as RigidBodyCollisionEventArgs;
if (bodyArgs.MyShape.IsSensor) return;
if (bodyArgs.OtherShape.IsSensor) return;
float impactStrength = bodyArgs.CollisionData.NormalImpulse / (4.0f * bodyArgs.MyShape.Parent.Mass);
this.NotifyHit(MathF.Pow(impactStrength, 1.5f));
}
}
}