Якорь преобразования по умолчанию для спрайтов в Cocos2D - это центр спрайта, поэтому он должен двигаться так, чтобы центр спрайта находился в том месте, к которому вы прикоснулись, как у вас сейчас. Вы изменили привязку преобразования спрайта?
Единственное, о чем я могу подумать, это то, что если ваш mainSprite является дочерним по отношению к другому CocosNode, то вам, возможно, потребуется преобразовать координаты касания в пространство узлов следующим способом:
- (CGPoint)convertToNodeSpace:(CGPoint)worldPoint;
... на родительском узле. Однако я сомневаюсь, что это проблема. Извините, если это бесполезно.
РЕДАКТИРОВАТЬ: OP, если вы читаете это, какую версию Cocos2D вы используете? Я считаю, что 0,8 (в настоящее время в стволе svn) меняет способ работы привязки; для дальнейшего использования может быть полезно узнать, с кем вы работаете.