LQK   L Q K
Cocos2d-x 错误与指令 ffmpeg 视频剪辑转码 Linux 使用的指令

Errors: Cocos2d-x v4.0 在xCode 里出现Reference to non-static member function must be called

this->schedule(schedule_selector(GamePlaying::updateGame),0.01f);

auto staticUpdatePtr = static_cast(&GamePlaying::updateGame);

this->schedule(staticUpdatePtr,0.01f);


Game Codes: Cocos2d-x 贝塞尔曲线在游戏应用

Examples:


ccBezierConfig tr0;
tr0.endPosition=ccp(280, 240);
tr0.controlPoint_1=ccp(40, 400);
tr0.controlPoint_2=ccp(280, 80);
CCActionInterval* bezierForward = CCBezierBy::create(1.f, tr0);


Game Codes: Cocos2d-x 计算两点之间的夹角

实现一个发射子弹的方法 子弹的朝向的角度会根据发射的终点和起点变化。
auto sp = Sprite::create("bullet.png");
Vec2 endPos = Vec2(200, 500);
Vec2 startPos = Vec2(100, 50);
auto move = MoveTo::create(5, endVec2);
sp->runAction(move);
//计算角度
Vec2 dis = endPos - startPos;
sp->setRotation(Vec2(dis.y, dis.x).getAngle() / 3.14f * 180);//一定注意x和y参数是倒过来的
//这样发射出去的子弹就会朝向终点了


COCOS2DX3.0的3种触摸响应机制

第一种是采用函数回调,主要是用于MenuItem

  1. // a selector callback
  2. void menuCloseCallback(Object* pSender);
  3. auto closeItem = MenuItemImage::create("CloseNormal.png","CloseSelected.png",
  4. CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
  5. void HelloWorld::menuCloseCallback(Object* pSender)
  6. {
  7. Director::getInstance()->end();
  8. #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
  9. exit(0);
  10. #endif
  11. }

 

第二种方法TouchEvent响应

  1. //声明
  2. void touchButton(Object* object,TouchEventType type);
  3. //挂接到控件上
  4. uiButton->addTouchEventListener(this,toucheventselector(HelloWorld::touchButton));
  5. //实现
  6. void HelloWorld::touchButton(Object* object,TouchEventType type)
  7. {
  8. LabelTTF* label;
  9. switch (type)
  10. {
  11. case TouchEventType::TOUCH_EVENT_BEGAN:
  12. label = static_cast<LabelTTF*>(getChildByTag(11));
  13. label->setString("按下按钮");
  14. break;
  15. case TouchEventType::TOUCH_EVENT_MOVED:
  16. label = static_cast<LabelTTF*>(getChildByTag(11));
  17. label->setString("按下按钮移动");
  18. break;
  19. case TouchEventType::TOUCH_EVENT_ENDED:
  20. label = static_cast<LabelTTF*>(getChildByTag(11));
  21. label->setString("放开按钮");
  22. break;
  23. case TouchEventType::TOUCH_EVENT_CANCELED:
  24. label = static_cast<LabelTTF*>(getChildByTag(11));
  25. label->setString("取消点击");
  26. break;
  27. default:
  28. break;
  29. }
  30. }

 

第三种 触摸监听绑定

  1. auto listener1 = EventListenerTouchOneByOne::create();//创建一个触摸监听
  2. listener1->setSwallowTouches(true);//设置是否想下传递触摸
  3. Rect rect = Rect(qipanPoint.x,qipanPoint.y
  4. ,qipanSize.width,qipanSize.height);
  5. //3.0 后可以直接在touchBegan后添加它的实现代码,而不用特意去写一个touchBegan的函数
  6. listener1->onTouchBegan = [rect,this](Touch* touch, Event* event){ //[]中间的是传入的参数
  7. auto target = static_cast<Sprite*>(event->getCurrentTarget());//获取的当前触摸的目标
  8. Point locationInNode = target->convertToNodeSpace(touch->getLocation());
  9. Size s = target->getContentSize();
  10. if (rect.containsPoint(locationInNode))//判断触摸点是否在目标的范围内
  11. { //以下是我自定义的一些操作
  12. //创建锁定精灵
  13. auto lockSprite = Sprite::create("lock.png");
  14. lockSprite->setPosition(GetQiziPoint(locationInNode,rect));
  15. lockSprite->setTag(99);
  16. this->addChild(lockSprite);
  17. return true;
  18. }else
  19. return false;
  20. };
  21. //拖动精灵移动
  22. listener1->onTouchMoved = [rect,this](Touch* touch, Event* event){
  23. auto target = static_cast<Sprite*>(event->getCurrentTarget());//获取的当前触摸的目标
  24. Point locationInNode = target->convertToNodeSpace(touch->getLocation());
  25. Size s = target->getContentSize();
  26. if (rect.containsPoint(locationInNode))//判断触摸点是否在目标的范围内
  27. {
  28. //锁定精灵移动
  29. Sprite *lockSprite = (Sprite*)this->getChildByTag(99);
  30. lockSprite->setPosition(GetQiziPoint(locationInNode,rect));
  31. }
  32. };
  33. listener1->onTouchEnded = [=](Touch* touch, Event* event){ // =在c++11里面代表这个lambda表达式中能使用外面的变量
  34. this->removeChildByTag(99);//移除锁定精灵
  35. };
  36. //将触摸监听添加到eventDispacher中去
  37. _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1 ,layer);

