学习笔记——WiEngine的native开发(一)

写在前面:

上个学期一直有学习但是都没有记录下一些学习的东西,过不了好久感觉它们又都忘掉了,感觉有点遗憾,加上之前答应别人会写点东西,于是我就来了,挑了个期末无聊的时候开始写这个博客啦。

这个博客只是用来记录一些我自己的学习学习轨迹,希望能和有共同兴趣爱好的可以一起交流学习,如果有什么不当的地方还希望大家可以指出,我会立即修改。

关于之前写了一篇博客,那篇基本算是敷衍了事,因为那个时候被迫必须参加google博客大赛,非要搞出一篇文章不可,于是就胡诌了一篇,充了下字数,没想到下面还是有很多朋友留言,但是到现在才看到,而且年代久远,猴子跳的源代码早就遗失干净了,无奈只有和那些问我要源代码的朋友说声不好意思。

还有之所以选择从WiEngine的native开发方式入手,有很多考虑,第一,我自己的学习进度在这个地方,这也是最主要的;第二,WiEngine是一款非常出色的游戏引擎;第三,native的开发方式可以采用xcode进行,这将使整个代码过程变得更加简单,高效;

我个人不喜欢在eclipse下面进行native的开发,因为,到时候整个代码提示功能没有了,还有莫名奇妙的报错,相比之下xcode有代码提示功能和优秀的debug机制,于是我更喜欢后者。至于怎么装黑苹果,怎么破解xcode网上的资料一大把了,大家百度google一下就有了。


开始正文:

对于WiEngine的学习,我一直是从微云提供的demo入手,这次也是如此。第一篇博文挑选的Box2D/Car这个demo。

下面是这次可能会学习到的关键字(我认为重要的,毕竟是学习笔记)

b2Vec2 //(box2d里面的二维向量)
b2RevoluteJointDef //(不知道怎么翻译,Joint的一种类型)


car这个demo可以大致分为一下几个部分:

一、ground

学习笔记——WiEngine的native开发(一)_第1张图片
// create ground
		b2Body* ground = NULL;
		{
			// create ground body
			b2BodyDef bd;
			ground = world->CreateBody(&bd);
            
			// create ground shape
			b2EdgeShape shape;
			b2FixtureDef fd;
			fd.shape = &shape;
			fd.density = 0.0f;
			fd.friction = 0.6f;
			shape.Set(b2Vec2(-20.0f, 0.0f), b2Vec2(20.0f, 0.0f));
			ground->CreateFixture(&fd);
            
			float hs[10] = {0.25f, 1.0f, 4.0f, 3.0f, -1.0f, -1.0f, -2.0f, -2.0f, -1.25f, 0.0f};
			float x = 20.0f, y1 = 0.0f, dx = 5.0f;
			for (int i = 0; i < 10; ++i)
			{
				float y2 = hs[i];
				shape.Set(b2Vec2(x, y1), b2Vec2(x + dx, y2));
				ground->CreateFixture(&fd);
				y1 = y2;
				x += dx;
			}
			for (int i = 0; i < 10; ++i)
			{
				float y2 = hs[i];
				shape.Set(b2Vec2(x, y1), b2Vec2(x + dx, y2));  //b2vec2 box2d 二维向量
                //看了下声明,基本就是通过很多个二维向量,大家连在一起构建了一个世界嘛- -、
				ground->CreateFixture(&fd);
                //这个方法每次创建后大家会连接在一起
				y1 = y2;
				x += dx;
			}
            
			shape.Set(b2Vec2(x, 0.0f), b2Vec2(x + 40.0f, 0.0f));
			ground->CreateFixture(&fd);
            
            //当时很奇怪 上下为什么差了40.0f 原来是中间有一个链条;
            
			x += 80.0f;
			shape.Set(b2Vec2(x, 0.0f), b2Vec2(x + 40.0f, 0.0f));
			ground->CreateFixture(&fd);
            
			x += 40.0f;
			shape.Set(b2Vec2(x, 0.0f), b2Vec2(x + 10.0f, 5.0f));
			ground->CreateFixture(&fd);
            
            //这有5的坡度哈
            
			x += 20.0f;
			shape.Set(b2Vec2(x, 0.0f), b2Vec2(x + 40.0f, 0.0f));
			ground->CreateFixture(&fd);
            
			x += 40.0f;
			shape.Set(b2Vec2(x, 0.0f), b2Vec2(x, 20.0f));
			ground->CreateFixture(&fd);
            //这直接就是最后的那墙了
		}

