遊戲開發中直線軌跡運算用 DDA 演算法。C 版本用指針參數,C++ 改用引用,對比鮮明。
// C 風格指針
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);
bool Tool::autoMove(int* x1, int* y1, int x2, int y2, int speed) {
int x_old = *x1, y_old = *y1, x_new, y_new, step_time = 0;
double x = *x1, y = *y1, deltx, delty, length;
if (*x1 == x2 && *y1 == y2) return TRUE;
length = (abs(x2 - *x1) >= abs(y2 - *y1)) ? abs(x2 - *x1) : abs(y2 - *y1);
if (length < 1) return TRUE;
deltx = (x2 - *x1) / length; delty = (y2 - *y1) / length;
int k = 1;
while (k <= length) {
x += deltx; 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 = (int)x; *y1 = (int)y; return FALSE; }
k++;
}
*x1 = (int)x; *y1 = (int)y; return FALSE;
}
bool Tool::autoMove(int& x1, int& y1, int x2, int y2, int speed) {
int x_old = x1, y_old = y1, x_new, y_new, step_time = 0;
double x = x1, y = y1, deltx, delty, length;
if (x1 == x2 && y1 == y2) return TRUE;
length = (abs(x2 - x1) >= abs(y2 - y1)) ? abs(x2 - x1) : abs(y2 - y1);
if (length < 1) return TRUE;
deltx = (x2 - x1) / length; delty = (y2 - y1) / length;
int k = 1;
while (k <= length) {
x += deltx; 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 = (int)x; y1 = (int)y; return FALSE; }
k++;
}
x1 = (int)x; y1 = (int)y; return FALSE;
}
// 指針調用
bool isAutoMoveOk = Tool::autoMove(&x, &y, map_destination_x, map_destination_y, speed);
// 引用調用
bool isAutoMoveOk = Tool::autoMove(x, y, map_destination_x, map_destination_y, speed);
*x1、*y1,閱讀寫入極其繁瑣。&)。本文出自「鍵碼視窗」博客,轉載請保留出處:https://kome2000.blog.51cto.com/969562/1287080