<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[ARTELE的博客]]></title><description><![CDATA[]]></description><link>https://blog.csdn.net/ARTELE</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; ARTELE]]></copyright><item><title><![CDATA[从零到屎山系列-游戏开发(Day3 Pre)]]></title><link>https://blog.csdn.net/ARTELE/article/details/138477127</link><guid>https://blog.csdn.net/ARTELE/article/details/138477127</guid><author>ARTELE</author><pubDate>Sun, 05 May 2024 23:43:57 +0800</pubDate><description><![CDATA[思考了一下，暂时还不能脱离控制台游戏，那么就来俄罗斯方块吧，这次希望让游戏具有基本的菜单选项，计分板，关卡概念。]]></description><category></category></item><item><title><![CDATA[从零到屎山系列-游戏开发(Day2.1)]]></title><link>https://blog.csdn.net/ARTELE/article/details/138476724</link><guid>https://blog.csdn.net/ARTELE/article/details/138476724</guid><author>ARTELE</author><pubDate>Sun, 05 May 2024 23:37:02 +0800</pubDate><description><![CDATA[上一次我们写了贪吃蛇的显示部分，这次我们完善一下，将游戏控制也加入。(完整代码链接在最后)]]></description><category></category></item><item><title><![CDATA[从零到屎山系列-游戏开发(Day2)]]></title><link>https://blog.csdn.net/ARTELE/article/details/138451358</link><guid>https://blog.csdn.net/ARTELE/article/details/138451358</guid><author>ARTELE</author><pubDate>Sat, 04 May 2024 22:53:59 +0800</pubDate><description><![CDATA[游戏元素有三种，蛇、障碍物、食物，这三种元素对于游戏来说都是普通的物件，可以被绘制，也可以有处理逻辑，所以需要一类概念来表示这些物件，这里称之为GameObject，如下代码片段。因为三个物件都是可以被绘制的，所以定义了RenderObject来表示绘制信息，这样就可以在绘制不同物件的时候只需要关注每个物件中的RenderObject中的内容，拿了数据就可以无脑绘制了。]]></description><category></category></item><item><title><![CDATA[从零到屎山系列-游戏开发(Day1)]]></title><link>https://blog.csdn.net/ARTELE/article/details/138360752</link><guid>https://blog.csdn.net/ARTELE/article/details/138360752</guid><author>ARTELE</author><pubDate>Wed, 01 May 2024 01:06:52 +0800</pubDate><description><![CDATA[想了想还是猜数游戏最简单，我们只需要简单输入，判断，输出就可以。]]></description><category></category></item><item><title><![CDATA[从零到屎山系列-游戏开发（序章）]]></title><link>https://blog.csdn.net/ARTELE/article/details/136123604</link><guid>https://blog.csdn.net/ARTELE/article/details/136123604</guid><author>ARTELE</author><pubDate>Wed, 01 May 2024 00:49:46 +0800</pubDate><description><![CDATA[整个系列目前没有计划，但是有目标，可能会有几十篇，几百篇，几千篇.....，但绝对不会只有一篇。目标是从一个极其简陋的开始到五脏俱全的游戏，如果读者只想看最后五脏俱焚的游戏，那么可以忽略中间欢声笑语的挑粪过程。希望此分享带来的不只是知识，还有思想和心情。也不算是一时兴起才想做这么一个系列的博客，学技术之初就是为了好玩，但是当这些都变成了让你烦恼的任务时，慢慢你会变得讨厌它。所以这次我们放下烦恼，放下节操，来一次说走就走的旅行，堆一个想堆就堆的屎山！]]></description><category></category></item><item><title><![CDATA[我的博客公告]]></title><link>https://blog.csdn.net/ARTELE/article/details/123390600</link><guid>https://blog.csdn.net/ARTELE/article/details/123390600</guid><author>ARTELE</author><pubDate>Wed, 09 Mar 2022 23:51:03 +0800</pubDate><description><![CDATA[由于本人工作比较忙，所以博客一直没有时间更新，喜欢探讨与我博客相关内容的可以直接添加本人QQ号码1487653332，我会找时间开启新的栏目并更新博客。
]]></description><category></category></item><item><title><![CDATA[389找不同---位运算]]></title><link>https://blog.csdn.net/ARTELE/article/details/111351848</link><guid>https://blog.csdn.net/ARTELE/article/details/111351848</guid><author>ARTELE</author><pubDate>Fri, 18 Dec 2020 08:35:31 +0800</pubDate><description><![CDATA[题目：给定两个字符串 s 和 t，它们只包含小写字母。 字符串 t 由字符串 s 随机重排，然后在随机位置添加一个字母。 请找出在 t
中被添加的字母。

 
 示例 1： 输入：s = "abcd", t = "abcde" 输出："e" 解释：'e' 是那个被添加的字母。
 示例 2： 输入：s = "", t = "y" 输出："y"
 示例 3： 输入：s = "a", t = "aa" 输出："a"
 示例 4： 输入：s = "ae", t = "aea" 输出："a"
 提示： 0 &lt..]]></description><category></category></item><item><title><![CDATA[自己动手写2D物理引擎-初级篇(1)]]></title><link>https://blog.csdn.net/ARTELE/article/details/110137806</link><guid>https://blog.csdn.net/ARTELE/article/details/110137806</guid><author>ARTELE</author><pubDate>Thu, 26 Nov 2020 00:43:43 +0800</pubDate><description><![CDATA[第一章 框架设计
