home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 23 / IOPROG_23.ISO / SOFT / RAYCAST.ZIP / OBJCOL.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1995-10-12  |  4.8 KB  |  149 lines

  1. #include "ray.h"
  2. #include "globals.h"
  3. #include "fixed.h"
  4. #include "blockmap.h"
  5. #include "objcol.h"
  6. #include "abs.h"
  7. #include "sign.h"
  8. #include "rayspr.h"
  9.  
  10. MYFIXED Dis_Percent(MYFIXED obj_x, MYFIXED obj_y, MYFIXED ms_x, MYFIXED ms_y,
  11.    MYFIXED delta_x, MYFIXED delta_y, MYFIXED move_len_sq) {
  12.  
  13. MYFIXED pos_on_line;
  14.  
  15. pos_on_line=fixeddiv(
  16.    fixedmult(obj_x-ms_x, delta_x)+fixedmult(obj_y-ms_y, delta_y),
  17.    move_len_sq);
  18.  
  19. pos_on_line=fixedsqrtHP(ABS(pos_on_line))*SIGN(pos_on_line);  
  20. return pos_on_line;
  21. }
  22.  
  23. MYFIXED Obj_Dis(MYFIXED obj_x, MYFIXED obj_y, MYFIXED mf_x, MYFIXED mf_y,
  24.    MYFIXED delta_x, MYFIXED delta_y, MYFIXED move_len) {
  25.  
  26. MYFIXED dis_result;
  27.  
  28. dis_result=fixeddiv(
  29.    fixedmult(obj_x-mf_x, -delta_y)-fixedmult(obj_y-mf_y, -delta_x),
  30.    move_len);
  31.  
  32. return dis_result;
  33. }
  34.  
  35. void Stop_Obj(pobject move_obj, pobj_collision the_collision) {
  36.  
  37. the_collision->delta_x=fixedmult(the_collision->dis_percent, 
  38.    the_collision->delta_x);
  39. the_collision->delta_y=fixedmult(the_collision->dis_percent, 
  40.    the_collision->delta_y);
  41.  
  42. }
  43.  
  44. void Slide_Obj(pobject move_obj, pobj_collision the_collision) {
  45.  
  46. MYFIXED intersect_x, intersect_y;
  47. intersect_x=fixedmult(the_collision->dis_percent, the_collision->delta_x);
  48. intersect_y=fixedmult(the_collision->dis_percent, the_collision->delta_y);
  49.  
  50. MYFIXED delta_y=the_collision->delta_y;
  51. the_collision->delta_y=intersect_y+SIGN(the_collision->dist_from_move)*fixedmult(
  52.    REBOUND_PERCENT, -the_collision->delta_x);
  53. the_collision->delta_x=intersect_x+SIGN(the_collision->dist_from_move)*fixedmult(
  54.    REBOUND_PERCENT, delta_y);
  55.  
  56. }
  57.  
  58. BOOL Intersect_Z(pobject obj_1, pobject obj_2) {
  59. if (obj_1->z >= obj_2->z + obj_2->type->height)
  60.    return FALSE;
  61. if (obj_2->z >= obj_1->z + obj_1->type->height)
  62.    return FALSE;
  63.  
  64. return TRUE;
  65. }
  66.  
  67. void Find_Closest_Obj_In_List(pobj_collision the_collision,
  68.  pobject_node search_list) {   
  69. if (search_list==NULL)
  70.    return;
  71.  
  72. pobject_node cur_node;
  73. pobject cur_obj;
  74.  
  75. MYFIXED dis_percent, dis_from_move, obj_block_percent;
  76.  
  77. cur_node=search_list;
  78. while (!OL_Empty_Node(cur_node)) {
  79.     cur_obj=cur_node->data;
  80.     // do they even intersect height wise?
  81.     if (Intersect_Z(cur_obj, the_collision->move_obj)) {
  82.     
  83.     // find at what point on move the objects intersect
  84.     dis_percent=Dis_Percent(cur_obj->x, cur_obj->y,
  85.        the_collision->move_obj->x,
  86.        the_collision->move_obj->y,
  87.        the_collision->delta_x,
  88.        the_collision->delta_y, 
  89.        the_collision->move_len_sq);
  90.     obj_block_percent=fixeddiv(cur_obj->type->block_width,
  91.        the_collision->move_len);
  92.     dis_percent-=obj_block_percent;
  93.     
  94.     if (dis_percent>(-obj_block_percent) && dis_percent < ONE) {
  95.     
  96.     dis_from_move = Obj_Dis(cur_obj->x, cur_obj->y, 
  97.        the_collision->dest_x,
  98.        the_collision->dest_y,
  99.        the_collision->delta_x,
  100.        the_collision->delta_y, 
  101.        the_collision->move_len);
  102.        if (ABS(dis_from_move)<
  103.           (the_collision->move_obj->type->obj_width+cur_obj->type->obj_width)) {
  104.           if ( dis_percent < the_collision->dis_percent )
  105.           {
  106.           the_collision->found_collision=TRUE;
  107.           the_collision->col_obj=cur_obj;
  108.           the_collision->dist_from_move=dis_from_move;
  109.           the_collision->dis_percent=dis_percent;
  110.           }
  111.        }
  112.     } 
  113.     }
  114.     cur_node=OL_Next_Node(cur_node);
  115.   }
  116. }
  117.  
  118. void Check_Obj_Collision(pobj_collision the_collision) {
  119. the_collision->dest_x=the_collision->move_obj->x+the_collision->delta_x;
  120. the_collision->dest_y=the_collision->move_obj->y+the_collision->delta_y;
  121. the_collision->move_len_sq=
  122.   fixedsqr(the_collision->delta_x)+fixedsqr(the_collision->delta_y);
  123. the_collision->move_len=
  124.   fixedsqrtHP(the_collision->move_len_sq);
  125. the_collision->found_collision=FALSE;
  126. the_collision->dis_percent=MAXMYFIXED;
  127.  
  128. if (the_collision->move_len_sq==0)
  129.    return;
  130.  
  131. USHORT block_x, block_y;
  132. MYFIXED dest_x, dest_y;
  133. dest_x=the_collision->dest_x;
  134. dest_y=the_collision->dest_y;
  135. block_x=Block_X(dest_x);
  136. block_y=Block_Y(dest_y);
  137.  
  138. Find_Closest_Obj_In_List(the_collision, *Get_Block_Obj_List(block_x, block_y));
  139. Find_Closest_Obj_In_List(the_collision, *Get_Block_Obj_List(block_x, block_y+1));
  140. Find_Closest_Obj_In_List(the_collision, *Get_Block_Obj_List(block_x, block_y-1));
  141. Find_Closest_Obj_In_List(the_collision, *Get_Block_Obj_List(block_x+1, block_y));
  142. Find_Closest_Obj_In_List(the_collision, *Get_Block_Obj_List(block_x-1, block_y));
  143. Find_Closest_Obj_In_List(the_collision, *Get_Block_Obj_List(block_x+1, block_y-1));
  144. Find_Closest_Obj_In_List(the_collision, *Get_Block_Obj_List(block_x+1, block_y+1));
  145. Find_Closest_Obj_In_List(the_collision, *Get_Block_Obj_List(block_x-1, block_y-1));
  146. Find_Closest_Obj_In_List(the_collision, *Get_Block_Obj_List(block_x-1, block_y+1));
  147.  
  148. }
  149.