00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include "eSensor.h"
00029 #include "eWall.h"
00030 #include "eDebugLine.h"
00031 #include "eGrid.h"
00032
00033 #ifdef DEBUG
00034
00035 #endif
00036
00037 eSensor::eSensor(eGameObject *o,const eCoord &start,const eCoord &d)
00038 :eStackGameObject(o->grid, start,d,o->currentFace)
00039 ,hit(1000),ehit(NULL),lr(0), owned(o) , inverseSpeed_(0)
00040 {
00041 if (owned)
00042 {
00043 currentFace=owned->currentFace;
00044
00045
00046
00047 if ( grid && !currentFace || !currentFace->IsInside( pos ) && currentFace->IsInside( owned->pos ) )
00048 {
00049 currentFace = o->grid->FindSurroundingFace( pos, currentFace );
00050 }
00051 }
00052 else
00053 currentFace=NULL;
00054 }
00055
00056 void eSensor::PassEdge(const eWall *w,REAL time,REAL a,int){
00057 if (!w->Massive()){
00058 return;
00059 }
00060
00061
00062 REAL hitTime = owned->LastTime() + time * inverseSpeed_;
00063
00064 if (owned && !owned->EdgeIsDangerous(w, hitTime, a))
00065 return;
00066
00067 lr=0;
00068
00069 const eHalfEdge *e = w->Edge();
00070
00071 eCoord eEdge_dir=w->Vec();
00072 eCoord collPos = w->Point( a );
00073
00074
00075 REAL dec=- eEdge_dir*dir;
00076
00077 if (dec>0)
00078 lr=1;
00079 else if (dec<0)
00080 lr=-1;
00081 else
00082 lr=0;
00083
00084 hit=time;
00085 ehit=e;
00086 before_hit=collPos-dir*.000001;
00087
00088 throw eSensorFinished();
00089 }
00090
00091
00092
00093
00094
00095 void eSensor::detect(REAL range){
00096
00097
00098 before_hit=pos+dir*(range-.001);
00099 hit=range+.00001f;
00100 ehit = 0;
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133 try
00134 {
00135 Move(pos+dir*range,0,range);
00136 }
00137 catch( eSensorFinished & e )
00138 {
00139 }
00140
00141 #ifdef DEBUGLINE
00142 if (hit < range)
00143 {
00144 eDebugLine::SetColor (0, 1, 1);
00145 eDebugLine::Draw(start, .1, before_hit, .1);
00146
00147 eDebugLine::SetColor (0, .5, 1);
00148 eDebugLine::Draw(before_hit, .1, before_hit, 2.0);
00149 }
00150 else
00151 {
00152 eDebugLine::SetColor (1, 0, 0);
00153 eDebugLine::Draw(start, .5, pos, .5);
00154 }
00155 #endif
00156 }
00157
00158