cocos2d-x 3.x(C++)实现屏幕震动效果
来源:互联网 发布:hadoop 属于java吗 编辑:程序博客网 时间:2024/05/17 08:59
源码下载
1.新建一个ShakeLayer类文件
分别在项目中添加:ShakeLayer.h,ShakeLayer.cpp文件
2.在ShakeLayer.h文件中写如代码如下:
#ifndef __SHAKELAYER_HEAD__#define __SHAKELAYER_HEAD__#include "cocos2d.h"//声明一个结构体类型FPointstruct FPoint { float x; float y;};class ShakeLayer:public cocos2d::Layer{public: ShakeLayer(); ~ShakeLayer(); CREATE_FUNC(ShakeLayer); static cocos2d::Scene* createScene(); virtual bool init();public: void loadBg();public: void ShakeScreen(); //屏幕震动函数 void UpdateShakeScreen(float delta_time); //屏幕震动的调度 void clickEventFun(); //按钮点击事件public: FPoint shake_offset_; //偏移量 float since_last_frame_; int current_shake_frame_; bool shake_screen_; };#endif
3.ShakeLayer.cpp添加代码如下:
#include "ShakeLayer.h"#include "ui/cocosGUI.h"USING_NS_CC;using namespace ui;const float kShakeFPS = 30.f; //震动频率控制系数const int kShakeFrames = 20; //总判断次数ShakeLayer::ShakeLayer(){ //构造函数对其进行初始化 shake_offset_.x = 0; shake_offset_.y = 0; since_last_frame_ = 0; current_shake_frame_ = 0; shake_screen_ = false;}ShakeLayer::~ShakeLayer(){ this->removeAllChildren();}//创建震动层的场景(布景层是不可能脱离场景而单独存在的)Scene* ShakeLayer::createScene(){ //1.创建一个场景 Scene* shakeScene = Scene::create(); //2.创建一个层 ShakeLayer* layer = ShakeLayer::create(); //3.将帮助层添加到新建的场景 shakeScene ->addChild(layer); //4.返回这个场景 return shakeScene;}//主函数bool ShakeLayer::init(){ if (!Layer::init()) { return false; } //添加背景 loadBg(); return true;}//添加背景void ShakeLayer::loadBg(){ //添加一个自定义类型的时间调度器((每隔0.1秒)刷新一次) schedule(schedule_selector(ShakeLayer::UpdateShakeScreen),0.1); Size winSize = Director::getInstance()->getWinSize(); Sprite* bgSpr = Sprite::create("Scene/shake.png"); bgSpr->setPosition(Vec2(winSize.width/2,winSize.height/2)); addChild(bgSpr); Button* btn_shake = Button::create("Scene/btn.png"); btn_shake->setPosition(Vec2(winSize.width/2,winSize.height/2)); addChild(btn_shake); //点击按钮开始震动 btn_shake->addClickEventListener(CC_CALLBACK_0(ShakeLayer::clickEventFun,this));}void ShakeLayer::clickEventFun(){ ShakeScreen();}void ShakeLayer::ShakeScreen(){ shake_offset_.x = 0.f; //x轴抖动偏移量 shake_offset_.y = 0.f; //y轴抖动偏移量 since_last_frame_= -1.f; //控制震动的频率(每经过几次kSpeed帧,进行一次有效震动) current_shake_frame_ = 0; //判断震动的总次数(总共是kShakeFrames=20次) shake_screen_ = true; //是否震动 }void ShakeLayer::UpdateShakeScreen(float delta_time){ if (!shake_screen_) return; if (since_last_frame_ == -1.f)since_last_frame_ = 0.f; else { since_last_frame_ += delta_time; } static const float kSpeed = 1.0 / kShakeFPS; printf("kSpeed=%f,since_last_frame_=%f\n", kSpeed,since_last_frame_); while (since_last_frame_ >= kSpeed) { since_last_frame_ -= kSpeed; if (current_shake_frame_ + 1 == kShakeFrames) { shake_screen_ = false; shake_offset_.x = 0; //x轴抖动偏移量 shake_offset_.y = 0; //y轴抖动偏移量 break; } else { ++current_shake_frame_; //判断震动次数+1 shake_offset_.x = rand() % 2 == 0 ? (10.f + rand() % 5) : (-10.f - rand() % 5); shake_offset_.y = rand() % 2 == 1 ? (10.f + rand() % 5) : (-10.f - rand() % 5); } printf("current_shake_frame_ = %d\n", current_shake_frame_); } this->setPosition(Vec2(shake_offset_.x, shake_offset_.y));}
4.验证效果:
两种方式:
第一种:
在新建项目的AppDelegate.cpp中引入头文件:
#include "ShakeLayer.h"
找到
auto scene = HelloWorldScene::createScene(); director->runWithScene(scene);
改为
auto scene = ShakeLayer::createScene(); director->runWithScene(scene);
第二种:
在当前场景中添加ShakeLayer层:
在当前场景的头文件中引入
#include "ShakeLayer.h"
在当前场景的init()中:
ShakeLayer* shake_layer = ShakeLayer::create();this->addChild(shake_layer);
点击震动按钮看一下震动效果吧!!!
先自我满足一下,如有更好方法!请不吝赐教,感激不尽。
源码下载点这里哦!
############################################写于——扬扬在路上
0 0
- cocos2d-x 3.x(C++)实现屏幕震动效果
- 模拟屏幕震动效果,使用cocos2d-x 3.x
- Cocos2d-x移植android加入震动效果
- Cocos2d-x移植android加入震动效果
- 怎么用 Cocos2d- 3.x 实现 手机震动
- cocos2d-x 场景震动
- quick-cocos2d-x(lua) 拖动精灵使其在屏幕移动的效果实现
- Cocos2d-x JNI使用--震动
- 【Cocos2d-x】实现翻牌效果
- cocos2d-x实现亮片效果
- cocos2d-x实现打字机效果
- 【Cocos2d-x 3.x】屏幕自适应匹配
- 屏幕震动的效果实现
- Unity 屏幕震动效果实现
- Unity 屏幕震动效果实现
- 学习cocos2d-x之路(5)--实现屏幕滚动
- cocos2d-x实现简易屏幕截图功能
- cocos2d-x 屏幕旋转
- 个人收藏的资料链接及知识库
- Android基础之Activity的详解
- [备忘]模拟生成服务器返回JSON格式数据
- hadoop中hdfs主节点会储存数据吗?
- 写文章、做PPT的总结
- cocos2d-x 3.x(C++)实现屏幕震动效果
- bringSubviewToFront无效、不好使
- 斐波拉契数列的三种写法
- spring 通配符大全
- PythonTip(1~5)题详解
- 产生随机数的一些方法
- AngularJS实现跨域访问
- 数据库连接池的工作原理
- 数据结构(四) 串