如何在 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 中平滑移动精灵的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CamShift 中平滑跟踪

当另一个精灵移动时如何检查精灵的边界? (Cocos2D)

如何在 Java 中平滑 JFrame 的滚动

H5页面在ios中平滑滚动

如何使用 cocos2d 在自顶向下视图中的精灵下放置阴影

如何在python中平滑曲线