【Cocosd2d实例教程六】Cocos2d实现屏幕背景的自动滚动

简介: (转载请注明出处:http://blog.csdn.net/buptgshengod) 1.介绍     实现屏幕背景的自动滚动是游戏常遇到的功能,这样我们就不用绘制很长的背景图片,只要设计一张就可以,省时省力。这章将实现这个功能,并把源代码贡献给大家,废话不多说,先上个图,其实是动态的,只是截动态图有点麻烦。 2.代码实现部分      屏幕的动态滚动主要是一个刷新机制

(转载请注明出处:http://blog.csdn.net/buptgshengod

1.介绍

    实现屏幕背景的自动滚动是游戏常遇到的功能,这样我们就不用绘制很长的背景图片,只要设计一张就可以,省时省力。这章将实现这个功能,并把源代码贡献给大家,废话不多说,先上个图,其实是动态的,只是截动态图有点麻烦。

2.代码实现部分

     屏幕的动态滚动主要是一个刷新机制的问题。
第一步,还是进入HelloWorldLayer.h中定义一些节点的对象
#import <GameKit/GameKit.h>

// When you import this file, you import all the cocos2d classes
#import "cocos2d.h"

// HelloWorldLayer
@interface HelloWorldLayer : CCLayer <GKAchievementViewControllerDelegate, GKLeaderboardViewControllerDelegate>
{
    
    CCParallaxNode *backgroundNode;//这个节点是实现滚动的关键节点
    CCSprite *mainBg;    CCSpriteBatchNode *batchNode;        }// returns a CCScene that contains the HelloWorldLayer as the only child+(CCScene *) scene;@end
第二步当然是来到 HelloWorldLayer.m中。
首先来写一下刷新的函数
- (void)updateBackground:(ccTime)dt {
    CGSize size = [CCDirector sharedDirector].winSize;
    
    CGPoint backgroundScrollVel = ccp(-size.width, 0);
    backgroundNode.position =
    ccpAdd(backgroundNode.position,
           ccpMult(backgroundScrollVel, dt));
    CGSize winSize = [CCDirector sharedDirector].winSize;
    
    
    NSArray *backgrounds = [NSArray arrayWithObjects:mainBg,nil];
    for (CCSprite *background in backgrounds) {
        if ([backgroundNode convertToWorldSpace:background.position].x < -background.contentSize.width) {
           //if中判断是如果屏幕超出图片范围 
            backgroundNode.position = ccp(winSize.width*4,0);//图片就以这个速度移动
        }
    }
}
接着,将上一个函数加到update中,实现实时更新。
//实时更新
- (void)update:(ccTime)dt {
    
    [self updateBackground:dt];
   }
修改init函数
-(id) init
{
	// always call "super" init
	// Apple recommends to re-assign "self" with the "super's" return value
	if( (self=[super init]) ) {
		CGSize winSize = [CCDirector sharedDirector].winSize;
        
        // 1) 创建 CCParallaxNode视差滚动节点
        backgroundNode = [CCParallaxNode node];
        [self addChild:backgroundNode z:-2];
        
        // 2) 创建需要添加到CCParallaxNode视差滚动节点的精灵对象
        
        mainBg = [CCSprite spriteWithFile:@"bg.png"];
        // 3) 设置云彩的浮动速度 和背景速度
       
        CGPoint bgSpeed = ccp(0.05, 0.05);
        
        
        // 4) 将精灵对象添加为CCParallaxNode视差滚动节点的子节点
        [backgroundNode addChild:mainBg z:-1
                   parallaxRatio:bgSpeed
                  positionOffset:ccp(200,winSize.height*0.5)];
        
         [self scheduleUpdate];//调用update,注意了,这个调用方法很奇特
        	}
	return self;
}

源代码资源下载地址




目录
相关文章
|
存储
mPaaS一直报Config License验证失败的错误
mPaaS一直报Config License验证失败的错误
817 2
|
存储 网络协议 Java
网络通信的核心机制:Socket如何实现高效数据传输(上)
网络通信的核心机制:Socket如何实现高效数据传输
|
7月前
|
存储 人工智能 Kubernetes
ACK Gateway with AI Extension:面向Kubernetes大模型推理的智能路由实践
本文介绍了如何利用阿里云容器服务ACK推出的ACK Gateway with AI Extension组件,在Kubernetes环境中为大语言模型(LLM)推理服务提供智能路由和负载均衡能力。文章以部署和优化QwQ-32B模型为例,详细展示了从环境准备到性能测试的完整实践过程。
|
7月前
随机二次元背景毛玻璃个人导航HTML源码
随机二次元背景毛玻璃个人导航HTML源码
632 18
|
运维 网络协议 Linux
【专栏】 20 个 Linux 命令,运维工程师工作时最常用的
【4月更文挑战第28天】本文介绍了运维工程师常用的20个Linux命令,包括`ls`、`cd`、`pwd`、`mkdir`、`rm`、`cp`、`mv`、`cat`、`more`、`less`、`head`、`tail`、`grep`、`find`、`chmod`、`chown`、`chgrp`、`ps`、`top`和`ifconfig`,帮助提升工作效率。此外,还提到了其他常用的命令如`df`、`free`、`tar`、`ssh`、`scp`、`ping`、`netstat`、`iptables`、`systemctl`、`hostname`等,建议运维人员掌握以应对各种运维场景。
1360 1
|
Java Linux
Flume【环境搭建 01】CentOS Linux release 7.5 安装配置 apache-flume-1.9.0 并验证
【2月更文挑战第16天】Flume【环境搭建 01】CentOS Linux release 7.5 安装配置 apache-flume-1.9.0 并验证
256 0
|
Web App开发 XML 数据可视化
MathML详解
MathML(数学标记语言)是一种基于XML的语言,用于在Web页面中结构化地展示数学公式和符号。它通过内容模型和表现模型描述数学表达式的语义和排版,广泛应用于教育、科学出版等领域,并支持屏幕阅读器提升可访问性。尽管现代浏览器如Firefox对其支持良好,但在某些浏览器中可能需额外插件才能正确渲染。MathML的优点包括结构化表示和高可读性,但也存在一定的学习曲线和兼容性问题。
|
存储 API 开发者
【 uniapp - 黑马优购 | 登录与支付 1】登录组件布局实现、用户信息布局与渲染
【 uniapp - 黑马优购 | 登录与支付 1】登录组件布局实现、用户信息布局与渲染
284 0
|
算法 安全 网络安全
|
JavaScript 前端开发 Java
小笔记:如何使用代码注释:关于JavaScript与TypeScript 注释和文档的自动生成
小笔记:如何使用代码注释:关于JavaScript与TypeScript 注释和文档的自动生成
1046 0