Chinaunix首页 | 论坛 | 博客
  • 博客访问: 92134
  • 博文数量: 26
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1030
  • 用 户 组: 普通用户
  • 注册时间: 2013-07-25 10:47
文章分类
文章存档

2013年(26)

我的朋友

分类: C/C++

2013-09-03 09:47:59

游戏开发中用到了直线行走的轨迹运算,使用的算法是DDA直线画法!

由于我的游戏之前的版本是C语言的!所以改方法的形参是指针形似,如下:

1
2
3
4
/**
*该方法能将点(x1,y1)按步长speed向点(x2,y2)移动
*/
static bool autoMove( int* x1, int* y1, int x2, int y2, int speed );

C++的引用形式的函数定义如下

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

 

看指针形式,与引用形式似乎没什么区别,但在使用上引用形式却方便多了!

接下来看方法的实现

C语言的指针形式

1
2
3
4
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
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++引用形式的方法实现

1
2
3
4
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
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;
}

 

指针形式在使用的时候每次变量前都要加* ,影响书写代码,更影响阅读代码,引用形式则看起来舒服多了!

 

还是先看指针形式的使用

在英雄的每帧绘制中,有如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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++引用形式的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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()的形参!

只是我这里还有其他处理而已!

阅读(2829) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~