天天看點

c++中引用與指針在函數上的應用

遊戲開發中用到了直線行走的軌迹運算,使用的算法是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>&amp; x1, </code><code>int</code><code>&amp; 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 &amp;&amp; *y1==y2 )</code>

<code>return</code> <code>TRUE;</code>

<code>}</code>

<code>if</code> <code>( </code><code>abs</code><code>(x2-*x1) &gt;= </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&lt;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&lt;=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 &gt;= 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>&amp; x1, </code><code>int</code><code>&amp; 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 &amp;&amp; y1==y2 )</code>

<code>if</code> <code>( </code><code>abs</code><code>(x2-x1) &gt;= </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( &amp;x, &amp;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>

如上可見,指針形式改成引用形式 幾乎不需要改動,隻是把&amp;x,&amp;y改成了 x,y而已

有朋友可能看出,既然是修改的英雄位置坐标,為何還要在設定一次坐标?(setMoveToPos方法)

當然是可以去掉的,因為指針,引用都是修改了傳入函數autoMove()的形參!

隻是我這裡還有其他處理而已!

好了,總結一下,C語言沒得選乖乖用指針吧!C++可以選引用,還是盡力使用引用吧!好處多多!自不必細表!

本文轉自 kome2000 51CTO部落格,原文連結:http://blog.51cto.com/kome2000/1287080

繼續閱讀