Create Projects: Cocos2d-x cmake 创建项目

Examples:
$ mkdir win32-build
$ cd win32-build
$ cmake .. -G"Visual Studio 16 2019" -Tv142 -A win32


Cocos2d-x 4.0 Win10 Android Studio环境搭建

下载安装python 2.7

下载安装Cocos2d-x 4.0

E:\dev\cocos2d-x-4.0>python ./setup.py

Setting up cocos2d-x...

->Check environment variable COCOS_CONSOLE_ROOT

->Search for environment variable COCOS_CONSOLE_ROOT...

->COCOS_CONSOLE_ROOT not found

 

->Add directory "E:\dev\cocos2d-x-4.0\tools\cocos2d-console\bin" into PATH succeed!

 

-> Add COCOS_CONSOLE_ROOT environment variable...

->Added COCOS_CONSOLE_ROOT=E:\dev\cocos2d-x-4.0\tools\cocos2d-console\bin

 

->Check environment variable COCOS_X_ROOT

->Search for environment variable COCOS_X_ROOT...

->COCOS_X_ROOT not found

 

->Add directory "E:\dev" into PATH succeed!

 

-> Add COCOS_X_ROOT environment variable...

->Added COCOS_X_ROOT=E:\dev

 

->Check environment variable COCOS_TEMPLATES_ROOT

->Search for environment variable COCOS_TEMPLATES_ROOT...

->COCOS_TEMPLATES_ROOT not found

 

->Add directory "E:\dev\cocos2d-x-4.0\templates" into PATH succeed!

 

-> Add COCOS_TEMPLATES_ROOT environment variable...

->Added COCOS_TEMPLATES_ROOT=E:\dev\cocos2d-x-4.0\templates

 

->Configuration for Android platform only, you can also skip and manually edit your environment variables

 

->Check environment variable NDK_ROOT

->Search for environment variable NDK_ROOT...

->NDK_ROOT is found : D:\android-ndk-r10d

 

->Check environment variable ANDROID_SDK_ROOT

->Search for environment variable ANDROID_SDK_ROOT...

->ANDROID_SDK_ROOT is found : E:\android-sdk-windows

 

创建项目

cocos new CandyMatch3 -p com.vworldtech.match3candy -l cpp -d E:\dev\CandyMatch3

 

搭建开发环境 - Android 平台

https://docs.cocos.com/cocos2d-x/manual/zh/installation/Android-Studio.html

 

Android Studio更新gradle等软件

导入项目

app/jni/application.mk 修改为 APP_STL := c++_static

gradle.properties

PROP_COMPILE_SDK_VERSION=28

PROP_MIN_SDK_VERSION=14

PROP_TARGET_SDK_VERSION=24

PROP_APP_PLATFORM=14

PROP_APP_ABI=armeabi-v7a

app/build.gradle

注释掉 //arguments 'NDK_TOOLCHAIN_VERSION=4.9'

修改buildToolsVersion "28.0.3"

proj.android-studio/build.gradle修改

allprojects {

repositories {

jcenter()

+ google()

}

}

SDKBOX

安装时需要连接VPN,否则可能报SSL CERTIFICATE_VERIFY_FAILED相关的错误

安装sdk时提示路径错误,先在proj.android-studio目录下创建临时文件/夹,安装完成后再移到proj.android-studio/app目录下

