<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[斧冰]]></title><description><![CDATA[千淘万漉虽辛苦，吹尽狂沙始到金。]]></description><link>https://blog.csdn.net/hp_cpp</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; hp_cpp]]></copyright><item><title><![CDATA[vs2017编译Assimp]]></title><link>https://blog.csdn.net/hp_cpp/article/details/115314491</link><guid>https://blog.csdn.net/hp_cpp/article/details/115314491</guid><author>hp_cpp</author><pubDate>Mon, 29 Mar 2021 23:43:03 +0800</pubDate><description><![CDATA[一、安装DirectX SDK
DirectX SDK下载地址
安装 DirectX SDK 时出现"S1023"错误
解决方案：
若要解决此问题，必须在安装 2010 年 6 月 DirectX SDK 之前卸载 Visual C++ 2010 可再发行组件的所有版本。 您可能已安装以下一个或多个产品：

Microsoft Visual C++ 2010 x86 可再发行组件
Microsoft Visual C++ 2010 x64 可再发行组件

包括比Microsoft Visual C++ 20]]></description><category></category></item><item><title><![CDATA[godot 淡入淡出平滑切换场景]]></title><link>https://blog.csdn.net/hp_cpp/article/details/113858258</link><guid>https://blog.csdn.net/hp_cpp/article/details/113858258</guid><author>hp_cpp</author><pubDate>Fri, 19 Feb 2021 10:24:10 +0800</pubDate><description><![CDATA[godot新建一个空工程

根节点重命名为scene1

然后添加一个TextureRect节点，添加一张背景图1.jpg（网上下载的，你也可以替换成自己喜欢的背景图）
再添加一个Button控件，里面的文字输入“start”，按钮放置在右上角。
保存场景scene1
给场景添加一个gd脚本：

然后给按钮添加一个pressed的点击函数：


将场景scene1.tscn复制一份，改为scene2.tscn，替换scene2的背景图片为1.jpg，这样你就有了2个场景，接下来我们要做的就是在这两个场景之间]]></description><category></category></item><item><title><![CDATA[Godot基础教程01：实例-控制大炮]]></title><link>https://blog.csdn.net/hp_cpp/article/details/113093985</link><guid>https://blog.csdn.net/hp_cpp/article/details/113093985</guid><author>hp_cpp</author><pubDate>Sun, 24 Jan 2021 17:48:21 +0800</pubDate><description><![CDATA[Godot基础教程01：实例-控制大炮
本节将讲解如何做一个简单的实例：

用方向键左右控制大炮左右移动
用方向键上下控制大炮炮口方向
用空格键发射炮弹

大概就是这个效果：
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T9puPWyu-1611481146972)(./images/2.gif)]

素材准备

我自己用ps抠图，把图片抠出来，放到resources文件夹中：

分别是大炮的架子，用方块代替一下，炮管和炮弹。
场景布置


说明
Node2D : 根节点，]]></description><category></category></item><item><title><![CDATA[关于QJson能解析的最大数据长度的源码分析]]></title><link>https://blog.csdn.net/hp_cpp/article/details/112968979</link><guid>https://blog.csdn.net/hp_cpp/article/details/112968979</guid><author>hp_cpp</author><pubDate>Thu, 21 Jan 2021 18:19:35 +0800</pubDate><description><![CDATA[关于QJson能解析的最大数据长度的源码分析
最近在使用QJson的时候，发现在60Mb+不到70Mb的时候，就会解析失败。我们看看Qt中有没有对QJson能解析的数据长度的限制。
在文件Qt\Qt5.14.2\5.14.2\Src\qtbase\src\corelib\serialization\qjsondocument.cpp
第392-396行
QJsonDocument QJsonDocument::fromJson(const QByteArray &amp;json, QJsonParseEr]]></description><category></category></item><item><title><![CDATA[编译出带加密功能的 SQLite Qt 插件并用SQLiteStudio进行查看]]></title><link>https://blog.csdn.net/hp_cpp/article/details/112910466</link><guid>https://blog.csdn.net/hp_cpp/article/details/112910466</guid><author>hp_cpp</author><pubDate>Wed, 20 Jan 2021 20:48:53 +0800</pubDate><description><![CDATA[编译出带加密功能的 SQLite Qt 插件并且用SQLiteStudio查看加密后的数据库
博客地址：https://www.devbean.net/2012/07/qt-sqlite-plugin-with-encryption/
github地址：https://github.com/devbean/QtCipherSqlitePlugin
截止2021年1月，QtCipherSqlitePlugin的最新release版本是v1.3
基于wxSqlite4.5.1
在Qt中编译QtCipherSql]]></description><category></category></item><item><title><![CDATA[Qt+Cef3离屏渲染（二）]]></title><link>https://blog.csdn.net/hp_cpp/article/details/109958606</link><guid>https://blog.csdn.net/hp_cpp/article/details/109958606</guid><author>hp_cpp</author><pubDate>Sat, 19 Dec 2020 10:34:43 +0800</pubDate><description><![CDATA[还是以windows上vs2017 release版本运行的程序为例。
接上一篇，我们只是将离屏渲染的每一帧图片QImage，以异步事件的方法发送到了目标QWiget上，然后再将QImage绘制到屏幕上。
留下了一些待处理的问题：

