如何在 cocos2d 中平滑移动精灵
Posted
技术标签:
【中文标题】如何在 cocos2d 中平滑移动精灵【英文标题】:how to do smooth movement of sprites in cocos2d 【发布时间】:2013-07-07 10:02:01 【问题描述】:在我的 cocos2d 项目中,我使用 CCMoveBy 动作将精灵从最左角移动到最右角。这是代码
CCSprite* sprite1 = [CCSprite spriteWithFile:@"Icon.png"];
sprite1.position = ccp(100, 100);
[self addChild:sprite1];
[sprite1 runAction:[CCSequence actions:
[CCMoveBy actionWithDuration:4 position:ccp(300, 0)],
[CCMoveBy actionWithDuration:2 position:ccp(0, 200)],
[CCMoveBy actionWithDuration:4 position:ccp(-300, 0)],
[CCMoveBy actionWithDuration:2 position:ccp(0, -200)], nil]];
精灵移动不顺畅,移动时有时会卡住。 cocos2d论坛有人问过类似的问题
http://www.cocos2d-iphone.org/forums/topic/ccactions-not-running-smoothly-specifically-ccmoveby-and-ccrotateby/
但是在我的游戏中,我在很多地方都使用了动作序列,通过调度更新或自定义选择器来编写每个动作序列的代码太多了。
【问题讨论】:
你的 FPS 是恒定在 60 还是在精灵停止时下降? 排序移动倾向于在新的移动动作开始运行之前停止移动一帧。除此之外,假设您的帧速率稳定在 60 fps。 它永远不稳定,即使我创建了一个新的 cocos2d 项目并运行 hello world。它在 59.0 到 60.0 之间随机变化我认为这是正常的。我正在使用 ios 6.1 模拟器 【参考方案1】:我认为您可以通过以下代码实现此目的
MovingSprite.h
#import <Foundation/Foundation.h>
#import "cocos2d.h"
@interface MovingSprite : CCSprite
float _vx;
float _vy;
-(void) update:(ccTime)dt;
@property (nonatomic, assign) float vx;
@property (nonatomic, assign) float vy;
@end
MovingSprite.m
#import "MovingSprite.h"
@implementation MovingSprite
@synthesize vx = _vx;
@synthesize vy = _vy;
-(void)update:(ccTime)dT
self.vy -= (kGravity * dT); //optionally apply gravity
self.position = ccp(self.position.x + (self.vx*dT), self.position.y + (self.vy*dT));
并添加 [self scheduleUpdate];到你的游戏层的 init 方法。然后在游戏层中添加一个更新方法,您可以在其中调用所有移动精灵的更新。
【讨论】:
以上是关于如何在 cocos2d 中平滑移动精灵的主要内容,如果未能解决你的问题,请参考以下文章