【发布时间】:2012-12-30 20:00:16
【问题描述】:
我开始使用 Cocos2D,到目前为止学到了很多东西。但我找不到如何模拟 ccDrawLine 使其行为像吉他弦,这意味着,当触摸 ccDrawLine 时,它会播放声音并将 ccDrawLine 移动到用户触摸它的位置。
【问题讨论】:
标签: cocos2d-iphone guitar
我开始使用 Cocos2D,到目前为止学到了很多东西。但我找不到如何模拟 ccDrawLine 使其行为像吉他弦,这意味着,当触摸 ccDrawLine 时,它会播放声音并将 ccDrawLine 移动到用户触摸它的位置。
【问题讨论】:
标签: cocos2d-iphone guitar
我没有使用 Cocos2D 的经验,但是模拟吉他弦的过程可能是这样的:
要考虑的另一件事可能是声音重叠的可能性。如果用户快速触摸同一个字符串怎么办?前一个声音应该在新声音开始之前停止。或者,更自然地,当用户的手指仍然放在琴弦上时,不应播放任何声音,而应仅在用户“拨动”琴弦(即结束触摸)后才发出声音。
我不确定 Cocos2D 是否有自己的触摸事件处理程序(我想会有),但也许这篇 SO 帖子可能会有所帮助:how can i detect the touch event of an UIImageView
编辑:事实证明,Cocos2D 确实有自己的触摸事件处理程序。见:How can I detect touch in cocos2d?
【讨论】:
我会通过使用免费且简单的矢量艺术工具(例如 Inkscape)来解决此问题。它将允许您制作一些具有不同厚度/纹理的逼真的字符串。将字符串作为不同的精灵导入您的应用程序。 Cocos2d 有很多选项可以轻松检测诸如“isTouchOnNode”之类的东西,非常适合您的场景。具体来说,http://kobold2d.com 为轻松检测和选择节点创造了奇迹。
我目前无法访问 Xcode,所以这可能不是逐字代码:
/* if you use Kobold2d */
CCSprite* Gstring = [CCSprite spriteWithFile:@"Gstring.png"];
KKInput* input = [KKInput sharedInput];
if ([input isAnyTouchOnNode:Gstring touchPhase:KKTouchPhaseAny])
{
// play a sound.
// this code will become extremely complicated
// if you want a realistic sound
}
请记住,如果您打算制作一个声音/音乐重的应用程序,cocos2d 可能不是最好的引擎。它有一个来自 CocosDenshion 的非常基本的“SimpleAudioEngine”,它不是为处理吉他可以发出的许多重叠声音而设计的。
【讨论】: