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