diff --git a/cocos2dx/cocos2dx-uphone.vcproj b/cocos2dx/cocos2dx-uphone.vcproj
index 4b97ee26f6..6571ba5093 100644
--- a/cocos2dx/cocos2dx-uphone.vcproj
+++ b/cocos2dx/cocos2dx-uphone.vcproj
@@ -336,6 +336,10 @@
RelativePath=".\include\CCMenuItem.h"
>
+
+
@@ -537,6 +541,10 @@
+
+
diff --git a/cocos2dx/include/CCMotionStreak.h b/cocos2dx/include/CCMotionStreak.h
new file mode 100644
index 0000000000..e54269f972
--- /dev/null
+++ b/cocos2dx/include/CCMotionStreak.h
@@ -0,0 +1,72 @@
+/****************************************************************************
+Copyright (c) 2010 cocos2d-x.org
+
+http://www.cocos2d-x.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+****************************************************************************/
+#ifndef __CCMOTION_STREAK_H__
+#define __CCMOTION_STREAK_H__
+#include "CCNode.h"
+#include "CCProtocols.h"
+namespace cocos2d {
+ class CCRibbon;
+ /**
+ * CCMotionStreak manages a Ribbon based on it's motion in absolute space.
+ * You construct it with a fadeTime, minimum segment size, texture path, texture
+ * length and color. The fadeTime controls how long it takes each vertex in
+ * the streak to fade out, the minimum segment size it how many pixels the
+ * streak will move before adding a new ribbon segement, and the texture
+ * length is the how many pixels the texture is stretched across. The texture
+ * is vertically aligned along the streak segemnts.
+ *
+ * Limitations:
+ * CCMotionStreak, by default, will use the GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA blending function.
+ * This blending function might not be the correct one for certain textures.
+ * But you can change it by using:
+ * [obj setBlendFunc: (ccBlendfunc) {new_src_blend_func, new_dst_blend_func}];
+ *
+ * @since v0.8.1
+ */
+ class CCX_DLL CCMotionStreak : public CCNode, public CCTextureProtocol
+ {
+ /** Ribbon used by MotionStreak (weak reference) */
+ CCX_PROPERTY_READONLY(CCRibbon*, m_pRibbon, Ribbon)
+ //CCTextureProtocol methods
+ CCX_PROPERTY(CCTexture2D*, m_pTexture, Texture)
+ CCX_PROPERTY(ccBlendFunc, m_tBlendFunc, BlendFunc)
+ public:
+ CCMotionStreak(){}
+ virtual ~CCMotionStreak(){}
+ /** creates the a MotionStreak. The image will be loaded using the TextureMgr. */
+ static CCMotionStreak * streakWithFade(float fade, float seg, const char *imagePath, float width, float length, ccColor4B color);
+
+ /** initializes a MotionStreak. The file will be loaded using the TextureMgr. */
+ bool initWithFade(float fade, float seg, const char *imagePath, float width, float length, ccColor4B color);
+
+ /** polling function */
+ void update(ccTime delta);
+ protected:
+ float m_fSegThreshold;
+ float m_fWidth;
+ CGPoint m_tLastLocation;
+ };
+} // namespace cocos2d
+
+#endif //__CCMOTION_STREAK_H__
\ No newline at end of file
diff --git a/cocos2dx/misc_nodes/CCMotionStreak.cpp b/cocos2dx/misc_nodes/CCMotionStreak.cpp
new file mode 100644
index 0000000000..0936be0bc8
--- /dev/null
+++ b/cocos2dx/misc_nodes/CCMotionStreak.cpp
@@ -0,0 +1,93 @@
+/****************************************************************************
+Copyright (c) 2010 cocos2d-x.org
+
+http://www.cocos2d-x.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+****************************************************************************/
+#include "CCMotionStreak.h"
+#include "support/CGPointExtension.h"
+#include "CCRibbon.h"
+namespace cocos2d {
+ /*
+ * Motion Streak manages a Ribbon based on it's motion in absolute space.
+ * You construct it with a fadeTime, minimum segment size, texture path, texture
+ * length and color. The fadeTime controls how long it takes each vertex in
+ * the streak to fade out, the minimum segment size it how many pixels the
+ * streak will move before adding a new ribbon segement, and the texture
+ * length is the how many pixels the texture is stretched across. The texture
+ * is vertically aligned along the streak segemnts.
+ */
+ //implementation CCMotionStreak
+
+ CCMotionStreak * CCMotionStreak::streakWithFade(float fade, float seg, const char *imagePath, float width, float length, ccColor4B color)
+ {
+ CCMotionStreak *pRet = new CCMotionStreak();
+ if(pRet->initWithFade(fade, seg, imagePath, width, length, color))
+ {
+ pRet->autorelease();
+ return pRet;
+ }
+ return NULL;
+ }
+ bool CCMotionStreak::initWithFade(float fade, float seg, const char *imagePath, float width, float length, ccColor4B color)
+ {
+ m_fSegThreshold = seg;
+ m_fWidth = width;
+ m_tLastLocation = CGPointZero;
+ m_pRibbon = CCRibbon::ribbonWithWidth(m_fWidth, imagePath, length, color, fade);
+ this->addChild(m_pRibbon);
+
+ // update ribbon position
+ this->schedule(schedule_selector(CCMotionStreak::update), 0);
+ return true;
+ }
+ void CCMotionStreak::update(ccTime delta)
+ {
+ CGPoint location = this->convertToWorldSpace(CGPointZero);
+ m_pRibbon->setPosition(ccp(-1*location.x, -1*location.y));
+ float len = sqrtf(powf(m_tLastLocation.x - location.x, 2) + powf(m_tLastLocation.y - location.y, 2));
+ if (len > m_fSegThreshold)
+ {
+ m_pRibbon->addPointAt(location, m_fWidth);
+ m_tLastLocation = location;
+ }
+ m_pRibbon->update(delta);
+ }
+
+ //MotionStreak - CocosNodeTexture protocol
+
+ void CCMotionStreak::setTexture(CCTexture2D* texture)
+ {
+ m_pRibbon->setTexture(texture);
+ }
+ CCTexture2D * CCMotionStreak::getTexture()
+ {
+ return m_pRibbon->getTexture();
+ }
+ ccBlendFunc CCMotionStreak::getBlendFunc()
+ {
+ return m_pRibbon->getBlendFunc();
+ }
+ void CCMotionStreak::setBlendFunc(ccBlendFunc blendFunc)
+ {
+ m_pRibbon->setBlendFunc(blendFunc);
+ }
+
+}// namespace cocos2d
\ No newline at end of file