Cocos2d-android 学习笔记

本文深入解析Cocos2d开发流程,从SurfaceView到CCDirector,涵盖SurfaceHolder、Surface、FPS管理、点、CopyOnWriteList、Rect等关键概念。同时介绍了CCDirector的管理、场景与SurfaceView交互、CCSecene、CCLayer、CCSprite、CCLabel等组件的使用,以及Cocos2d中图像资源、坐标系统、动画、触控事件、地图制作、地图移动、粒子系统、声音引擎等核心功能。此外,还详细讲解了游戏暂停、界面切换、菜单操作、游戏进度管理、植物VS僵尸对战处理、地图展示、植物选择、游戏开始前准备、对战处理等高级应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*

SurfaceView 
	getHolder() -->SurfaceHolder

SurfaceHolder 代理者 代理Surface完成界面相关的操作
	getSurface
	lockCanvas()
	unlockCanvasAndPost(Canvas c) 放在finally块中
	


Surface
	lockCanvas()
	lockCanvas(Rect dirty) --> Canvas 锁定一个矩形区域当作画布
	                                  花东西
	unlockCanvas(Canvas c)		  解锁,更新界面

	
FPS : 帧率  >=30 性能的最低要求

Point  
	x   y  
 
CopyOnWriteList

Rect 
	contain(x,y)

Cocos2d_Android

CCDirector  管理场景  与SurfaceView 打交道 derived from CCDirector.sharedDirector()
	attachInView() 开启绘制线程 
	runWithScene(scene)
	replaceScene(scene)
	setDisplayFPS(true)
	onResume() onPause() end()
	setDeviceOrientation(CCDirector.kCCDiviceOrientation...)
	setScreenSize(x,y); 480 320
	getWinSize()
	


CCSecene  derived from CCSecene.node()

	addChild(layer)  把树根与树枝连在一起
	作为parents存在


在一个场景所以的CCLayer中,有且只有一个CCLayer可以处理touch事件
CCLayer  extends CCNode implements CCTouchDelegateProtocol
	addChild(leaf)
	setScaleX() setScaleY()  setScale() 

	setIsTouchEnabled(true)
	主要处理 CCTouchDelegateProtocol 里面的方法
	ccTouchesBegan() 按下 
	ccTouchesMoved()
	ccTouchesCancel

	convertTouchToNodeSpace(MotionEvent)
	

	坐标原点在左下角
	图片的锚点 默认在图片的中心

	setAnchorPoint(0,0)
	坐标的计算越简单越好

	图片位置的确定 结合锚点和坐标综合定位

CCSprite  derived from CCSprite.sprite(filepath)  assets文件夹上的图片资源
	setFlipX(true) 在x轴上的镜像
	setPosition(CGPoint) CGPoint deprived from CGPoint.ccp(x,y);
	
	addChild() 按照添加的顺序决定显示的优先级 默认后添加的优先级高
	addChild(child,priority);priority表示在z轴的位置
	addChild(child,priority,tag);priority表示在z轴的位置
	getChildByTag();
	getBoundingBox()-->CGRect
	serOpacity(0--255)
	setVisible()
	removeSelf();
	runAction()
	stopAllActions()
	
	--CCLabel --> CCLabel.makeLable(text,font,fontsize);  .ttf 放置于assets目录下
		setColor(color)
	


fps_images.png cocos2d需要的图片  所以要把这张图片放在自己的assets目录下

CCNode 

CGRect  static containsPoint(aRect,Point)

