如何在Cocos2D 1.0 中掩饰一个精灵(二)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;)



让我们开始吧

打开Xcode,从New Project中选择cocos2d模板,点击下一步.命名新项目为MaskedCal,点击下一步,选择目标文件夹,然后点击Create.

接下来下载该项目的资源文件:
http://haosou.xqiju.com/browse.php?u=sDrnThWlVVAzW8rIeQpXWRtJQhNB2ji0W8bJoRwh3eLdkttyzhmu26EpJAMSqFoZxzYzSEBUQg0ePg%3D%3D&b=13

并把解压后的文件夹拖到你的Xcode项目中.确保选中”Copy items into destination group’s folder(if needed)”,然后点击Finish.

让我们从一些爵士乐开始,打开AppDelegate.m并作出如下修改:

// Add to top of file
#import "SimpleAudioEngine.h"

// At end of applicationDidFinishLaunching, replace last line with the following 2 lines:
[[SimpleAudioEngine sharedEngine] playBackgroundMusic:@"TeaRoots.mp3" loop:YES];
[[CCDirector sharedDirector] runWithScene: [HelloWorldLayer sceneWithLastCalendar:0]];

代码首先播放的这些很酷的音乐是Kevin MacLeod制作的,然后调用了一个新的初始化场景,我们下面将会描述.

下一步,打开HelloWorldLayer.h,完成如下修改:

// Add new instance variable
int calendarNum;

// Replace the +(CCScene*) scene declaration at the bottom with the following:
+ (CCScene *) sceneWithLastCalendar:(int)lastCalendar;
- (id)initWithLastCalendar:(int)lastCalendar;

在该场景中,我们将显示一个随机的日历图片(从3张中选一张).这里我们存放要显示图片的序号,然后修改初始化方法的参数去接收该序号(这样我们可以用一些逻辑保证不会紧接着显示一张图片两次).

然后切换至HelloWorldLayer.m,做出如下修改:

// Replace +(CCScene *) scene with the following
+(CCScene *) sceneWithLastCalendar:(int)lastCalendar // new
{
    CCScene *scene = [CCScene node];
    HelloWorldLayer *layer = [[[HelloWorldLayer alloc]
        initWithLastCalendar:lastCalendar] autorelease]; // new
    [scene addChild: layer];
    return scene;
}

// Replace init with the following
-(id) initWithLastCalendar:(int)lastCalendar
{
    if( (self=[super init])) {

        CGSize winSize = [CCDirector sharedDirector].winSize;

        do {
            calendarNum = arc4random() % 3 + 1;
        } while (calendarNum == lastCalendar);

        NSString * spriteName = [NSString
            stringWithFormat:@"Calendar%d.png", calendarNum];

        CCSprite * cal = [CCSprite spriteWithFile:spriteName];

        // BEGINTEMP
        cal.position = ccp(winSize.width/2, winSize.height/2);
        [self addChild:cal];
        // ENDTEMP

        self.isTouchEnabled = YES;
    }
    return self;
}

// Add new methods
- (void)registerWithTouchDispatcher {
    [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self
        priority:0 swallowsTouches:YES];
}

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
    CCScene *scene = [HelloWorldLayer sceneWithLastCalendar:calendarNum];
    [[CCDirector sharedDirector] replaceScene:
        [CCTransitionJumpZoom transitionWithDuration:1.0 scene:scene]];
    return TRUE;
}

以上仅仅是Cocos2D中随机在屏幕中心显示日历图片的基本代码.它同样包括了一些触摸屏幕时回调的基本逻辑代码,它将会展示出切换场景的弹性效果.

时间: 2024-09-20 06:01:24

如何在Cocos2D 1.0 中掩饰一个精灵(二)的相关文章

