@ -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 { | |||
} | |||
} |