开发笔记9-cocos2d之精灵的创建与移动

知易的教程理论知识丰富,我之前也说过,我是一个习惯跟着“师傅”的小学徒,当然这个师傅不一定是人,同学推荐了一个网站51CTO.COM,里面的教程可以说比较适合我,就是那种手把手来的那种,还好我自己不会弄图片之类的东东,有实例游戏下载,我直接将图片拿来用就可以,相当不错。

我现在用的cocos2d-iphone-2.1-beta2,建工程时那个hello world不错,我就用那个来做这个教程上的小程序,刚完成到可以让敌人移动,赶紧成热打铁梳理一下,加深下印象。

首先是添加自己的精灵,实质就是一张图片,一个菜单按钮也是由两张图片构成,需要在init函数初始化这个实例,才能显示出来,贴出来代码,代码来自于http://mobile.51cto.com/iphone-330471.htm:

// on "init" you need to initialize your instance
-(id) init
{
	// always call "super" init
	// Apple recommends to re-assign "self" with the "super's" return value
	if( (self=[super initWithColor:ccc4(255, 255, 255, 255)]) ) {
		
//		// ask director for the window size
		CGSize size = [[CCDirector sharedDirector] winSize];

		
		CCMenuItemImage *closeItem = [CCMenuItemImage itemWithNormalImage:@"CloseNormal.png" selectedImage:@"CloseSelected.png" target:self selector:@selector(menuCloseCallback)];
        [closeItem setPosition:ccp(size.width-closeItem.contentSize.width/2, closeItem.contentSize.height/2)];
        

		
		CCMenu *menu = [CCMenu menuWithItems:closeItem, nil];
		
//		[menu alignItemsHorizontallyWithPadding:20];
		[menu setPosition:CGPointZero];
		
		// Add the menu to the layer
		[self addChild:menu];
        
        CCSprite *player = [[CCSprite alloc] initWithFile:@"Player.png" rect:CGRectMake(0, 0, 27, 40)];
        [player setPosition:ccp(player.contentSize.width/2, size.height/2)];
        [self addChild:player];

	}
    
    [self schedule:@selector(gameLogic:) interval:1.0f];
    
	return self;
}

梳理一下,首先需要通过父类创建自己,至于自己是什么我现在没有搞清楚,不过先承认是管理场景的。我建工程的时候默认建的类是继承至CCLayer的,屏幕背景是黑色的,由于游戏需要要该成白色的,发现此类无法更改背景颜色,仔细看教程发现需要把父类改成CCLayerColor就可以了,不过要使用父类的initWithColor:方法来创建自己,就是初始化了背景颜色进去。下一小步获取当前屏幕的大小,调试的时候模拟器是横置的,我想坐标系应该随设备的状态变化。然后创建一个按钮菜单项,应该退出使用的,貌似菜单就确定了该按钮的回调方法,并没有给出实现,我自己实现就是弹个警告。对了cocos2d是基于openGL ES的,所以坐标系的原点在设备的左下角,而定位图片是用图片的中点,以前习惯了定位View的左上角了,有点小不习惯。把建好的菜单项加到菜单里,菜单的布局现在不知道其机制,先搁置一下。最后添加我们的player,就是定位一图片加载到self,就可以显示了,当然这都是静态的。有个schedule函数其实就是下面要每隔一秒调用的创建敌人的方法addTarget:。

下面要让敌人出现,而且是动态的,先贴出代码:

- (void) addTarget
{
    CCSprite *target = [CCSprite spriteWithFile:@"Target.png" rect:CGRectMake(0, 0, 27, 40)];
    
    CGSize winSize = [[CCDirector sharedDirector] winSize];
    
    int minY = target.contentSize.height / 2;
    int maxY = winSize.height - target.contentSize.height/2;    
    int rangeY = maxY - minY;
    
    int actualY = (arc4random() % rangeY) + minY;
    
    target.position = ccp(winSize.width + target.contentSize.width/2, actualY);
    
    [self addChild:target];
    
    int minDuration = (int)2.0;
    int maxDuration = (int)6.0;
    int rangeDuration = maxDuration - minDuration;
    
    int actualDuration = (arc4random() % rangeDuration) + minDuration;
    
    CCFiniteTimeAction *actionMove = [CCMoveTo actionWithDuration:(ccTime)actualDuration position:
                                      ccp(0 - target.contentSize.width/2, actualY)];
    
    CCFiniteTimeAction *actionMoveDone = [CCCallFuncN actionWithTarget:self selector:@selector(spriteMoveFinished:)];
    
    [target runAction:[CCSequence actions:actionMove,actionMoveDone, nil]];
}

- (void) spriteMoveFinished:(id) sender
{
    CCSprite *sprite = (CCSprite *) sender;
    [self removeChild:sprite cleanup:YES];
}

这里同样需要当前屏幕的大小,准备好敌人的实例,因为只有一种敌人,所以一个敌人实例,敌人运动的轨迹设计成在屏幕右侧向左侧运动,高度随机,敌人的速度有个随机范围。既然要让敌人要随机出现在不同高度处,就需要随机的范围,很好理解,控制速度其实就是控制敌人从右侧运动到左侧所用的时间,也容易理解,因为要将运动轨迹转换成动作,我这么理解,就是规定动作时间的。CCSequence我想就是动作队列,依次执行里面的动作,因为我们的敌人只会从右向左运动,只有两个动作,一个从右向左运动,一个动作完成回调方法,这个结束回调函数比较重要,这个敌人不往复,动作完成就得让它从self清除出去。其实我对我们敌人的生命周期还是感兴趣的,是不是清除出self就释放了资源作为一个未解决的问题,以后深入学习注意一下。

运行起来的结果,如下:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值