滚轮事件
鼠标的点击事件
鼠标hover到链接上，鼠标形状的变化
键盘输入
输入框的右键弹出层

我们这篇博客就围绕这些问题进行处理。
一、离屏渲染的滚轮事件的处理
滚轮事件的处理最为简单。
在CefOSRWidget头文件中：
protected:
	//其余代码与前面一篇相]]></description><category></category></item><item><title><![CDATA[Qt+Cef3离屏渲染（一）]]></title><link>https://blog.csdn.net/hp_cpp/article/details/109864269</link><guid>https://blog.csdn.net/hp_cpp/article/details/109864269</guid><author>hp_cpp</author><pubDate>Sat, 19 Dec 2020 10:34:32 +0800</pubDate><description><![CDATA[离屏渲染(Off-Screen Rendering)
在离屏渲染模式下，CEF不会创建原生浏览器窗口。CEF为宿主程序提供无效的区域和像素缓存区，而宿主程序负责通知鼠标键盘以及焦点事件给CEF。离屏渲染目前不支持混合加速，所以性能上可能无法和非离屏渲染相比。离屏浏览器将收到和窗口浏览器同样的事件通知，
下面介绍如何使用离屏渲染：
（1）实现CefRenderHandler接口。除非特别说明，所有的方法都需要覆写。
调用CefWindowInfo::SetAsOffScreen()，将CefWindowInf]]></description><category></category></item><item><title><![CDATA[Linux进程间通信——信号集函数]]></title><link>https://blog.csdn.net/hp_cpp/article/details/111240267</link><guid>https://blog.csdn.net/hp_cpp/article/details/111240267</guid><author>hp_cpp</author><pubDate>Tue, 15 Dec 2020 21:02:03 +0800</pubDate><description><![CDATA[我们已经知道，我们可以通过信号来终止进程，也可以通过信号来在进程间进行通信，程序也可以通过指定信号的关联处理函数来改变信号的默认处理方式，也可以屏蔽某些信号，使其不能传递给进程。那么我们应该如何设定我们需要处理的信号，我们不需要处理哪些信号等问题呢？信号集函数就是帮助我们解决这些问题的。
有关Linux进程间使用信号通信的更多内容，可以参阅我的另一篇文章—— Linux进程间通信——使用信号
下面是信号函数集：
1、int sigemptyset(sigset_t *set);

该函数的作用是将信号集初始]]></description><category></category></item><item><title><![CDATA[Linux SIGQUIT 捕获]]></title><link>https://blog.csdn.net/hp_cpp/article/details/111240104</link><guid>https://blog.csdn.net/hp_cpp/article/details/111240104</guid><author>hp_cpp</author><pubDate>Tue, 15 Dec 2020 20:49:29 +0800</pubDate><description><![CDATA[test.c
#include &lt;stdio.h&gt;
#include &lt;signal.h&gt;

void quit_handler();

int main(int argc, char ** argv)
{
    sigset( SIGQUIT, quit_handler );
    printf( "Process_pid=[%d]\n", getpid() );
    while(1);
    return 0;
}

void quit_handler()
{
    ]]></description><category></category></item><item><title><![CDATA[关于获取时间戳函数gettimeofday的用法小结]]></title><link>https://blog.csdn.net/hp_cpp/article/details/110887171</link><guid>https://blog.csdn.net/hp_cpp/article/details/110887171</guid><author>hp_cpp</author><pubDate>Sat, 12 Dec 2020 17:50:09 +0800</pubDate><description><![CDATA[Linux下gettimeofday函数