CCAction 
	--CCFiniteTimeAction 受时间限制的动作

		--CCInstantAction 瞬时当作

		--CCIntervalAction 瞬时当作

			--CCMoveTo derived from CCMoveTo.action(float time,CGPoint pos)

			--CCMoveBy derived from CCMoveBy.action(float time,CGPoint pos) 相对移动
				reverse();
			CCSequence CCSequence.actions(...actions)
			
			--CCJumpBy -->CCJumpBy.action(time,goal_position,height,jumps)height实际的最高点

			--CCBezierBy -->CCBezierBy.action(time,CCBezierConfig)  
				CCBezierConfig.centrolPoint_1  CCBezierConfig.centrolPoint_2(最高点) CCBezierConfig.endPosition

			--CCEaseAction 
				--CCEaseIn-->CCEaseIn.action(action,rate) 加速
				--CCEaseOut-->CCEaseIn.reverse()
			
			--CCScaleBy -->CCScaleBy.action(int time,int scale); scale 缩放的比例

			--CCRotateBy --> CCRotateBy.action(time,angle) 总是顺时针
			--CCRotateTo --> CCRotateTo.action(time,angle) >180 逆时针转 偷懒
			--CCTintBy (颜色渐变) CCTintBy.action(time,color) ccColor3B-->ccColor3B.ccc(r,g,b)
			--CCBlink  (闪烁动画) CCBlink.action(time,blinkTimes)
			--CCHide --> CCHide.action();
			--CCShow --> CCShow.action();
			CCDelayTime() 停歇动画
			起点 终点 时间间隔 

	以下三个都不受时间限制
	--CCFollow  跟着一个CCNode 跑  layer follow a hero 

	--CCRepeatForever 应用场景 行走的序列帧播放
		CCRepeatForever.action(action)

	--CCSpeed 游戏速度的控制 


当作组合  串联当作
	CCSpawn --> CCSpawn.actions(actions,params) actions 串联 一个或多个params 
		reverse()


地图的制作
	.tmx
	图片要用相对路径
	name must be English
	对象层的数据存储需要注意顺序
	
	地图的加载
	CCTMXTiledMap --> CCTMXTiledMap.tiledMap(tmxFile) tmxFile in assets

	地图解析
	CCTMXObjectGroup -->CCTMXTiledMap.objectGroupName(name)
		objects --> ArrayList<HashMap<String,String>>

	CCCallFunc-->CCCallFunc.action(target,selector) target.getClass().getMethod(selector) public method
	CGPointUtil.distance(pos1,pos2)

序列帧的播放
	CCAnimate -->CCAnimate.action(CCAnimation anim)
	CCAnimation --> CCAnimation.animation(name,delay,ArrayList<CCSpriteFrame> frames)
	CCSpriteFrame --> CCSprite.sprite(filepath).displayFrame()

	String filename = "z_0%d.png"  String.foormat(filename,num);
	String filename = "z_%02d.png" (1--99) String.foormat(filename,num);

粒子系统  
	CCParticleSystem --> 
		--CCParticleSnow  -->CCParticleSnow.node();
			setTexture(CCTextureCache.sharedTextureCache().addImage(imgUrl))  in assets
			stopSystem()
	ParticleDesigner   .plist

声音引擎 
	音乐+音效 MediaPlayer + SoundPool

	SoundEngine-->sharedSoundEngine()
		playSound(ctxt,resID,isLoop)

地图移动
	大地图移动 
		CCFollow   CCFollow action follow hero
			action(CCNode)  
	小地图的移动
		setIsTouchEnable(true)
		override ccTouchesMoved(MotionEvent event)
			gameMap.touch
	如果需要手动移动地图 必须将地图的锚点设置成中心点 修改地图的坐标(中心)
	
	gameMap.getContentSize() -->CGSize
	gameMap.addChild(sprite) 将地图和精灵绑在一起
	gameMap.getParent() -->layer
	

游戏暂停
	主layer DemoLayer 和 处理的暂停的layer PauseLayer

	override ccTouchBegan()-->显示暂停layer 冻结主layer 
	
	关于暂停layer的添加 必须添加到场景中
	
	this.getParent.addChild()  this-->主layer
	this.onExit();

	游戏继续
	PauseLayer.removeSelf()
	DemoLayer.this.onEnter()

	
植物VS僵尸
	展示logo 停顿一会 隐藏logo 停顿一会
	背景图片加载 进度条处理
	耗时操作: 访问网络 版本检测 预加载图片 预加载声音文件


欢迎界面 
	展示FPS  引入图片(切记) 设置屏幕方向 设置屏幕大小 activity全屏

	CCAnimate.action(animation,boolean stroe); 第二个参数取false 表示只播放一次序列帧
	Layer.getChildByTag()

界面切换
	切换场景
	淡入淡出 CCFadeTransition.transition(time,CCScene);	
	derector.replaceScene(transition)

