Cocos 随写

   	auto listenter = EventListenerTouchOneByOne::create();//设置单点触摸
	listenter->onTouchBegan = [](Touch* pTouch, Event* event)->bool
	{
		Point pos1 = pTouch->getLocation();// 3D 坐标
		Point Pos2 = pTouch->getLocationInView();//2D 坐标
		Point pos3 = Director::getInstance()->convertToGL(Pos2);//cocos 坐标

		CCLOG("TouchBegin pos1.x = %lf, pos1.y = %lf",pos1.x, pos1.y);
		CCLOG("TouchBegin pos2.x = %lf, pos2.y = %lf",Pos2.x, Pos2.y);
		CCLOG("TouchBegin pos3.x = %lf, pos3.y = %lf",pos3.x, pos3.y);

		return true;
	};
    
	listenter->onTouchMoved = [](Touch* , Event* e)
	{
		CCLOG("OnTuchMoved");
	};

	listenter->onTouchEnded = [](Touch*, Event* e)
	{
		CCLOG("OnTouchEnded");
	};

	_eventDispatcher->addEventListenerWithSceneGraphPriority(listenter, this);

2
	Size VisibleSize = Director::getInstance()->getVisibleSize();

	Sprite* p1 = Sprite::create("Images/grossinis_sister1.png");
	p1->setPosition(Point(VisibleSize.width * 0.5f-5, VisibleSize.height * 0.5f));
	this->addChild(p1,1);

	Sprite* p2 = Sprite::create("Images/grossinis_sister2.png");
	p2->setPosition(Point(VisibleSize.width * 0.5f+5, VisibleSize.height * 0.5f));
	this->addChild(p2,0);

	auto Listenter = EventListenerTouchOneByOne::create();
	Listenter->setSwallowTouches(true);//设置吞没事件

	Listenter->onTouchBegan = [](Touch* pTouch, Event* pEvent)
	{
		auto target = static_cast<Sprite*>(pEvent->getCurrentTarget());
		Point Pos = Director::getInstance()->convertToGL(pTouch->getLocationInView());

		if(target->getBoundingBox().containsPoint(Pos))//判断是否在精灵中
		{
			target->setOpacity(100);//设置透明度100
			return true;
		}
		return false;
	};

	Listenter->onTouchEnded = [](Touch* pTouch, Event* pEvent)
	{
		auto Target =(Sprite*) pEvent->getCurrentTarget();
		Target->setOpacity(255);

	};

	_eventDispatcher->addEventListenerWithSceneGraphPriority(Listenter, p1);
	_eventDispatcher->addEventListenerWithSceneGraphPriority(Listenter->clone(), p2);

<think>嗯,用户想了解Cocos Creator的生命周期。根据提供的引用内容,我需要系统地整理各个生命周期函数的特点和执行顺序。 引用[1]和[2]明确了完整的生命周期链条:onLoad -> onEnable -> start -> update -> lateUpdate -> onDisable -> onDestroy。这里注意到几个关键点: - onLoad只会在节点首次激活时触发一次,适合初始化操作 - onEnable/onDisable会随组件启用状态反复触发 - start在首次update前执行,比onLoad更适合依赖其他组件的初始化 引用[3][4]的代码示例很有参考价值: - onLoad()里console.log验证了节点激活时执行的特性 - update/deltaTime参数说明适合放帧率敏感逻辑 - 特别要注意引用[5]提到的陷阱:复用节点时onLoad/start不会重新触发,可能导致事件监听失效 用户可能是刚接触Cocos的开发者,需要强调实践中的常见问题: - 为什么事件监听在onEnable比onLoad更可靠 - 物理运算应该放在update还是lateUpdate - 销毁节点时onDestroy和onDisable的调用差异 相关问题的设计要侧重实用性: 1 函数执行顺序的验证方法很必要,新手容易混淆onLoad和start 2 组件复用时的事件监听失效是典型坑点 3 性能优化方向对中高级开发者有帮助 </think>以下是根据引用内容整理的 Cocos Creator 生命周期详解及核心要点: ### 一、生命周期函数及执行顺序(完整流程) 1. **`onLoad()`** - 触发条件:节点首次激活时(`activeInHierarchy = true`) - 特性:**整个生命周期仅触发一次** - 用途:初始化组件数据(如加载资源、绑定变量)[^1][^4] 2. **`onEnable()`** - 触发条件:组件从禁用(`enabled=false`)变为启用(`enabled=true`),或节点从非激活(`active=false`)变为激活(`active=true`) - 特性:**可多次触发**(随启用状态变化) - 用途:注册事件监听(如触摸事件)[^1][^5] 3. **`start()`** - 触发条件:节点首次激活后,在第一次 `update()` 前 - 特性:**仅触发一次** - 用途:依赖其他组件的初始化(如获取子节点引用)[^1][^2] 4. **`update(dt)`** - 触发频率:**每帧调用**(渲染前) - 参数:`dt` 为距离上一帧的时间(秒) - 用途:核心游戏逻辑更新(如角色移动、战斗计算)[^1][^3] 5. **`lateUpdate(dt)`** - 触发频率:每帧调用(渲染后) - 用途:依赖其他组件结果的逻辑(如跟随摄像机)[^1][^3] 6. **`onDisable()`** - 触发条件:组件被禁用或节点被设为非激活 - 特性:与 `onEnable()` 对应 - 用途:**注销事件监听**(避免内存泄漏)[^1][^5] 7. **`onDestroy()`** - 触发条件:节点被销毁时 - 特性:**仅触发一次** - 用途:释放资源(如取消网络请求)[^1][^3] --- ### 二、关键注意事项 1. **复用节点陷阱** 通过 `addChild()` 复用节点时: - ❌ `onLoad` 和 `start` **不会重新触发** - ❌ `onEnable` 中的事件监听会**失效**(需手动重新绑定)[^5] 2. **执行顺序验证** 完整调用链: $$ \text{onLoad} \rightarrow \text{onEnable} \rightarrow \text{start} \rightarrow \text{update} \rightarrow \text{lateUpdate} \rightarrow \text{onDisable} \rightarrow \text{onDestroy} $$ [^2] 3. **初始化函数选择** | 函数 | 触发次数 | 依赖节点状态 | 典型场景 | |----------|----------|--------------|------------------------------| | `onLoad` | 1次 | 节点激活时 | 基础数据初始化 | | `start` | 1次 | 首次激活后 | 需要其他组件参与的初始化[^3] | --- ### 三、代码示例(验证生命周期) ```typescript import { Component } from 'cc'; @ccclass('LifecycleDemo') export class LifecycleDemo extends Component { onLoad() { console.log("1. onLoad - 资源加载"); } onEnable() { console.log("2. onEnable - 注册事件"); } start() { console.log("3. start - 获取子节点"); } update(dt: number) { console.log(`4. update - 帧更新, dt=${dt}`); } onDisable() { console.log("5. onDisable - 移除事件"); } onDestroy() { console.log("6. onDestroy - 释放资源"); } } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值