游戏开发中用到了直线行走的轨迹运算,使用的算法是DDA直线画法!
由于我的游戏之前的版本是C语言的!所以改方法的形参是指针形似,如下:
1
2
3
4
<code>/**</code>
<code>*该方法能将点(x1,y1)按步长speed向点(x2,y2)移动</code>
<code>*/</code>
<code>static</code> <code>bool autoMove( </code><code>int</code><code>* x1, </code><code>int</code><code>* y1, </code><code>int</code> <code>x2, </code><code>int</code> <code>y2, </code><code>int</code> <code>speed );</code>
C++的引用形式的函数定义如下
<code>static</code> <code>bool autoMove( </code><code>int</code><code>& x1, </code><code>int</code><code>& y1, </code><code>int</code> <code>x2, </code><code>int</code> <code>y2, </code><code>int</code> <code>speed );</code>
看指针形式,与引用形式似乎没什么区别,但在使用上引用形式却方便多了!
接下来看方法的实现
C语言的指针形式
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
<code>bool</code> <code>Tool::autoMove( </code><code>int</code><code>* x1, </code><code>int</code><code>* y1, </code><code>int</code> <code>x2, </code><code>int</code> <code>y2, </code><code>int</code> <code>speed )</code>
<code>{</code>
<code>int</code> <code>k;</code>
<code>int</code> <code>x_old=*x1,y_old=*y1,x_new,y_new,step_time=0;</code>
<code>double</code> <code>x, y, deltx, delty, length;</code>
<code>if</code><code>( *x1==x2 && *y1==y2 )</code>
<code>return</code> <code>TRUE;</code>
<code>}</code>
<code>if</code> <code>( </code><code>abs</code><code>(x2-*x1) >= </code><code>abs</code><code>(y2-*y1) )</code>
<code>length=</code><code>abs</code><code>(x2-*x1);</code>
<code>else</code>
<code>length=</code><code>abs</code><code>(y2-*y1);</code>
<code>if</code><code>( length<1 )</code>
<code>deltx=(x2-*x1)/length;</code>
<code>delty=(y2-*y1)/length;</code>
<code>x=*x1;</code>
<code>y=*y1;</code>
<code>k=1;</code>
<code>while</code><code>(k<=length)</code>
<code>x=x+deltx;</code>
<code>y=y+delty;</code>
<code>x_new = (</code><code>int</code><code>)x;</code>
<code>y_new = (</code><code>int</code><code>)y;</code>
<code>if</code><code>( (x_old!=x_new) || (y_old!=y_new) )</code>
<code>x_old = x_new;</code>
<code>y_old = y_new;</code>
<code>step_time ++;</code>
<code>if</code><code>( step_time >= speed )</code>
<code>*x1 = x;</code>
<code>*y1 = y;</code>
<code>return</code> <code>FALSE;</code>
<code>k=k+1;</code>
<code>//改变起点坐标</code>
再看C++引用形式的方法实现
<code>bool</code> <code>Tool::autoMove( </code><code>int</code><code>& x1, </code><code>int</code><code>& y1, </code><code>int</code> <code>x2, </code><code>int</code> <code>y2, </code><code>int</code> <code>speed )</code>
<code>int</code> <code>x_old=x1,y_old=y1,x_new,y_new,step_time=0;</code>
<code>if</code><code>( x1==x2 && y1==y2 )</code>
<code>if</code> <code>( </code><code>abs</code><code>(x2-x1) >= </code><code>abs</code><code>(y2-y1) )</code>
<code>length=</code><code>abs</code><code>(x2-x1);</code>
<code>length=</code><code>abs</code><code>(y2-y1);</code>
<code>deltx=(x2-x1)/length;</code>
<code>delty=(y2-y1)/length;</code>
<code>x=x1;</code>
<code>y=y1;</code>
<code>x1 = x;</code>
<code>y1 = y;</code>
指针形式在使用的时候每次变量前都要加* ,影响书写代码,更影响阅读代码,引用形式则看起来舒服多了!
还是先看指针形式的使用
在英雄的每帧绘制中,有如下代码:
<code>if</code><code>( isAutoMove )</code>
<code>int</code> <code>x = heroPos.x;</code>
<code>int</code> <code>y = heroPos.y;</code>
<code>if</code><code>( x!=map_destination_x || y!=map_destination_y )</code>
<code>bool</code> <code>isAutoMoveOk = Tool::autoMove( &x, &y, map_destination_x, map_destination_y, speed );</code>
<code>setActID( act_move );</code>
<code>setMoveToPos( x, y);</code>
<code>if</code><code>( isAutoMoveOk ) </code><code>//到达目的地</code>
<code>setAutoMove( </code><code>false</code> <code>);</code>
<code>setActID( act_wait );</code>
<code>//计算 人物面向</code>
<code>setDir(dir);</code>
将英雄的位置坐标以地址形式传给自动移动方法,来计算这帧移动speed后的坐标,再把英雄坐标更改到计算后的坐标去,如上的方法setMoveToPos( x, y);
接下来在看C++引用形式的
<code>bool</code> <code>isAutoMoveOk = Tool::autoMove( x, y, map_destination_x, map_destination_y, speed );</code>
如上可见,指针形式改成引用形式 几乎不需要改动,只是把&x,&y改成了 x,y而已
有朋友可能看出,既然是修改的英雄位置坐标,为何还要在设置一次坐标?(setMoveToPos方法)
当然是可以去掉的,因为指针,引用都是修改了传入函数autoMove()的形参!
只是我这里还有其他处理而已!
好了,总结一下,C语言没得选乖乖用指针吧!C++可以选引用,还是尽力使用引用吧!好处多多!自不必细表!
本文转自 kome2000 51CTO博客,原文链接:http://blog.51cto.com/kome2000/1287080