c++中引用与指针在函数上的应用
2013-09-02 15:38
405 查看
游戏开发中用到了直线行走的轨迹运算,使用的算法是DDA直线画法!
由于我的游戏之前的版本是C语言的!所以改方法的形参是指针形似,如下:
看指针形式,与引用形式似乎没什么区别,但在使用上引用形式却方便多了!
接下来看方法的实现
C语言的指针形式
再看C++引用形式的方法实现
指针形式在使用的时候每次变量前都要加* ,影响书写代码,更影响阅读代码,引用形式则看起来舒服多了!
还是先看指针形式的使用
在英雄的每帧绘制中,有如下代码:
将英雄的位置坐标以地址形式传给自动移动方法,来计算这帧移动speed后的坐标,再把英雄坐标更改到计算后的坐标去,如上的方法setMoveToPos( x, y);
接下来在看C++引用形式的
如上可见,指针形式改成引用形式 几乎不需要改动,只是把&x,&y改成了 x,y而已
有朋友可能看出,既然是修改的英雄位置坐标,为何还要在设置一次坐标?(setMoveToPos方法)
当然是可以去掉的,因为指针,引用都是修改了传入函数autoMove()的形参!
只是我这里还有其他处理而已!
好了,总结一下,C语言没得选乖乖用指针吧!C++可以选引用,还是尽力使用引用吧!好处多多!自不必细表!
本文出自 “键码视窗” 博客,请务必保留此出处http://kome2000.blog.51cto.com/969562/1287080
由于我的游戏之前的版本是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
相关文章推荐
- C++:向函数传递对象(对象、对象指针、对象引用)
- c++将引用或者是指针作为函数参数实现实参的运算
- Self Summary: C++函数返回引用和指针的问题,局部对象与new对象的问题
- C++成员函数指针的应用(学习收录)
- c++函数参数类型-引用、指针、值
- C/C++中函数的传值调用、指针调用、引用调用问题
- 二级指针和指针引用函数传参(C++)
- C++指针与引用(一):函数传参,是该传对象,还是传指针,抑或是引用
- c++:函数传指针(void * xx)、传引用(void & xx)和传指针的引用(void *& xx)
- C++成员函数指针的应用
- C或C++中函数的参数传递包括:值传递、指针传递、引用传递
- C++ 函数参数是引用和指针的时候的一些注意点。
- Self Summary: C++函数返回引用和指针的问题,局部对象与new对象的问题
- c++ 指针、引用、内存管理、函数(引用、重载、内敛)——c++复习(一)
- C++多态机制中虚函数和指针或引用
- C++引用指针虚函数
- 指针的引用——在函数中的巧妙应用
- C++成员函数指针的应用(学习收录)
- C++中函数参数传递(值传递、指针传递,引用传递)
- C++成员函数指针与其应用场景