程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> c++中引用與指針在函數上的應用

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

編輯:關於C語言

游戲開發中用到了直線行走的軌跡運算,使用的算法是DDA直線畫法!

由於我的游戲之前的版本是C語言的!所以改方法的形參是指針形似,如下:

/**
*該方法能將點(x1,y1)按步長speed向點(x2,y2)移動
*/
static bool autoMove( int* x1, int* y1, int x2, int y2, int speed );

C++的引用形式的函數定義如下

static bool autoMove( int& x1, int& y1, int x2, int y2, int speed );

 

看指針形式,與引用形式似乎沒什麼區別,但在使用上引用形式卻方便多了!

接下來看方法的實現

C語言的指針形式

bool Tool::autoMove( int* x1, int* y1, int x2, int y2, int speed )
{
int k;
int x_old=*x1,y_old=*y1,x_new,y_new,step_time=0;
double  x, y, deltx, delty, length;
if( *x1==x2 && *y1==y2 )
{
return TRUE;
}
if ( abs(x2-*x1) >= abs(y2-*y1) )
length=abs(x2-*x1);
else
length=abs(y2-*y1);
if( length<1 )
{
return TRUE;
}
deltx=(x2-*x1)/length;
delty=(y2-*y1)/length;
x=*x1;
y=*y1;
k=1;
while(k<=length)
{
x=x+deltx;
y=y+delty;
x_new = (int)x;
y_new = (int)y;
if( (x_old!=x_new) || (y_old!=y_new) )
{
x_old = x_new;
y_old = y_new;
step_time ++;
}
if( step_time >= speed )
{
*x1 = x;
*y1 = y;
return FALSE;
}
k=k+1;
}
//改變起點坐標
*x1 = x;
*y1 = y;
return FALSE;
}

    

再看C++引用形式的方法實現

bool Tool::autoMove( int& x1, int& y1, int x2, int y2, int speed )
{
int k;
int x_old=x1,y_old=y1,x_new,y_new,step_time=0;
double  x, y, deltx, delty, length;
if( x1==x2 && y1==y2 )
{
return TRUE;
}
if ( abs(x2-x1) >= abs(y2-y1) )
length=abs(x2-x1);
else
length=abs(y2-y1);
if( length<1 )
{
return TRUE;
}
deltx=(x2-x1)/length;
delty=(y2-y1)/length;
x=x1;
y=y1;
k=1;
while(k<=length)
{
x=x+deltx;
y=y+delty;
x_new = (int)x;
y_new = (int)y;
if( (x_old!=x_new) || (y_old!=y_new) )
{
x_old = x_new;
y_old = y_new;
step_time ++;
}
if( step_time >= speed )
{
x1 = x;
y1 = y;
return FALSE;
}
k=k+1;
}
//改變起點坐標
x1 = x;
y1 = y;
return FALSE;
}

 

指針形式在使用的時候每次變量前都要加* ,影響書寫代碼,更影響閱讀代碼,引用形式則看起來舒服多了!

 

還是先看指針形式的使用

在英雄的每幀繪制中,有如下代碼:

if( isAutoMove )
{
int x = heroPos.x;
int y = heroPos.y;
if( x!=map_destination_x || y!=map_destination_y )
{
bool isAutoMoveOk = Tool::autoMove( &x, &y, map_destination_x, map_destination_y, speed );
setActID( act_move );
setMoveToPos( x, y);
if( isAutoMoveOk )  //到達目的地
{
setAutoMove( false );
setActID( act_wait );
}
}
else
{
setAutoMove( false );
setActID( act_wait );
}
//計算 人物面向
setDir(dir);
}

 

將英雄的位置坐標以地址形式傳給自動移動方法,來計算這幀移動speed後的坐標,再把英雄坐標更改到計算後的坐標去,如上的方法setMoveToPos( x, y);

 

接下來在看C++引用形式的

if( isAutoMove )
{
int x = heroPos.x;
int y = heroPos.y;
if( x!=map_destination_x || y!=map_destination_y )
{
bool isAutoMoveOk = Tool::autoMove( x, y, map_destination_x, map_destination_y, speed );
setActID( act_move );
setMoveToPos( x, y);
if( isAutoMoveOk )  //到達目的地
{
setAutoMove( false );
setActID( act_wait );
}
}
else
{
setAutoMove( false );
setActID( act_wait );
}
//計算 人物面向
setDir(dir);
}

 

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

 

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

 

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

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

 

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

本文出自 “鍵碼視窗” 博客,請務必保留此出處http://kome2000.blog.51cto.com/969562/1287080

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved