GENTREE.CPP
上传用户:sycq158
上传日期:2008-10-22
资源大小:15361k
文件大小:2k
源码类别:

游戏

开发平台:

Visual C++

  1. #include "gentree.h"
  2. #include "voxel.h"
  3. #include "sprinter.h"
  4. #include "fixed.h"
  5. #include "maxmins.h"
  6. #include <time.h>
  7. #include <stdlib.h>
  8. #define randomize()     srand((unsigned)time(NULL))
  9. #define TREE_TYPE 0
  10. #define TREE_COUNT_SCALER 26000
  11. #define MAX_RAND 32767
  12. #define MIN_DIS_FROM_SEG 10
  13. BOOL Within_Segs(pobject new_object);
  14. inline long random(long range)
  15. {
  16. return (fixedmd((LONG)rand(), range, MAX_RAND));
  17. }
  18. inline BOOL On_Seg_Right(pseg test_seg, long base_x, long base_y) {
  19.    long x1,x2,y1,y2;
  20.    x1=Vector_List[test_seg->v[0]].x;
  21.    y1=Vector_List[test_seg->v[0]].y;
  22.    x2=Vector_List[test_seg->v[1]].x;
  23.    y2=Vector_List[test_seg->v[1]].y;
  24.    // this is different from other similar test because I want the trees to fit well into the sub sec
  25.    if ( ( ((x1-x2)*((base_y>>SHIFT)-y2)) - ((y1-y2)*((base_x>>SHIFT)-x2)) ) >= MIN_DIS_FROM_SEG) {
  26.       return TRUE;
  27.    } else {
  28.       return FALSE;
  29.    }
  30. }
  31. void Gen_Tree() {
  32. long cur_x, cur_y;
  33. long min_x, min_y, max_x, max_y;
  34. long range_x, range_y, map_area;
  35. long tree_count;
  36. pobject new_tree;
  37. Get_Map_Max_Mins(min_x, min_y, max_x, max_y);
  38. range_x=max_x-min_x;
  39. range_y=max_y-min_y;
  40. map_area=range_x*range_y;
  41. tree_count=map_area/TREE_COUNT_SCALER;
  42. randomize();
  43. for (short cur_tree=0; cur_tree<tree_count; cur_tree++) {
  44.    cur_x=(random(range_x)+min_x)<<SHIFT;
  45.    cur_y=(random(range_y)+min_y)<<SHIFT;
  46.    new_tree=Create_Object(cur_x, cur_y, 0,0,TREE_TYPE, NULL, 0);
  47.    if (!new_tree->cur_ss->flags&VOXEL_SSECTOR) {
  48.       Kill_Object(new_tree);
  49.    } else {
  50.       if (!Within_Segs(new_tree)) {
  51.          Kill_Object(new_tree);
  52.       }
  53.    }
  54. } /* endfor */
  55. }
  56. BOOL Within_Segs(pobject new_object) {
  57.    short seg_start=new_object->cur_ss->seg_start;
  58.    short seg_end=new_object->cur_ss->seg_end;
  59.    BOOL still_in=TRUE;
  60.    for (short cur_seg=seg_start; cur_seg<=seg_end; cur_seg++) {
  61.       if (!On_Seg_Right(Seg_List+cur_seg, new_object->x, new_object->y)) {
  62.          still_in=FALSE;
  63.       }
  64.    }
  65.    return still_in;
  66. }