总体的类如下图所表示。

Shape作为形状基类。存储了与形状有关的物理量
class Shape
{
public:
	float I = 0.0f, invI = 0.0f;//转动惯量和逆
};

Rectangle和Circle派生于Shape，存储了实际的形状信息。
class Rectangle :public Shape
{
public:
	//存储矩形的长宽
	agl::vec2f r;
};

class Circle :public Shape
{
public:
	]]></description><category></category></item><item><title><![CDATA[自己动手写2D物理引擎-初级篇(0)]]></title><link>https://blog.csdn.net/ARTELE/article/details/110136077</link><guid>https://blog.csdn.net/ARTELE/article/details/110136077</guid><author>ARTELE</author><pubDate>Wed, 25 Nov 2020 17:01:23 +0800</pubDate><description><![CDATA[序言
本系列文章主要讲的的是2D物理引擎设计，从简单开始，引擎中主要完成简单形状的碰撞计算，物理冲量计算，抖动处理，运动计算。主要受到Box2D-Lite启发，亲自动手学习一下。设计过程从框架到细节，涉及到数学原理我会详细讨论并说明。同时，这里只会介绍用到的技术，不用的技术一般不提及或讲解。
章节
第一章 框架设计
第二章 碰撞检测
第三章 冲量处理
第四章 运动处理


...]]></description><category></category></item><item><title><![CDATA[Box2D-Lite源码阅读笔记(12)]]></title><link>https://blog.csdn.net/ARTELE/article/details/110099504</link><guid>https://blog.csdn.net/ARTELE/article/details/110099504</guid><author>ARTELE</author><pubDate>Tue, 24 Nov 2020 22:43:28 +0800</pubDate><description><![CDATA[简介
这次讲解动理学的最后一部分，动量计算后更新速度。
正文
下面这段代码，主要流程就是分别计算分离轴方向的动量和垂直分离轴方向的动量。

void Arbiter::ApplyImpulse()
{
	Body* b1 = body1;
	Body* b2 = body2;

	for (int i = 0; i &lt; numContacts; ++i)
	{
		Contact* c = contacts + i;
		c-&gt;r1 = c-&gt;position - b1-&gt;posi.]]></description><category></category></item><item><title><![CDATA[Box2D-Lite源码阅读笔记(11)]]></title><link>https://blog.csdn.net/ARTELE/article/details/110089275</link><guid>https://blog.csdn.net/ARTELE/article/details/110089275</guid><author>ARTELE</author><pubDate>Tue, 24 Nov 2020 22:26:56 +0800</pubDate><description><![CDATA[简介
这次我来看详细的运动处理函数。
计算准备工作
看下面的这个函数里的实现。

void World::Step(float dt)
{
	...
	for (ArbIter arb = arbiters.begin(); arb != arbiters.end(); ++arb)
	{
		arb-&gt;second.PreStep(inv_dt);
	}
	...
}


