module Mapping.AnimatedTile; /* Copyright (C) 2005 Nate Plumm */ private import Drawing, Utilities.Tiles, Utilities.Timer; public struct AnimatedTile { private: Rectangle[] sourceRects; byte animSpeed; int frameCount = 0; long lastTickUsed = 0; int tileNumber = 0; int currentOffset = 0; public: bit useSecondSheet; static AnimatedTile opCall(int tileNumber, byte animSpeed, ushort[] animFrames, int frameCount) { AnimatedTile t; t.Setup(tileNumber, animSpeed, animFrames, frameCount); return t; } void Setup(int tileNumber, byte animSpeed, ushort[] animFrames, int frameCount) { this.tileNumber = tileNumber; this.animSpeed = animSpeed; this.frameCount = frameCount; sourceRects.length = frameCount; for(int i = 0; i < frameCount; i++) sourceRects[i] = Tiles.TileNumberToRectangle(animFrames[i], useSecondSheet); } Rectangle GetSourceRectangle(int offset) { if(this.currentOffset + offset < sourceRects.length) { return sourceRects[this.currentOffset]; } else { return sourceRects[0]; } } void TimerElapsed(long expectedTime, long realTime) // This is called from a different thread { if(CurrentTick() - lastTickUsed > (15 * animSpeed)) { if(this.currentOffset + 1 < sourceRects.length) this.currentOffset++; else this.currentOffset = 0; this.lastTickUsed = CurrentTick(); } } }