Library design
Rutger via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Fri Jun 13 05:53:28 PDT 2014
On Friday, 13 June 2014 at 05:54:02 UTC, TheFlyingFiddle wrote:
> On Friday, 13 June 2014 at 04:11:38 UTC, Rutger wrote:
>> I'm trying to create a minimal tweening library in D based on
>> the
>> commonly used easing equations by Robert Penner
>> (http://www.robertpenner.com/easing/).
>> One of the goals with the design of the library is that any
>> numeric type should be tweenable.(The user of the library
>> shouldn't have to do any casting of their own etc) Now how do I
>> go about and design a data structure that can take either
>> floats,
>> ints or doubles, store them and modify them?
>>
>> This is what I hacked together earlier today:
>>
>>
>> abstract class TweenWrapper{
>>
>> }
>>
>>
>> class Tween(T) : TweenWrapper{
>>
>> T owner;
>>
>> string[] members;
>>
>> /** Duration in milliseconds */
>> int duration;
>>
>> /** Elapsed time in milliseconds */
>> int elapsedTime;
>>
>> bool isComplete;
>>
>> /** Type of easing */
>> EasingType easingType;
>>
>> }
>>
>> TweenWrapper is just what it sounds like, a wrapper so I don't
>> have to specify any type for the container holding the Tween
>> objects(DList!TweenWrapper).
>>
>> __traits(getMember, owner, members[0]) =
>> valueReturnedFromEasingFunction;
>> Was How I planned to use this class.. but you know, compile
>> time
>> only.
>>
>>
>> Let me know if this isn't enough to go on.
>> Is what I'm asking even possible(the easy way) in D?
>>
>>
>> TL;DR
>> Help me make D Dynamic!
>
>
> From what i can tell you want something similar to this.
>
> interface ITween
> {
> void update(int elapsedTime);
> }
>
> class Tween(T, string member) : ITween
> {
> //Expands to
> //|alias memberType = typeof(T.memberName);|
>
> mixin("alias memberType = typeof("
> ~ T.stringof ~ "." ~ member ~ ");");
>
> memberType from;
> memberType to;
> EasingType type;
>
> int duration;
> int elapsedTime;
>
> T owner;
>
> @property bool isComplete()
> {
> return elapsedTime >= duration;
> }
>
> void update(int time)
> {
> elapsedTime = min(elapsedTime + time, duration);
> double amount = elapsedTime / cast(double)duration;
> auto tweened = ease(type, from, to, amount);
> __traits(getMember, owner, member) = tweened;
> }
> }
>
> Where ease is a method that will look something like this:
>
> T ease(T)(EasingType type, T from, T to, double amount)
> if(isNumeric!T)
> {
> double result;
> if(type == EasingType.linear)
> result = linearEase(amount);
> else
> assert(0, "Not yet implemented");
>
> return cast(T)((to - from) * result + from));
> }
>
> double linearEase(double amount)
> {
> return amount;
> }
>
> This will work for all number types.
>
> Hope this was helpful.
Gonna try this later, thanks a lot!
More information about the Digitalmars-d-learn
mailing list