代码如下，注释和后面都会有说明
void Arbiter::PreStep(float inv_dt)
{
	//补偿系数参数.]]></description><category></category></item><item><title><![CDATA[Box2D-Lite源码阅读笔记(10)]]></title><link>https://blog.csdn.net/ARTELE/article/details/110089045</link><guid>https://blog.csdn.net/ARTELE/article/details/110089045</guid><author>ARTELE</author><pubDate>Tue, 24 Nov 2020 17:46:28 +0800</pubDate><description><![CDATA[简介
这次我来探究一下step剩下的部分。
动量计算，位移计算

void World::Step(float dt)
{
	float inv_dt = dt &gt; 0.0f ? 1.0f / dt : 0.0f;

	//碰撞检测并获取碰撞信息
	BroadPhase();
	// Integrate forces.
	for (int i = 0; i &lt; (int)bodies.size(); ++i)
	{
		Body* b = bodies[i];
		//质量无穷大作为固定的物体.]]></description><category></category></item><item><title><![CDATA[Box2D-Lite源码阅读笔记(9)]]></title><link>https://blog.csdn.net/ARTELE/article/details/110038437</link><guid>https://blog.csdn.net/ARTELE/article/details/110038437</guid><author>ARTELE</author><pubDate>Tue, 24 Nov 2020 09:27:50 +0800</pubDate><description><![CDATA[简介
到这里就是碰撞检测的最后一个阶段，在前面已经获取了粗略位置点的时候，这里要获取精确的碰撞点。
碰撞点筛选
目前位置，待定的碰撞点已经处于A的宽度范围内了，但是是否与A碰撞，或者是否在A内还需要判断。

int numContacts = 0;
	for (int i = 0; i &lt; 2; ++i)
	{
		//计算出相交深度
		float separation = Dot(frontNormal, clipPoints2[i].v) - front;
		//深度小于等于0的点说明点相交.]]></description><category></category></item><item><title><![CDATA[Box2D-Lite源码阅读笔记(8)]]></title><link>https://blog.csdn.net/ARTELE/article/details/110038261</link><guid>https://blog.csdn.net/ARTELE/article/details/110038261</guid><author>ARTELE</author><pubDate>Tue, 24 Nov 2020 08:56:58 +0800</pubDate><description><![CDATA[简介
上一篇完成了碰撞点的初步获取，这回阅读的是碰撞点的第二步获取。
碰撞点截取
因为有一定可能使得取得的B上的碰撞点在A的宽度范围之外，这样一来，范围之外的点属于没有意义的点，所以需要根据A的宽度将点截断在A的宽度范围内。
代码

/*参数列表:vOut[2]输出结果，vIn[2]输入的碰撞点候选点，normal侧方向上的向量(假设以矩形A坐标系为主)
offset侧方向上的坐标值。
这假设前面是以A坐标系为主，vIn[2]是获取自矩形B上的顶点且已经转换到世界坐标
*/
int ClipSegment.]]></description><category></category></item><item><title><![CDATA[一个个人学习的小游戏demo开源]]></title><link>https://blog.csdn.net/ARTELE/article/details/109998439</link><guid>https://blog.csdn.net/ARTELE/article/details/109998439</guid><author>ARTELE</author><pubDate>Mon, 23 Nov 2020 16:04:19 +0800</pubDate><description><![CDATA[简介
之前在学习游戏相关只是的时候，由于学习的比较杂乱，这个过程中写了一个游戏框架，其实就是个小demo，决定开源了，和喜欢游戏开发的人交流学习。代码的资料注释不多，以下是一些效果，其中，游戏元素管理，动画加载，物理等一切都是自己写的，不依赖任何库，只有图像显示需要opengl，本打算写个马造的，奈何功力不够。
效果图



源码链接demo源代码和资源


...]]></description><category></category></item><item><title><![CDATA[Box2D-Lite源码阅读笔记(7)]]></title><link>https://blog.csdn.net/ARTELE/article/details/109997593</link><guid>https://blog.csdn.net/ARTELE/article/details/109997593</guid><author>ARTELE</author><pubDate>Mon, 23 Nov 2020 15:27:32 +0800</pubDate><description><![CDATA[简介
上一篇阅读了碰撞点计算框架和碰撞深度获取的代码，这次阅读碰撞点计算的具体步骤之一，计算候选点。
选择候选点
候选点说明现在计算的并不是具体的碰撞点，而是一些可能的碰撞点，或者与碰撞点相关的点，或者是需要加工一个才能成为碰撞点。

