前两篇我们讲了构建一个游戏的数据库基础,基于数据库,我们已经可以实现按照指定的灯光、摄像机位置、3D模型文件、3D模型位置等等构建起一个场景和其中的精灵。
作为一个游戏,让这些场景中的精灵动起来是必须的,然后你就会发现一个有趣的现象——cocos的demo里面(cpp-test),3D精灵展示用的是平面相机(2D)而不是投影相机(3D)。
继而你会发现Cocos2d-x即便到3.3RC0目前最新版本,也没有给你封装一个3D的移动方法。还是2D的moveTo,moveBy那些,只有XY轴的运动。
想象2D使用moveTo一样,把精灵在XYZ轴都动起来怎么办??
方法有很多,先说一个更改引擎的方法,给自己的引擎加一个MoveBy3D和MoveTo3D的方法。
首先,打开“盘符:\cocos目录\cocos2d\cocos\2d”下的CCActionInterval.h,添加如下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
//dark添加开始***********************************************************************************************************
class CC_DLL MoveBy3D : public ActionInterval
{
public:
/** creates the action */
static MoveBy3D* create(float duration, const Vec3& deltaPosition);
//
// Overrides
//
virtual MoveBy3D* clone() const override;
virtual MoveBy3D* reverse(void) const override;
virtual void startWithTarget(Node *target) override;
virtual void update(float time) override;
CC_CONSTRUCTOR_ACCESS:
MoveBy3D() {}
virtual ~MoveBy3D() {}
/** initializes the action */
bool initWithDuration(float duration, const Vec3& deltaPosition);
protected:
Vec3 _positionDelta;
Vec3 _startPosition;
Vec3 _previousPosition;
private:
CC_DISALLOW_COPY_AND_ASSIGN(MoveBy3D);
};
/** Moves a Node object to the position x,y. x and y are absolute coordinates by modifying it's position attribute.
Several MoveTo3D actions can be concurrently called, and the resulting
movement will be the sum of individual movements.
@since v2.1beta2-custom
*/
class CC_DLL MoveTo3D : public MoveBy3D
{
public:
/** creates the action */
static MoveTo3D* create(float duration, const Vec3& position);
//
// Overrides
//
virtual MoveTo3D* clone() const override;
virtual void startWithTarget(Node *target) override;
CC_CONSTRUCTOR_ACCESS:
MoveTo3D() {}
virtual ~MoveTo3D() {}
/** initializes the action */
bool initWithDuration(float duration, const Vec3& position);
protected:
Vec3 _endPosition;
private:
CC_DISALLOW_COPY_AND_ASSIGN(MoveTo3D);
};
//dark添加到此***********************************************************************************************************
|
其次,打开“盘符:\cocos目录\cocos2d\cocos\2d”下的CCActionInterval.cpp,添加如下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|