Cocos2d iphone 高级精灵表-在多个类中使用精灵表

Cocos2d iphone 高级精灵表-在多个类中使用精灵表,cocos2d-iphone,sprite,ccsprite,Cocos2d Iphone,Sprite,Ccsprite,因此,在连续几个月对这个问题感到非常沮丧之后,我休息了一会儿,现在我回来了,并试图一劳永逸地解决我的问题 我不会发布代码,因为我的代码杂乱无章,从无数角度来看都是错误的 我的问题是: 我有一个精灵,他的信息存储在一个名为player.m的类中。我有一个游戏级别,它存储在GameLevelLayer.m中 我有player.m存储速度、方向和有关角色的所有信息,然后我有GameLevelLayer.m实现、移动、使用边界检查碰撞等 我现在想使用精灵表来移动角色(我知道如何做精灵表,我只是不知道在使

因此,在连续几个月对这个问题感到非常沮丧之后,我休息了一会儿,现在我回来了,并试图一劳永逸地解决我的问题

我不会发布代码,因为我的代码杂乱无章,从无数角度来看都是错误的

我的问题是:

我有一个精灵,他的信息存储在一个名为player.m的类中。我有一个游戏级别,它存储在GameLevelLayer.m中

我有player.m存储速度、方向和有关角色的所有信息,然后我有GameLevelLayer.m实现、移动、使用边界检查碰撞等

我现在想使用精灵表来移动角色(我知道如何做精灵表,我只是不知道在使用两个不同的类时如何做)

我的问题是,我是否在player.m中创建batchnodes和spritesheet信息(CCBatchnodes、缓存等)以及所有操作和所有内容,然后在GameLevelLayer.m中运行它们?还是在GameLevelLayer.m中创建所有这些

我真的需要一些帮助,因为我已经被困在这几个月了

编辑:

多亏了一位社区成员的建议,我现在就在这里

这是我的整个播放器。m(长话短说,我定义了播放器的所有内容,,您可能只想关注init,因为这似乎是问题所在。其他内容是我的物理引擎

#导入“Player.h”
#导入“SimpleAudioEngine.h”
#导入“GameLevelLayer.h”
@实现播放器
@合成速度=_速度;
@合成所需位置=_所需位置;
@综合onGround=_onGround;
@合成前进前进前进前进前进前进,可能会跳远,可能会跳远,isGoingLeft=\u isGoingLeft;
@合成WalkAction=\u WalkAction;
@合成isMoving=_isMoving;
-(id)initWithTexture:(CCTexture2D*)纹理{
if(self=[super init]){
自速度=ccp(0.0,0.0);
[[CCSpriteFrameCache sharedSpriteFrameCache]addSpriteFramesWithFile:@“BankerPriteSheet_default.plist”];
CCSpriteBatchNode*spriteSheet=[CCSpriteBatchNode batchNodeWithFile:@“bankerpritesheet_default.png”];
[自添加子项:精灵表];
NSMutableArray*walkAnimFrames=[NSMutableArray];
用于(int i=1;i跳线切断){
自速度=ccp(自速度x,跳线切断);
}
Cg点重力=ccp(0.0,-450.0);
CGPoint gravityStep=ccpMult(重力,dt);
CGPoint forwardMove=ccp(800.0,0.0);
CGPoint forwardStep=ccpMult(forwardMove,dt);
self.velocity=ccp(self.velocity.x*0.90,self.velocity.y);//2
如果(自三月){
self.velocity=ccpAdd(self.velocity,forwardStep);
如果(!self.isMoving){
//[自我运行:_WalkAction];
//self.isMoving=是;
}
} //3
CGPoint minMovement=ccp(0.0,-450.0);
CGPoint maxMovement=ccp(120.0,250.0);
self.velocity=ccpcamp(self.velocity、minMovement、maxmmovement);
self.velocity=ccpAdd(self.velocity,gravityStep);
CGPoint stepVelocity=ccpMult(自速度,dt);
如果(!self.isGoingLeft){
self.desiredPosition=ccpAdd(self.position,步进速度);
}否则{
self.desiredPosition=ccp(self.position.x-stepVelocity.x,self.position.y+stepVelocity.y);
}
}
-(CGRect)碰撞边界框{
CGRect collisionBox=CGRectInset(self.boundingBox,3,0);
//CGRect collisionBox=self.boundingBox;
//collisionBox=CGRectOffset(collisionBox,0,-2);
CGPoint diff=ccpSub(自我期望位置,自我位置);
CGRect returnBoundingBox=CGRectOffset(碰撞框,diff.x,diff.y);
返回边界框;
}
@结束

因此,现在的问题是,如何让玩家像普通精灵一样出现在游戏中,然后当玩家开始向前移动时如何运行动画

您的游戏架构非常好!将玩家属性保留在玩家上,并仅使用GameLayer发送玩家动作是最好的方法

如果你的玩家类是从CCSprite扩展而来的,那么把所有与玩家相关的东西都放在你的玩家类中:在其上运行动画,在玩家构造函数上加载缓存(使用CCSprite
initWithTexture:rect:rotated:
或自定义自动释放构造函数,比如
+(id)玩家

然后,在GameLevelLayer中,您需要一个CCSpriteBatchNode将您的玩家添加到其中。您可以使用此批处理节点添加使用相同spritesheet的其他对象

编辑:

查看代码时,您的
initWithTexture
是错误的。正确的方法是调用
[super initWithTexture:

-(id)initWithTexture:(CCTexture2D *)texture{
    if (self = [super initWithTexture:texture]) {
然后,在GameLevelLayer中,创建玩家并将其添加到CCSpriteBatchNode:

// *** In GameLevelLayer.m ***
// Create player
Player *player = [Player spriteWithFile:@"player.png"];
// Create batch node
CCSpriteBatchNode *batchNode = [CCSpriteBatchNode batchNodeWithTexture:player.texture];
// Add batch node as child
[self addChild:batchNode];
// Add player as batch node's child
[batchNode addChild:player];
// Set player position
player.position = ccp(100,100);
您的GameLevelLayer只需执行此操作即可创建您的玩家。当它检测到用户输入时,在您的玩家中调用“jump”、“moveRight”、“moveLeft”等方法。还可以检测碰撞并向玩家发送“die”、“getSpecialItem”等操作

因此,您的玩家需要处理这些方法并执行自己的逻辑来执行操作:

// *** In Player.m ***
- (void)moveRight
{
    self.position = ccpAdd(self.position, ccp(10,0));
}

我相信您从CCSprite中删除了播放器类,并将所有播放器功能都放在播放器类中。将所有与播放器相关的动画代码放在播放器类中,并使用动画缓存仅加载一次。如果某些动画在多种类型的敌人之间共享,则您可以从不同的类访问存储在动画缓存中的动画。@Gur你是说在player类中完成所有操作(顺便说一句,它具有CCSprite类型),然后在gamelevellayer中创建动画缓存?为什么要在gamelevellayer中创建动画缓存?无论你在哪里需要创建动画缓存…请参阅此答案了解动画缓存的使用情况[CCAnimationCache sharedAnimationCache]可以从游戏中的任何地方访问。它的singleton对象由CoCos2dok维护。我将尝试一下,看看它是如何工作的。在我的玩家类中,我应该使用-(id)init还是-(id)initWithFile:(NSString*)filename这肯定非常有用,而且是朝着正确方向迈出的一步。我是一些
// *** In GameLevelLayer.m ***
[player jump];
[player die];
// *** In Player.m ***
- (void)moveRight
{
    self.position = ccpAdd(self.position, ccp(10,0));
}