/*参数列表:返回结果(预测相交点)，另一个矩形的半径大小，另一个矩形的位置
 另一个矩形的旋转矩阵,调用这个函数的矩形的正面方向
*/
static void ComputeIncidentEdge(ClipVertex c[2], const Vec2&amp; h, .]]></description><category></category></item><item><title><![CDATA[Box2D-Lite源码阅读笔记(6)]]></title><link>https://blog.csdn.net/ARTELE/article/details/109992176</link><guid>https://blog.csdn.net/ARTELE/article/details/109992176</guid><author>ARTELE</author><pubDate>Mon, 23 Nov 2020 13:38:06 +0800</pubDate><description><![CDATA[0.简介

上一篇介绍了碰撞检测部分，这次阅读后面的碰撞点计算和最小碰撞深度计算的代码。

1.获取碰撞点和碰撞深度

碰撞后要计算出碰撞点，因为在计算运动方向，转动惯量等数据的时候需要碰撞点信息，碰撞深度是为了分离两个物体用的信息，因为物体碰撞时刻，不能正好点边接触，两个物体可能会有一些交叉，这个交叉导致碰撞点会落在形状内部，而不是边界，并且两个物体分离，运动状态信息也需要这个交叉深度来进行各种视觉效果上的平衡。


	// Find best axis
	Axis axis;//选定的轴
	float ]]></description><category></category></item><item><title><![CDATA[Box2D-Lite源码阅读笔记(5)]]></title><link>https://blog.csdn.net/ARTELE/article/details/109905824</link><guid>https://blog.csdn.net/ARTELE/article/details/109905824</guid><author>ARTELE</author><pubDate>Sun, 22 Nov 2020 20:39:26 +0800</pubDate><description><![CDATA[0.简介

前一篇对碰撞检测的准备工作做了阅读，这回我们看第一步，分离轴定理检测矩形是否相交。

1.分离轴定理

这里面简单对分离轴定理做一个说明，这个里面有详细说明分离轴定理详细说明

大概就是比如两个凸多边形，这两个多边形分别向每条边的垂直方向做投影，如果有一个方向上的投影不相交，则两个多边形不相交，反之则相交。

具体就看上面的链接吧。

2.代码阅读


int Collide(Contact* contacts, Body* bodyA, Body* bodyB)
{

    ...    
]]></description><category></category></item><item><title><![CDATA[Box2D-Lite源码阅读笔记(4)]]></title><link>https://blog.csdn.net/ARTELE/article/details/109897074</link><guid>https://blog.csdn.net/ARTELE/article/details/109897074</guid><author>ARTELE</author><pubDate>Sat, 21 Nov 2020 14:23:16 +0800</pubDate><description><![CDATA[0.简介

前面我们发现了物体碰撞检测的函数，这回我将来读物体碰撞检测函数的代码。

1.碰撞检测

这个碰撞检测主要是针对矩形与矩形的碰撞检测，以为例子中只给了矩形的物理碰撞。这里先对开始部分做一个阅读和注释。

这段代码是一些准备工作，主要目的是获取物体在空间中的姿态和基本位置信息。


int Collide(Contact* contacts, Body* bodyA, Body* bodyB)
{
	// Setup
	//取A B两个物体的半径,width中存储的是边长
	//这里获取到的是一半]]></description><category></category></item><item><title><![CDATA[Box2D-Lite源码阅读笔记(3)]]></title><link>https://blog.csdn.net/ARTELE/article/details/109894929</link><guid>https://blog.csdn.net/ARTELE/article/details/109894929</guid><author>ARTELE</author><pubDate>Sat, 21 Nov 2020 13:52:27 +0800</pubDate><description><![CDATA[0.简介

这次来看step函数。

1.step开始

step函数里看起来如下的样子，当然我们只关注一块。


void World::Step(float dt)
{
	float inv_dt = dt &gt; 0.0f ? 1.0f / dt : 0.0f;

	// 碰撞检测
	BroadPhase();
    ...

}

BroadPhase函数是碰撞碰撞检测函数。具体讲解在代码注释


void World::BroadPhase()
{
	//这是一个O(n^2)的循环
	for ]]></description><category></category></item></channel></rss>