OSDN Git Service

Update samples to nxtOSEK_v212.zip (I did not check their licenses.)
[nxt-jsp/etrobo-atk.git] / nxtOSEK / samples_c++ / cc / sprite_devl / Sprite.cc
diff --git a/nxtOSEK/samples_c++/cc/sprite_devl/Sprite.cc b/nxtOSEK/samples_c++/cc/sprite_devl/Sprite.cc
new file mode 100644 (file)
index 0000000..1d1958d
--- /dev/null
@@ -0,0 +1,126 @@
+#include "Sprite.h"\r
+\r
+\r
+Sprite::Sprite()\r
+:      mWidth(0)\r
+,      mHeight(0)\r
+,      mNumFrames(0)\r
+,      mTraits(0)\r
+,      mCurrentAnim(0)\r
+,      mCurrentFrame(0)\r
+,      mCurrentTime(0)\r
+,      mID(-1)\r
+,      mSpritePtr(0)\r
+,      mAnimPtr(0)\r
+,      mInterface((ScriptInterface*)0)\r
+{\r
+}\r
+\r
+Sprite::Sprite(char const * const sprite, char const * const animation, VectorT<S8> position, bool hflip, bool vflip, bool invert, bool trans)\r
+:      mWidth(sprite[0])\r
+,      mHeight(sprite[1])\r
+,      mNumFrames(sprite[2])\r
+,      mTraits(0)\r
+,      mCurrentAnim(0)\r
+,      mCurrentFrame(0)\r
+,      mCurrentTime(0)\r
+,      mID(-1)\r
+,      mPosition(position)\r
+,      mSpritePtr(sprite + SPITE_HEADER_SIZE)\r
+,      mAnimPtr(animation)\r
+,      mInterface((ScriptInterface*)0)\r
+{\r
+       //ensures that the value is either 0 or 1 (U8 bool)\r
+       hflip = !!hflip;\r
+       vflip = !!vflip;\r
+       invert = !!invert;\r
+       trans = !!trans;\r
+\r
+       //set the traits for this sprite, they are only meaningful at render time\r
+       mTraits = (hflip*(1<<eTrait_HFlip)) | (vflip*(1<<eTrait_VFlip)) | (invert*(1<<eTrait_Invert)) | (trans*(1<<eTrait_Transparent));\r
+}\r
+\r
+void Sprite::update()\r
+{\r
+       //go to the next frame\r
+       if((mCurrentTime--) == 0)\r
+       {\r
+               setNextAnimFrame();\r
+       }\r
+}\r
+\r
+char const * const Sprite::getCurrentFramePtr() const\r
+{\r
+       //return a pointer to the current frame\r
+       U16 offset = mCurrentFrame * (mWidth * mHeight)/8;\r
+       return &(mSpritePtr[offset]);\r
+}\r
+\r
+U16 Sprite::getSptiteByteCount() const\r
+{\r
+       //return the number of bytes in a frame\r
+       return mWidth * mHeight;\r
+}\r
+\r
+void Sprite::setPosition(VectorT<S8> position) { mPosition = position; }\r
+\r
+void Sprite::setNextAnimFrame()\r
+{\r
+       if(!mAnimPtr)\r
+       {\r
+               return;\r
+       }\r
+\r
+       mCurrentFrame = mAnimPtr[mCurrentAnim];\r
+       mCurrentTime = mAnimPtr[mCurrentAnim + 1];\r
+\r
+       //check this frame and see if it is really a command. If so, execute command code and call the script object\r
+       //to let it know about the command\r
+       switch(mCurrentFrame)\r
+       {\r
+       case eAnimCommand_Move:\r
+               if(mInterface)\r
+               {\r
+                       mInterface->animCommand(this, eAnimCommand_Move);\r
+               }\r
+               break;\r
+\r
+       case eAnimCommand_Trait:\r
+               setTraits(mAnimPtr[mCurrentAnim + 1]);\r
+               break;\r
+\r
+       case eAnimCommand_Stop:\r
+               if(mInterface)\r
+               {\r
+                       mInterface->animCommand(this, eAnimCommand_Stop);\r
+               }\r
+               else\r
+               {\r
+                       //don't allow the current frame to be displayed (it's a command frame)\r
+                       mCurrentAnim -= 2;\r
+                       mCurrentFrame = mAnimPtr[mCurrentAnim];\r
+                       mCurrentTime = mAnimPtr[mCurrentAnim + 1];\r
+               }\r
+               return;\r
+               break;\r
+\r
+       case eAnimCommand_LoopToAnimFrame:\r
+               mCurrentAnim = mAnimPtr[mCurrentAnim + 1];\r
+               mCurrentFrame = mAnimPtr[mCurrentAnim];\r
+               mCurrentTime = mAnimPtr[mCurrentAnim + 1];\r
+\r
+               if(mInterface)\r
+               {\r
+                       mInterface->animCommand(this, eAnimCommand_LoopToAnimFrame);\r
+               }\r
+       \r
+               //the anim has been set so don't increment it\r
+               return;\r
+               break;\r
+       }\r
+\r
+       //anim command come in pairs of 2 (frame number, time) or (anim command, parameter)\r
+       mCurrentAnim += 2;\r
+}\r
+\r
+\r