[app/*.iml文件将app/sdkbox等3个目录改为app/jni/sdkbox]

修改AppActivity.java

+ import android.content.Intent;

+ import com.sdkbox.plugin.SDKBox;

protected void onCreate(Bundle savedInstanceState) {

...

+ SDKBox.init(this);

}

添加

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if(!SDKBox.onActivityResult(requestCode, resultCode, data)) {

super.onActivityResult(requestCode, resultCode, data);

}

}

@Override

protected void onStart() {

super.onStart();

SDKBox.onStart();

}

@Override

protected void onStop() {

super.onStop();

SDKBox.onStop();

}

@Override

protected void onResume() {

super.onResume();

SDKBox.onResume();

}

@Override

protected void onPause() {

super.onPause();

SDKBox.onPause();

}

@Override

public void onBackPressed() {

if(!SDKBox.onBackPressed()) {

super.onBackPressed();

}

}

 

Android.mk添加

LOCAL_WHOLE_STATIC_LIBRARIES += PluginAdMob

sdkbox \

PluginSdkboxAds

文件末尾添加(必须末尾、全路径,原因待查)

include absolute_root_path\proj.android-studio\app\jni\CocosAndroid.mk

 

CocosAndroid.mk中包含的重要部分

LOCAL_PATH := $(call my-dir)

$(call import-add-path, $(LOCAL_PATH))

$(call import-module, sdkbox)

$(call import-module, PluginSdkboxAds)

$(call import-module, PluginAdMob)

 

TroubleShooting

Admob: proxy is null可能是sdkbox_config.json格式错误,多检查日志里的error,如果json格式错误会提示

FFMPEG 基本使用方法

##视频信息
ffmpeg -i E:\B\1.mp4
-vcodec 后面是编码格式
ffmpeg -i out.ogv -vcodec h264 out.mp4
ffmpeg -i out.ogv -vcodec mpeg4 out.mp4
ffmpeg -i out.ogv -vcodec libxvid out.mp4
ffmpeg -i out.mp4 -vcodec wmv1 out.wmv

 

##用 -ss 和 -t 选项, 从第 30 秒开始,向后截取 10 秒的视频,并保存:
ffmpeg -i input.wmv -ss 00:00:30.0 -c copy -t 00:00:10.0 output.wmv
##达成相同效果,也可以用 -ss 和 -to 选项, 从第 0 秒截取到第 10 秒:
ffmpeg -i output.mp4 -ss 00:00:00.0 -c copy -to 00:00:10.0 03.mp4
ffmpeg -i output.mp4 -ss 00:00:20.0 -c copy -to 00:00:30.0 05.mp4
剪切的同时,格式不变,音视频参数不变:
ffmpeg -y -i bjysxyt5.mp4 -ss 00:00:00.0 -t 00:01:00.0 -acodec copy -vcodec copy -async 1 bjysxyt1.mp4
剪切的同时,音视频参数不变,只转换格式:
ffmpeg -y -i bjysxyt5.mp4 -ss 00:00:00.0 -t 00:01:00.0 -acodec copy -vcodec copy -async 1 bjysxyt1.flv
剪切的同时,格式不变,只转换音视频参数:
ffmpeg -y -i bjysxyt5.mp4 -ss 00:00:00.0 -t 00:01:00.0 -ab 56k -ar 44100 -b:v 2200k -r 29.97 -s 640x360 bjysxyt1.mp4
剪切的同时,既转换格式又转换音视频参数:
ffmpeg -y -i bjysxyt5.mp4 -ss 00:00:00.0 -t 00:01:00.0 -ab 56k -ar 44100 -b:v 2200k -r 29.97 -s 640x360 bjysxyt1.flv
说明:-i表示输入文件;-acodec copy -vcodec copy 表示音频、视频不进行编解码,直接复制源视频;-ss表示起始时间,-t表示时长,格式均为“小时:分钟:秒”。

 

***改大小
ffmpeg -i input.mp4 -strict -2 -s 640x480 output.mp4 #mp4 要用 -strict -2
ffmpeg -i input.avi -s 640x480 output.avi
改变为源视频一半大小
ffmpeg -i input.mpg -vf scale=iw/2:ih/2 output.mp4
###改变为原视频的90%大小:
ffmpeg -i input.mpg -vf scale=iw0.9:ih0.9 output.mp4
###裁剪输入视频的左三分之一,中间三分之一,右三分之一:
ffmpeg -i input -vf crop=iw/3:ih :0:0 output
ffmpeg -i input -vf crop=iw/3:ih :iw/3:0 output
ffmpeg -i input -vf crop=iw/3:ih :iw/3*2:0 output


FFMPEG 特效

前面都要加$$$$ ffmpeg

//渐入 -i in.mp4 -vf fade=in:0:90 out.mp4

//黑白 -i in.mp4 -vf lutyuv="u=128:v=128" out.mp4

//锐化 -i in.mp4 -vf unsharp=luma_msize_x=7:luma_msize_y=7:luma_amount=2.5 out.mp4

//反锐化 -i in.mp4 -vf unsharp=7:7:-2:7:7:-2 out.mp4

//渐晕 -i in.mp4 -vf vignette=PI/4 out.mp4

//闪烁渐晕 -i in.mp4 -vf vignette='PI/4+random(1)*PI/50':eval=frame out.mp4

//视频颤抖 -i in.mp4 -vf crop="in_w/2:in_h/2:(in_w-out_w)/2+((in_w-out_w)/2)*sin(n/10):(in_h-out_h)/2+((in_h-out_h)/2)*sin(n/7)" out.mp4

//色彩变幻 -i in.mp4 -vf hue="H=2*PI*t: s=sin(2*PI*t)+1" out.mp4 //Rotate hue and make the saturation swing between 0 and 2 over a period of 1 second

//模糊处理 -i in.mp4 -vf boxblur=5:1:cr=0:ar=0 out.mp4

//镜像翻转 -i in.mp4 -vf crop=iw/2:ih:0:0,split[left][tmp];[tmp]hflip[right];[left]pad=iw*2[a];[a][right]overlay=w out.mp4

//水平翻转 -i in.mp4 -vf geq=p(W-X\,Y) out.mp4

//垂直翻转 -i in.mp4 -vf vflip out.mp4

//浮雕效果 -i in.mp4 -vf format=gray,geq=lum_expr='(p(X,Y)+(256-p(X-4,Y-4)))/2' out.mp4

//均匀噪声 -i in.mp4 -vf noise=alls=20:allf=t+u out.mp4

//绿色的显示效果 -i in.mp4 -vf curves=vintage:green='0.45/0.53' out.mp4  

//水印叠加 -i in.mp4 -vf movie=test.jpg[wm];[in][wm]overlay=5:5[out] out.mp4

//[四个画面在一个视频里]多路输入拼接 -i test1.mp4 -i test2.mp4 -i test3.mp4 -i test4.mp4 -filter_complex "[0:v]pad=iw*2:ih*2[a];[a][1:v]overlay=w[b];[b][2:v]overlay=0:h[c];[c][3:v]overlay=w:h" out.mp4


Linux 基本使用指令

$ find / -name apache2

====

$ ps aux #进程的一些信息如pid, cpu和内存使用

$ kill -signal PID

查看正在执行的nginx进程
ps -ef |grep nginx
杀死正在执行的进程
sudo kill -9 xxx:xxx表示的是进程代码

====

$ chown -R lanceou:lanceou * #改所有文件夹和文件拥有者 OR chown lanceou:lanceou FILENAME

$ chmod 777 file # r=4,w=2,x=1 若要rwx属性则4+2+1=7; 若要rw-属性则4+2=6; 若要r-x属性则4+1=5。

====

$ netstat -ap | grep apache2 #找出程序运行的端口

$ netstat -lt $ netstat -lu #显示 TCP 或 UDP 端口的统计信息 netstat -st 或 -su

$ netstat -a

##############################MySQL##############################

MySQL启动服务

$ service mysql start 

$ sudo netstat -tap | grep mysql

##############################Apache2##############################

Ubuntu、Start Apache 2 Server /启动apache服务

$ /etc/init.d/apache2 start

$ /etc/init.d/apache2 stop systemctl status apache2

##############################ShadowSocket ########################################

1. ShadowSocket 启动服务

$ ssserver -c /etc/shadowsocks/config.json -d start

 

##############################ShadowSocket ########################################
1. ShadowSocket 启动服务
ssserver -c /etc/shadowsocks/config.json -d start

 

######################V2RAY##############################
$ sudo systemctl start v2ray
$ systemctl status v2ray



粤ICP备20060307号-1

粤公网安备 44010602008583号