前两篇我们讲了构建一个游戏的数据库基础,基于数据库,我们已经可以实现按照指定的灯光、摄像机位置、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
0