zoukankan      html  css  js  c++  java
  • 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++可以选引用,还是尽力使用引用吧!好处多多!自不必细表!

  • 相关阅读:
    laravel 共享session问题总结
    QQ互联登录提示redirect uri is illegal(100010)完美解决方法
    LESS一种 动态 样式 语言.
    Maximum Depth of Binary Tree
    能力工程师什么是你的核心竞争力之三?
    类对象RMI的简单实现
    对象序列化Java中的序列化
    阿尔法状态目睹一个程序员精神失常的经历
    内容文件Java创建TXT文件并进行读、写、修改操作
    原因资料POST gitreceivepack (chunked)
  • 原文地址:https://www.cnblogs.com/xiangcunjiaoshi/p/12541713.html
Copyright © 2011-2022 走看看