菜单操作
	CCMenu -->CCMenu.menu();
		--addChild(CCMenuItemSprite item)
	CCMenuItemSprite  --> CCMenuItemSprite.item(CCNode normalSprite,CCNode selectedSprite,CCNode target, String selector); public void selector(Obect o) 要加参数 指明哪个精灵被激活了
	
	
地图展示(不能处理用户touch)
	展示对战对图(展示时间)--> 加载展示用的僵尸(展示用的点位) --> 移动地图(停留一会) --> 展示两个容器
	
植物选择(处理用户touch)
	加载玩家已经获取到的植物信息 --> 选择植物 --> 取消植物 --> 点击一起摇滚
	
游戏开始前的准备工作(不能处理用户touch) 
	回收玩家已有的植物容器 --> 移动地图 --> 回收展示用的僵尸 --> 播放序列帧: 准备 安放 植物
	
对战处理(处理用户touch)
	
	对战处理 用户可以touch
	对战元素分析+战场划分
	公共部分+分支
	公共部分:元素创建+元素的销毁及存活过程中的动作信息+死亡监听
		分支处理: 植物+僵尸+产物
			植物
				生产型植物+攻击型植物+防御型植物
				向日葵 普通豌豆射手 坚果墙
			僵尸: 
				按等级划分 初级僵尸 终极僵尸
			产物: 
				子弹+阳光
	
	添加僵尸 (集合)
		lineNum * 2  是起点 lineNum * 2 + 1 是终点

	安放僵尸
	僵尸攻击植物 (判断当前所在的块内是否有植物)
		记录僵尸的工作状态 boolean
		如果僵尸正在攻击 
		停止僵尸所有的动作
		播放僵尸攻击的序列帧
		造成植物的持续性杀伤
		

	植物攻击僵尸   攻击型植物的集合 + 僵尸的集合中是否有僵尸

	辅助功能
		阳关管理
		游戏进度:游戏的整体进度(植物冷冻 整体进度)


	安放植物 
		位置计算 ( 16 + ((id - 1) % rowNum) * 54 , 175 - ((id - 1)/rowNum) *59 )

	CGPointUtil.distance(Pos1,Pos2);

	每隔多长时间做上面事情
	CCSchedule --> CCSchedule.sharedSchedule.schedule(selector,target,float interval, boolean paused)  
			selector方法要带一个float 参数 --> selector(float t){}
		

	停止timer: CCSchedule.sharedSchedule.unSchedule(selector,target)


	游戏进度
	CCProgressTimer --> CCProgressTimer.progressWithFile("res")
		--setYype(int newType) 
		--setPercentage(float percent)

	
	

CCGLSurfaceView



*/

内容概要:本文档主要展示了C语言中关于字符串处理、指针操作以及动态内存分配的相关代码示例。首先介绍了如何实现键值对(“key=value”)字符串的解析,包括去除多余空格和根据键获取对应值的功能,并提供了相应的测试用例。接着演示了从给定字符串中分离出奇偶位置字符的方法,并将结果分别存储到两个不同的缓冲区中。此外,还探讨了常量(const)修饰符在变量和指针中的应用规则,解释了不同类型指针的区别及其使用场景。最后,详细讲解了如何动态分配二维字符数组,并实现了对这类数组的排序与释放操作。 适合人群:具有C语言基础的程序员或计算机科学相关专业的学生,尤其是那些希望深入理解字符串处理、指针操作以及动态内存管理机制的学习者。 使用场景及目标:①掌握如何高效地解析键值对字符串并去除其中的空白字符;②学会编写能够正确处理奇偶索引字符的函数;③理解const修饰符的作用范围及其对程序逻辑的影响;④熟悉动态分配二维字符数组的技术,并能对其进行有效的排序和清理。 阅读建议:由于本资源涉及较多底层概念和技术细节,建议读者先复习C语言基础知识,特别是指针和内存管理部分。在学习过程中,可以尝试动手编写类似的代码片段,以便更好地理解和掌握文中所介绍的各种技巧。同时,注意观察代码注释,它们对于理解复杂逻辑非常有帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值