注释里面也写得很清楚了

二、Teeter


学习笔记——WiEngine的native开发(一)_第2张图片
Teeter
// Teeter 平衡木
		{
			b2BodyDef bd;
			bd.position.Set(140.0f, 1.0f);
			bd.type = b2_dynamicBody;
			b2Body* body = world->CreateBody(&bd);
            
			b2PolygonShape box;
			box.SetAsBox(10.0f, 0.25f);
			body->CreateFixture(&box, 1.0f);//前面是shape,后面是密度
            
			b2RevoluteJointDef jd;
			jd.Initialize(ground, body, body->GetPosition());//看过一次声明,里面有吧运算符号重写掉
            //初始化一个joint 两个body 再设置一个作用点,我一开始的并不明白 为什么要有两个body才能创建,机理:
            //两个body的位置连线为中心线,在这个中心线的基础上再增加 限制可以转动的角度
			jd.lowerAngle = -8.0f * b2_pi / 180.0f; //需要把角度  角度 转化一下 弧度
			jd.upperAngle = 8.0f * b2_pi / 180.0f;
			jd.enableLimit = true;
			world->CreateJoint(&jd);
            
			body->ApplyAngularImpulse(100.0f);
            //一开始的时候是平衡的 加一个力 破坏它的平衡
		}
值得注意的地方有:
body->GetPosition()方法返回的是一个b2Vec2(二维向量)

三、 bridge

学习笔记——WiEngine的native开发(一)_第3张图片
bridge
// Bridge
		{
			int N = 20;  //桥的块数- -、
			b2PolygonShape shape;
			shape.SetAsBox(1.0f, 0.125f);
            
			b2FixtureDef fd;
			fd.shape = &shape;
			fd.density = 1.0f;
			fd.friction = 0.6f; //摩擦力
            
			b2RevoluteJointDef jd;
			b2Body* prevBody = ground;
			for (int i = 0; i < N; ++i)
			{
				b2BodyDef bd;
				bd.type = b2_dynamicBody;
				bd.position.Set(161.0f + 2.0f * i, -0.1f);
				b2Body* body = world->CreateBody(&bd);
				body->CreateFixture(&fd);
                
				b2Vec2 anchor(160.0f + 2.0f * i, -0.1f);
				jd.Initialize(prevBody, body, anchor);
				world->CreateJoint(&jd);
                
				prevBody = body;
			}
            //绳子的建立方式:第一个body是 ground 后面的body会变成前一个body
			b2Vec2 anchor(160.0f + 2.0f * N, -0.0f);
			jd.Initialize(prevBody, ground, anchor);
			world->CreateJoint(&jd);
		}
关于这个绳子的建立微云的demo里面提到了使用的是一个for循环,不断的创建连接了20个晓得长方形形成了一个绳子(桥)
具体可以看一眼前面的代码,很简单的

四、box
学习笔记——WiEngine的native开发(一)_第4张图片
box
// Boxes
		{
			b2PolygonShape box;
			box.SetAsBox(0.5f, 0.5f);
            
			b2Body* body = NULL;
			b2BodyDef bd;
			bd.type = b2_dynamicBody;
            
			bd.position.Set(230.0f, 0.5f);
			body = world->CreateBody(&bd);
			body->CreateFixture(&box, 0.5f);
            
			bd.position.Set(230.0f, 1.5f);
			body = world->CreateBody(&bd);
			body->CreateFixture(&box, 0.5f);
            
			bd.position.Set(230.0f, 2.5f);
			body = world->CreateBody(&bd);
			body->CreateFixture(&box, 0.5f);
            
			bd.position.Set(230.0f, 3.5f);
			body = world->CreateBody(&bd);
			body->CreateFixture(&box, 0.5f);
            
			bd.position.Set(230.0f, 4.5f);
			body = world->CreateBody(&bd);
			body->CreateFixture(&box, 0.5f);
		}


你可能感兴趣的:(eclipse,xcode,Google,float,破解,引擎)