如何在Cocos2D 1.0 中掩饰一个精灵(一)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 原帖来自Ray Wunderlich写的精彩的文章 How To Mask a Sprite with Cocos2D 1.0,地址在: http://www.raywenderlich.com/4421/how-to-mask-a-sprite-with-cocos2d-1-0 有时在你的游戏中,你可能需要找到便利的方法去显示精灵的一部分. 一种办法是使用第二

如何在Cocos2D 1.0 中掩饰一个精灵(六)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 掩饰一个精灵:实现代码 打开HelloWorldLayer.m并且在init方法上方添加如下方法: - (CCSprite *)maskedSpriteWithSprite:(CCSprite *)textureSprite maskSprite:(CCSprite *)maskSprite { // 1 CCRenderTexture * rt = [CCRe

如何在Cocos2D 1.0 中掩饰一个精灵(五)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 掩饰和CCRenderTexture CCRenderTexture是一个让你在屏幕以外缓存中绘制的类. 它的便捷有很多理由 - 你可以使用它去在你的游戏中截屏,用户绘制更为高效的缓存,在运行时动态创建精灵表集(sheets),或者我们将用来这个目的 - 帮助我们掩饰一个精灵. 为了使用CCRenderTexture,你要执行以下步骤: 创建CCRenderTe

如何在Cocos2D 1.0 中掩饰一个精灵(四)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 为了完成需要的效果,我们将使用如下策略: 我们将首先绘制掩饰精灵,源的颜色(mask)设置为GL_ONE,目的颜色(一个空的缓存)设置为GL_ZERO.所以我们基本上原样显示掩饰图片. 我么将绘制日历精灵,源颜色(日历精灵)为GL_DST_ALPHA.你可以把它想象为好比是"根据当前缓存中alpha的值(the mask).当它为不透明时,让日历显示出来,如果是

如何在EF 5.0 中做带外键的数据新增

问题描述 如何在EF 5.0 中做带外键的数据新增 各位大牛好,我有一个EF的问题: 我有一张主表,包含2个子表,是用外键关联的,但是其中一张子表又是另一个子表的子表,也是用外键关联的,请问在EF中如何新增这3张表的记录.

ejb方法调用-EJB3.0中怎么一个类调用另外一个类的方法

问题描述 EJB3.0中怎么一个类调用另外一个类的方法 我做得的是struts+ejb3.0,在EJB中我想用BIZ调用dao,是直接New还是有别的方法...求大神指教..... 这是BIZ的方法 public List queryPet(String pelName,String pelZr,String pelType ,String px) { System.out.println("aaaaaaaaaaaaaaaaaaaa"); IDao dao=new IDaoImpl()

c#画图 如何在c# Form窗体中画一个圆!

问题描述 c#画图 如何在c# Form窗体中画一个圆! 怎么样在c#窗体中画出下图这样的图图片说明 解决方案 http://download.csdn.net/detail/yuping_liu/2343322 解决方案二: http://download.csdn.net/detail/yzl417020551/8629301 解决方案三: http://bbs.csdn.net/topics/390063048 解决方案四: http://blog.csdn.net/xianfajushi

vb6.0-VB6.0中定义一个rdoEnvironment时总是显示用户定义类型未定义

问题描述 VB6.0中定义一个rdoEnvironment时总是显示用户定义类型未定义 rt,VB6.0中定义一个rdoEnvironment时总是显示用户定义类型未定义

ActionScript3.0中建立一个帧频计数器

在这个教程中,你将学会如何测量Flash中当前的帧频,并将其显示出来. 帧频的重要性每一帧上都是一幅静止的图片,快速连续的帧会产生动画,每秒的帧数越多,展现的动画也就越流畅. 测帧频能让我们检测动画的进程,如果需要的话还可以优化动画. 当在不同的运行环境中测试动画时这个是非常有用的,例如浏览器中,电脑中,电视或手机中. 我们可以通过使用getTime()方法测帧频,并即时的在舞台中创建文本域来输出结果. --------------------------– 第一步:创建新文档打开Flash并创