| @ -0,0 +1,49 @@ | |||
| using System.Numerics; | |||
| using Raylib_cs; | |||
| namespace Smoll.Ex2 { | |||
| class ArrowComponent : Smoll.Component { | |||
| Complex offset; | |||
| public Complex rawValue; | |||
| Transform2DComponent? ownerTransform; | |||
| public ArrowComponent(int offset_x = 0, int offset_y = 0) | |||
| { | |||
| this.offset = offset_x + Complex.ImaginaryOne*offset_y; | |||
| } | |||
| public override void OnAttached() { | |||
| ownerTransform = owner.GetComponent<Transform2DComponent>(); | |||
| } | |||
| public Complex Origin() { | |||
| ownerTransform ??= owner.GetComponent<Transform2DComponent>(); | |||
| ownerTransform ??= new Transform2DComponent(); | |||
| var tr = ownerTransform.AbsoluteTransform(); | |||
| return tr.position + offset*Complex.Exp(Complex.ImaginaryOne * tr.angle) * tr.scale; | |||
| } | |||
| public Complex Vector() { | |||
| ownerTransform ??= owner.GetComponent<Transform2DComponent>(); | |||
| ownerTransform ??= new Transform2DComponent(); | |||
| var tr = ownerTransform.AbsoluteTransform(); | |||
| return rawValue*Complex.Exp(Complex.ImaginaryOne * tr.angle) * tr.scale; | |||
| } | |||
| public Tuple<Complex, Complex> OriginAndVector() { | |||
| ownerTransform ??= owner.GetComponent<Transform2DComponent>(); | |||
| ownerTransform ??= new Transform2DComponent(); | |||
| var tr = ownerTransform.AbsoluteTransform(); | |||
| return Tuple.Create(tr.position + offset*Complex.Exp(Complex.ImaginaryOne * tr.angle) * tr.scale, rawValue*Complex.Exp(Complex.ImaginaryOne * tr.angle) * tr.scale); | |||
| } | |||
| public override void Draw(Smoll.Layer.DrawMode drawMode) { | |||
| if(drawMode == Layer.DrawMode.Debug) { | |||
| var data = OriginAndVector(); | |||
| Complex start = data.Item1; | |||
| Complex end = data.Item1 + data.Item2; | |||
| Raylib.DrawLineEx(new Vector2((float)start.Real, (float)start.Imaginary),new Vector2((float)end.Real, (float)end.Imaginary),2f, Color.Red); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @ -0,0 +1,36 @@ | |||
| using Smoll; | |||
| using Raylib_cs; | |||
| using System.Numerics; | |||
| namespace Smoll.Ex2 | |||
| { | |||
| class ExampleShootingInputComponent : Component { | |||
| Transform2DComponent? transform; | |||
| ArrowComponent? arrow; | |||
| public ExampleShootingInputComponent() { | |||
| } | |||
| public override void OnAttached() | |||
| { | |||
| base.OnAttached(); | |||
| transform = owner.GetComponent<Transform2DComponent>(); | |||
| arrow = owner.GetComponent<ArrowComponent>(); | |||
| } | |||
| public override void Update(float deltaTimeSeconds) | |||
| { | |||
| transform ??= owner.GetComponent<Transform2DComponent>(); | |||
| if(transform == null) throw new Exception("Example Input used on immovable object"); | |||
| arrow ??= owner.GetComponent<ArrowComponent>(); | |||
| if(arrow == null) throw new Exception("Example Shooter used on arrowless object"); | |||
| if(Raylib.IsKeyPressed(KeyboardKey.Space)) { | |||
| var shoot = new Entity(owner.layers.First()); | |||
| var details = arrow.OriginAndVector(); | |||
| shoot.Attach(new Transform2DComponent((float)details.Item1.Real,(float)details.Item1.Imaginary,transform.transform.angle, transform.transform.scale)); | |||
| shoot.Attach(new TimeToLiveComponent(4f)); | |||
| shoot.Attach(new SpriteComponent("Beam.png")); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @ -0,0 +1,35 @@ | |||
| using Raylib_cs; | |||
| namespace Smoll.Ex2 | |||
| { | |||
| class RaylibAssetManagerModule : IEngineModule { | |||
| string path; | |||
| Dictionary<string, Image> images; | |||
| Dictionary<string, Sound> sounds; | |||
| public RaylibAssetManagerModule(string path = "./assets") { | |||
| this.path = path; | |||
| images = new Dictionary<string, Image>(); | |||
| sounds = new Dictionary<string, Sound>(); | |||
| } | |||
| public Image GetImage(string name) { | |||
| Image image; | |||
| if(! images.TryGetValue(name, out image)) { | |||
| image = Raylib.LoadImage(path+"/"+name); | |||
| images.Add(name, image); | |||
| } | |||
| return image; | |||
| } | |||
| public Sound GetSound(string name) { | |||
| Sound sound; | |||
| if(! sounds.TryGetValue(name, out sound)) { | |||
| sound = Raylib.LoadSound(path+"/"+name); | |||
| sounds.Add(name, sound); | |||
| } | |||
| return sound; | |||
| } | |||
| } | |||
| } | |||
| @ -0,0 +1,37 @@ | |||
| using System.Numerics; | |||
| using Raylib_cs; | |||
| namespace Smoll.Ex2 { | |||
| class SpriteComponent : Smoll.Component , IDisposable{ | |||
| Complex offset; | |||
| string asset_name; | |||
| Transform2DComponent? ownerTransform; | |||
| Texture2D texture; | |||
| public SpriteComponent(string asset_name, int offset_x = 0, int offset_y = 0) | |||
| { | |||
| this.offset = offset_x + Complex.ImaginaryOne*offset_y; | |||
| this.asset_name = asset_name; | |||
| } | |||
| public override void OnAttached() { | |||
| ownerTransform = owner.GetComponent<Transform2DComponent>(); | |||
| Image image = owner.layers.First().attachedEngine.GetModule<RaylibAssetManagerModule>().GetImage(asset_name); | |||
| texture = Raylib.LoadTextureFromImage(image); | |||
| } | |||
| public override void Draw(Smoll.Layer.DrawMode drawMode) { | |||
| if(drawMode == Layer.DrawMode.Normal) { | |||
| ownerTransform ??= owner.GetComponent<Transform2DComponent>(); | |||
| ownerTransform ??= new Transform2DComponent(); | |||
| var tr = ownerTransform.AbsoluteTransform(); | |||
| Raylib.DrawTextureEx(texture, new Vector2((float)tr.position.Real, (float)tr.position.Imaginary), tr.angle*180f/MathF.PI, tr.scale, Color.White); | |||
| } | |||
| } | |||
| public void Dispose() | |||
| { | |||
| Raylib.UnloadTexture(texture); | |||
| } | |||
| } | |||
| } | |||
| @ -0,0 +1,25 @@ | |||
| using System.Numerics; | |||
| using Raylib_cs; | |||
| namespace Smoll.Ex2 { | |||
| class TimeToLiveComponent : Smoll.Component { | |||
| float secondsToLive; | |||
| float lived = 0f; | |||
| public TimeToLiveComponent(float secondsToLive) | |||
| { | |||
| this.secondsToLive = secondsToLive; | |||
| } | |||
| public override void Update(float deltaTimeSeconds) | |||
| { | |||
| lived += deltaTimeSeconds; | |||
| if(lived > secondsToLive) owner.mustDelete = true; | |||
| } | |||
| public override void Draw(Smoll.Layer.DrawMode drawMode) { | |||
| if(drawMode == Layer.DrawMode.Debug) { | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @ -0,0 +1,6 @@ | |||
| namespace Smoll | |||
| { | |||
| public interface IEngineModule { | |||
| } | |||
| } | |||