Cocos引擎《保卫萝卜》04实现简单的游戏原型文档格式.docx
《Cocos引擎《保卫萝卜》04实现简单的游戏原型文档格式.docx》由会员分享,可在线阅读,更多相关《Cocos引擎《保卫萝卜》04实现简单的游戏原型文档格式.docx(18页珍藏版)》请在冰点文库上搜索。
![Cocos引擎《保卫萝卜》04实现简单的游戏原型文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/5/be796ada-e659-4f34-b26a-94285025258d/be796ada-e659-4f34-b26a-94285025258d1.gif)
com.game.defendthegirl。
如果还不会创建工程请参照:
本篇原型需要实现内容:
1、在主场景中载入一张地图。
2、在地图终点放置一个女主角,在地图的起点放置一个色狼大叔。
3、让色狼大叔沿着地图指定的路线向女主角的位置靠近。
素材图片准备:
地图图片
女主角图片
色狼大叔图片
把这几张素材图片拷贝到文件夹Resources下面即可。
1、在主场景中载入一张地图
第一步:
用MicrosoftVisualStudio2012打开proj.win32工程,然后在src下新建MainScene.h、MainScene.cpp作为游戏的主场景(Scene不会建?
参考:
HelloGame项目解析)。
第二步:
在init()方法里载入地图图片level_bg_1.png,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool
MainScene:
:
init()
{
if
(
!
Layer:
init()
)
return
false;
}
Size
visibleSize
=
Director:
getInstance()->
getVisibleSize();
Vec2
origin
getVisibleOrigin();
//载入地图背景
auto
sprite
Sprite:
create("
level_bg_1.png"
);
sprite->
setPosition(Vec2(visibleSize.width/2
+
origin.x,
visibleSize.height/2
origin.y));
this->
addChild(sprite,
0);
true;
第三步:
打开AppDelegate.cpp文件,引入MainScene.h头文件,并且在applicationDidFinishLaunching方法中把autoscene=HelloWorld:
createScene();
改成autoscene=MainScene:
然后运行。
2、在地图终点放置一个女主角,在地图的起点放置一个色狼大叔
在init()方法里添加如下代码
……
//在地图起点处放置一个色狼
dsSprite
dashu.png"
dsSprite->
setPosition(Vec2(40,
390));
addChild(dsSprite,
//在地图终点处放置一个女主角
nhSprite
girl.png"
nhSprite->
setPosition(Vec2(920,
480));
addChild(nhSprite,
…...
然后运行就可以在画面上看到色狼大叔和女主角了
3、让色狼大叔沿着地图指定的路线向女主角的位置靠近
这个一个有点难度的任务,首先我们对这张地图的道路路径进行一下坐标分析:
如上图所示,以地图的右下顶点为坐标系原点,整个道路分成12个坐标点,女主角在1号坐标点,色狼大叔在12号坐标点。
现在色狼大叔将沿着图中黄色的线路从12点开始11点、10点、9点…直至到达1点,我的实现思路是这样,色狼从12点出发时告诉它目标点是11点,当色狼到达11点的时候继续告诉它下一个目标点是10点直到1点。
几个实现技术点:
1)对Sprite(色狼)进行setPosition的方式可以改变Sprite在图上的位置从而实现Sprite的移动
2)计算Sprite(色狼)位置到目标点的向量值,然后根据这个向量值和色狼移动速度计算Sprite在x,y方向上的距离偏移值,用这个偏移值调整Sprite的位置
判断Sprite(色狼)到达目标点(如:
11点),如下图所示通过Sprite坐标点和目标点之间的距离小于一定值的时就判定为到达目标点,需要设置新的下一个目标点。
有了这些实现思路,现在开始代码编写:
由上面是实现思路可知我们的基本实现是路径点,那么这里先新建一个路径点类对象,名称为:
Waypoint.h、Waypoint.cpp,继承自:
cocos2d:
CCNode。
Waypoint.h:
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
class
Waypoint:
public
CCNode
public:
Waypoint(void);
~Waypoint(void);
//初始化方法
static
Waypoint*
nodeWithTheLocation(cocos2d:
Point
location);
initWithTheLocation(cocos2d:
//设置当前点的下一个路径点
void
setNextWaypoint(Waypoint*
waypoint);
//获取当前点的下一个路径点
getNextWaypoint();
//当前路径点位置
CC_SYNTHESIZE(cocos2d:
Point,_myPosition,MyPosition);
private:
//下一个路径点
_nextWaypoint;
};
Waypoint.cpp:
Waypoint(void)
_nextWaypoint=NULL;
~Waypoint(void)
location)
pRet=new
Waypoint();
(pRet
&
pRet->
initWithTheLocation(location))
autorelease();
pRet;
}
else
delete
pRet=NULL;
NULL;
bRet=false;
do
_myPosition=location;
setPosition(Point:
ZERO);
bRet=true;
while
(0);
bRet;
waypoint)
_nextWaypoint=waypoint;
getNextWaypoint()
在MainScene.h里声明如下代码
//重写Layer的update方法
//我们主要在这个方法里实现色狼移动
virtual
update(float
delta);
CREATE_FUNC(MainScene);
//路径开始点
Waypoint
*beginningWaypoint;
//路径目标点
*destinationWaypoint;
//色狼的移动速度
float
walkingSpeed;
//色狼当前位置
myPosition;
//色狼大叔
Sprite*
dsSprite;
//路径点集合
Vector<
Waypoint*>
wayPositions;
//判断2个点是否靠近
collisionWithCircle(cocos2d:
circlePoint,float
radius,cocos2d:
circlePointTwo,
radiusTwo);
这里代码,也对之前代码进行了修改重构,比如把之前在init()方法里声明的dsSprite(色狼)改到了这里变成了一个全局变量,因为在后续的update方法中需要对它进行操作。
在MainScene.cpp的init()方法中创建路径点集合编写如下代码
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
//获得色狼大叔的高
dsh=dsSprite->
getTextureRect().size.height;
//初始化地图路径点集合
wayPositions
();
//添加地图1号路径点到集合中
*waypoint1=Waypoint:
nodeWithTheLocation(Point(920,
435+dsh/2.0f));
if(this->
wayPositions.size()>
0)
//设置下一个节点
waypoint1->
setNextWaypoint(this->
wayPositions.back());
wayPositions.pushBack(waypoint1);
//添加地图2号路径点到集合中
*waypoint2=Waypoint:
nodeWithTheLocation(Point(762,
waypoint2->
wayPositions.pushBack(waypoint2);
//添加地图3号路径点到集合中
*waypoint3=Waypoint:
360+dsh/2.0f));
waypoint3->
wayPositions.pushBack(waypoint3);
//添加地图4号路径点到集合中
*waypoint4=Waypoint:
nodeWithTheLocation(Point(685,
waypoint4->
wayPositions.pushBack(waypoint4);
//添加地图5号路径点到集合中
*waypoint5=Waypoint:
116+dsh/2.0f));
waypoint5->
wayPositions.pushBack(waypoint5);
//添加地图6号路径点到集合中
*waypoint6=Waypoint:
nodeWithTheLocation(Point(520,
waypoint6->
wayPositions.pushBack(waypoint6);
//添加地图7号路径点到集合中
*waypoint7=Waypoint:
180+dsh/2.0f));
waypoint7->
wayPositions.pushBack(waypoint7);
//添加地图8号路径点到集合中
*waypoint8=Waypoint:
nodeWithTheLocation(Point(285,
waypoint8->
wayPositions.pushBack(waypoint8);
//添加地图9号路径点到集合中
*waypoint9=Waypoint:
268+dsh/2.0f));
waypoint9->
wayPositions.pushBack(waypoint9);
//添加地图10号路径点到集合中
*waypoint10=Waypoint:
nodeWithTheLocation(Point(204,
waypoint10->
wayPositions.pushBack(waypoint10);
//添加地图11号路径点到集合中
*waypoint11=Waypoint:
350+dsh/2.0f));
waypoint11->
wayPositions.pushBack(waypoint11);
//添加地图12号路径点到集合中
*waypoint12=Waypoint:
nodeWithTheLocation(Point(50,
waypoint12->
wayPositions.pushBack(waypoint12);
第四步:
在MainScene.cpp的init()方法中初始化几个变量以及精灵的初始位置编写如下代码
//获取集合中的最后一个点,12号点
*waypoint0=wayPositions.back();
//设置运动的开始点
beginningWaypoint=waypoint0;
//设置运动的目标点为12号点的下一个点,11号点
destinationWaypoint=waypoint0->
//设置色狼当前位置值
myPosition=waypoint0->
getMyPosition();
//设置色狼在地图的初始位置
setPosition(myPosition);
//设置女主角在地图的初始位置,为集合中的1号点
setPosition(wayPositions.front()->
getMyPosition());
//设置移动速度
walkingSpeed=0.2f;
//定时器
scheduleUpdate();
…
第五步:
在MainScene.cpp中