函数头文件及原型为：
#include&lt;sys/time.h&gt;
int gettimeofday(struct  timeval*tv,struct  timezone *tz )

参数：
struct  timeval{
       long  tv_sec;/*秒*/
       long  tv_usec;/*微妙*/
}；

struct  timezone{
        int tz_minuteswest;/*和greenwich时]]></description><category></category></item><item><title><![CDATA[pthread_key_t和pthread_key_create()详解]]></title><link>https://blog.csdn.net/hp_cpp/article/details/110918132</link><guid>https://blog.csdn.net/hp_cpp/article/details/110918132</guid><author>hp_cpp</author><pubDate>Wed, 09 Dec 2020 10:56:41 +0800</pubDate><description><![CDATA[下面说一下线程中特有的线程存储， Thread Specific Data 。线程存储有什么用了？他是什么意思了？大家都知道，在多线程程序中，所有线程共享程序中的变量。现在有一全局变量，所有线程都可以使用它，改变它的值。而如果每个线程希望能单独拥有它，那么就需要使用线程存储了。表面上看起来这是一个全局变量，所有线程都可以使用它，而它的值在每一个线程中又是单独存储的。这就是线程存储的意义。
下面说一下线程存储的具体用法。


创建一个类型为 pthread_key_t 类型的变量。


调用 pthread_]]></description><category></category></item><item><title><![CDATA[skynet源码——main函数]]></title><link>https://blog.csdn.net/hp_cpp/article/details/110722612</link><guid>https://blog.csdn.net/hp_cpp/article/details/110722612</guid><author>hp_cpp</author><pubDate>Sat, 05 Dec 2020 20:38:53 +0800</pubDate><description><![CDATA[skynet版本ad06d232a6e54179d1615241b273bc18ab08805c
为例，对源码进行阅读。
在skynet-src/skynet_main.c中有
int main(int argc, char *argv[]) {
	const char * config_file = NULL ;
	if (argc &gt; 1) {
		config_file = argv[1];
	} else {
		fprintf(stderr, "Need a config file. Ple]]></description><category></category></item><item><title><![CDATA[linux中fork()函数详解]]></title><link>https://blog.csdn.net/hp_cpp/article/details/110678874</link><guid>https://blog.csdn.net/hp_cpp/article/details/110678874</guid><author>hp_cpp</author><pubDate>Sat, 05 Dec 2020 12:44:21 +0800</pubDate><description><![CDATA[转自：https://blog.csdn.net/jason314/article/details/5640969
一、fork入门知识
一个进程，包括代码、数据和分配给进程的资源。fork（）函数通过系统调用创建一个与原来进程几乎完全相同的进程，也就是两个进程可以做完全相同的事，但如果初始参数或者传入的变量不同，两个进程也可以做不同的事。
一个进程调用fork（）函数后，系统先给新的进程分配资源，例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中，只有少数值与原来的进程的值不同。相当于]]></description><category></category></item><item><title><![CDATA[CMake中函数参数问题]]></title><link>https://blog.csdn.net/hp_cpp/article/details/110622524</link><guid>https://blog.csdn.net/hp_cpp/article/details/110622524</guid><author>hp_cpp</author><pubDate>Fri, 04 Dec 2020 10:01:43 +0800</pubDate><description><![CDATA[CMake中function函数的定义：
function(&lt;name&gt; [arg1 [arg2 [arg3 ...]]])
  COMMAND1(ARGS ...)            # 命令语句
  COMMAND2(ARGS ...)
  ...
function()

函数就是使用变量，在命令中途可以对改变量进行修改
例一：
cmake_minimum_required(VERSION 3.5)

set(var "ABC")

function(Foo arg)
  message]]></description><category></category></item><item><title><![CDATA[cmake中宏中set参数的问题解惑]]></title><link>https://blog.csdn.net/hp_cpp/article/details/110570179</link><guid>https://blog.csdn.net/hp_cpp/article/details/110570179</guid><author>hp_cpp</author><pubDate>Thu, 03 Dec 2020 21:26:46 +0800</pubDate><description><![CDATA[先看一下关键字：cmake的宏是MACRO，用法：
macro(&lt;name&gt; [arg1 [arg2 [arg3 ...]]])
  COMMAND1(ARGS ...)            # 命令语句
  COMMAND2(ARGS ...)
  ...
endmacro()

定义一个名称为name的宏（函数），arg1...是传入的参数。我们除了可以用${arg1}来引用变量以外，系统为我们提供了一些特殊的变量：




变量
说明




argv#
#是一个下标，0指向第一个参数，]]></description><category></category></item><item><title><![CDATA[CMake 在Linux上使用动态库和静态库]]></title><link>https://blog.csdn.net/hp_cpp/article/details/110404651</link><guid>https://blog.csdn.net/hp_cpp/article/details/110404651</guid><author>hp_cpp</author><pubDate>Mon, 30 Nov 2020 20:52:47 +0800</pubDate><description><![CDATA[上一篇我们生成了动态库和静态库，这一篇我们要将他们使用起来。
目录结构：

将上一篇生成的libhello.so放到dynamic目录中，libhello_static.a放到static目录中，build空目录是将来生成文件存放的目录。
一、使用动态库
hello.h文件中：
#ifndef HELLO_H
#define HELLO_H
#include &lt;iostream&gt;

void HelloFunc();

#endif

main.cpp
#include "hello.h"

i]]></description><category></category></item><item><title><![CDATA[CMake 在Linux上编译生成动态库和静态库]]></title><link>https://blog.csdn.net/hp_cpp/article/details/110401496</link><guid>https://blog.csdn.net/hp_cpp/article/details/110401496</guid><author>hp_cpp</author><pubDate>Mon, 30 Nov 2020 19:56:01 +0800</pubDate><description><![CDATA[目录结构：

仍然是建立一个空的目录build目录，以便让cmake生成的那些文件存放在这个目录中。
hello.h
#ifndef HELLO_H
#define HELLO_H
#include &lt;iostream&gt;

void HelloFunc();

#endif

hello.cpp
#include "hello.h"

void HelloFunc(){
    std::cout &lt;&lt; "Hello My Linux !" &lt;&lt; std::endl;
}]]></description><category></category></item><item><title><![CDATA[CMake 多个源文件，多个目录（二）]]></title><link>https://blog.csdn.net/hp_cpp/article/details/110393837</link><guid>https://blog.csdn.net/hp_cpp/article/details/110393837</guid><author>hp_cpp</author><pubDate>Mon, 30 Nov 2020 18:01:45 +0800</pubDate><description><![CDATA[目录结构：

一共有3个CMakeLists.txt
一个顶级CMakeLists.txt，放在当前工程的根目录下：
# CMake 最低版本号要求
cmake_minimum_required(VERSION 3.5)

# 设置工程名
project (hello_cmake)

aux_source_directory(. DIR_SRCS)

# 添加头文件路径
include_directories("${PROJECT_SOURCE_DIR}/hello")
include_directorie]]></description><category></category></item><item><title><![CDATA[CMake 多个源文件，多个目录（一）]]></title><link>https://blog.csdn.net/hp_cpp/article/details/110392878</link><guid>https://blog.csdn.net/hp_cpp/article/details/110392878</guid><author>hp_cpp</author><pubDate>Mon, 30 Nov 2020 17:24:33 +0800</pubDate><description><![CDATA[目录结构：

hello.h
#ifndef HELLO_H
#define HELLO_H
#include &lt;iostream&gt;

void hello();

#endif

hello.cpp
#include "hello.h"

void hello(){
    std::cout &lt;&lt; "Hello " &lt;&lt; std::endl;
}

world.h
#ifndef WORLD_H
#define WORLD_H
#include &lt;iostrea]]></description><category></category></item><item><title><![CDATA[CMake 同一目录，多个源文件]]></title><link>https://blog.csdn.net/hp_cpp/article/details/110389797</link><guid>https://blog.csdn.net/hp_cpp/article/details/110389797</guid><author>hp_cpp</author><pubDate>Mon, 30 Nov 2020 15:59:09 +0800</pubDate><description><![CDATA[include_directories
include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])

它相当于g++选项中的-I参数的作用，也相当于环境变量中增加路径到CPLUS_INCLUDE_PATH变量的作用，这样在使用该头文件的地方，只需要#include "xx.h"就可以，不需要再添加相对路径。
aux_source_directory
在目录中查找所有源文件
aux_source_directory(&lt;dir&gt; &lt;]]></description><category></category></item></channel></rss>