فهرست منبع

Update wip - spiderVSman.c

Rudy Boudewijn van Etten 5 سال پیش
والد
کامیت
d13261d8eb
1فایلهای تغییر یافته به همراه118 افزوده شده و 2 حذف شده
  1. 118 2
      games/wip - spiderVSman.c

+ 118 - 2
games/wip - spiderVSman.c

@@ -5,7 +5,7 @@
 // Added - spider turns towards and move to target(press mouse on screen to see this..)
 // Added - spiders! can roam and avoid the walls and stop if player gets near them.
 
-enum flag1{IDLE,QUICKDASH,SCOUTNEWPOSITION};
+enum flag1{IDLE,QUICKDASH,SCOUTNEWPOSITION,SEEATTACKPLAYER};
 enum flag2{FINDSPOT,SPIDERTURN,FOUNDSPOT};
 
 #define MAX_TILES 100
@@ -94,6 +94,7 @@ int orientation(int ax,int ay,int bx, int by, int cx, int cy);
 static float angledifference(float angle1, float angle2);
 static bool spidertilecollide(int index, int offsetx,int offsety);
 static bool recttilecollide(int x,int y,int w, int h);
+static float getdistance(float x1,float y1,float x2,float y2);
 
 int main(void)
 {
@@ -171,8 +172,98 @@ int main(void)
                     myspider[i].state=SCOUTNEWPOSITION;
                     myspider[i].substate=FINDSPOT;
                 }
+                if(GetRandomValue(0,20)==1){
+                    myspider[i].state=SEEATTACKPLAYER;
+                    myspider[i].substate=FINDSPOT;
+                }
+
             }
             //
+            //
+            //
+            // spider SEES player and attacks him
+            if(myspider[i].state==SEEATTACKPLAYER){
+                myspider[i].time++;
+                if(myspider[i].time>2){
+                    myspider[i].frame++;
+                    myspider[i].time=0;
+                }
+                if(myspider[i].frame>2)myspider[i].frame=1;
+                //
+                if(myspider[i].substate==FINDSPOT){
+                    bool newspotisgood=true;
+                    float x1=myspider[i].position.x;
+                    float y1=myspider[i].position.y;
+                    
+                    myspider[i].target.x = myplayer.position.x+myplayer.width/2;
+                    myspider[i].target.y = myplayer.position.y+myplayer.height/2;
+                    float angle = getangle(myspider[i].position.x,myspider[i].position.y,myspider[i].target.x,myspider[i].target.y);
+                    int distance=getdistance(myspider[i].position.x,myspider[i].position.y,myspider[i].target.x,myspider[i].target.y);    
+                    if(distance>150){
+                        newspotisgood=false;
+                        myspider[i].state=IDLE;                            
+                        goto skipsap;
+                    }
+                    for(int j=0;j<distance;j++){
+                        x1+=cos(angle);
+                        y1+=sin(angle);
+                        if(recttilecollide(x1,y1,myspider[i].width,myspider[i].height)==true)
+                            {
+                            newspotisgood=false;
+                            myspider[i].state=IDLE;                            
+                            j=100;
+                        }
+                        // if hit other spider than stop idle
+                        for(int j=0;j<MAX_SPIDERS;j++){
+                            if(i==j)continue;
+                            if(rectsoverlap(x1,y1,myspider[i].width,myspider[i].height,myspider[j].position.x,myspider[j].position.y,myspider[j].width,myspider[j].height)==true) {
+                                newspotisgood=false;
+                                myspider[i].state=IDLE;                            
+                                j=100;
+                            }
+                        }                        
+                    }
+                    skipsap:
+                    if(newspotisgood){
+                        myspider[i].target = (Vector2){x1,y1};
+                        myspider[i].substate = SPIDERTURN;
+                    }
+                }
+                if(myspider[i].substate==SPIDERTURN){
+                    float angle = getangle(myspider[i].position.x,myspider[i].position.y,myspider[i].target.x,myspider[i].target.y);
+                    // turn towards target                
+                    float difference = angledifference((myspider[i].angle-90)/180*PI,angle);
+                    debug=difference;
+                    if(difference<0)myspider[i].angle-=6;
+                    if(difference>0)myspider[i].angle+=6;
+                    if(difference>3)myspider[i].substate=FOUNDSPOT;
+                }
+                if(myspider[i].substate==FOUNDSPOT){
+                    float angle = getangle(myspider[i].position.x,myspider[i].position.y,myspider[i].target.x,myspider[i].target.y);
+                    Vector2 oldposition = myspider[i].position;                    
+                    myspider[i].position.x += cos(angle)*2;
+                    myspider[i].position.y += sin(angle)*2;
+                    // if hit other spider than stop idle
+                    for(int j=0;j<MAX_SPIDERS;j++){
+                        if(i==j)continue;
+                        if(rectsoverlap(myspider[i].position.x,myspider[i].position.y,myspider[i].width,myspider[i].height,myspider[j].position.x,myspider[j].position.y,myspider[j].width,myspider[j].height)==true) {
+                            myspider[i].state=IDLE;
+                            myspider[i].position = oldposition;
+                            break;
+                        }
+                    }
+                    // if spider position on player..
+                    if(rectsoverlap(myplayer.position.x,myplayer.position.y,myplayer.width,myplayer.height,myspider[i].position.x,myspider[i].position.y,myspider[i].width,myspider[i].height)==true){
+                        myspider[i].state=IDLE;
+                        myspider[i].position = oldposition;
+                    }                        
+                    // if spider reaches destination
+                    if((abs(myspider[i].target.x-myspider[i].position.x) + abs(myspider[i].target.y-myspider[i].position.y))<4)myspider[i].state=IDLE;
+                }
+            }
+            ///
+            //
+            //
             // spider checks ahead and places new target (roam slow)
             if(myspider[i].state==SCOUTNEWPOSITION){
                 myspider[i].time++;
@@ -186,7 +277,7 @@ int main(void)
                     bool newspotisgood=true;
                     float x1=myspider[i].position.x;
                     float y1=myspider[i].position.y;
-                    int distance=GetRandomValue(50,150);
+                    int distance=GetRandomValue(10,150);
                     for(int j=0;j<distance;j++){
                         x1+=cos(myspider[i].angle);
                         y1+=sin(myspider[i].angle);
@@ -199,6 +290,15 @@ int main(void)
                             myspider[i].state=IDLE;                            
                             j=100;
                         }
+                        // if hit other spider than stop idle
+                        for(int j=0;j<MAX_SPIDERS;j++){
+                            if(i==j)continue;
+                            if(rectsoverlap(x1,y1,myspider[i].width,myspider[i].height,myspider[j].position.x,myspider[j].position.y,myspider[j].width,myspider[j].height)==true) {
+                                newspotisgood=false;
+                                myspider[i].state=IDLE;                            
+                                j=100;
+                            }
+                        }                        
                     }
                     if(newspotisgood){
                         myspider[i].target = (Vector2){x1,y1};
@@ -216,11 +316,22 @@ int main(void)
                 }
                 if(myspider[i].substate==FOUNDSPOT){
                     float angle = getangle(myspider[i].position.x,myspider[i].position.y,myspider[i].target.x,myspider[i].target.y);
+                    Vector2 oldposition = myspider[i].position;
                     myspider[i].position.x += cos(angle)*1;
                     myspider[i].position.y += sin(angle)*1;
+                    // if hit other spider than stop idle
+                    for(int j=0;j<MAX_SPIDERS;j++){
+                        if(i==j)continue;
+                        if(rectsoverlap(myspider[i].position.x,myspider[i].position.y,myspider[i].width,myspider[i].height,myspider[j].position.x,myspider[j].position.y,myspider[j].width,myspider[j].height)==true) {
+                            myspider[i].state=IDLE;
+                            myspider[i].position = oldposition;
+                            break;
+                        }
+                    }
                     // if spider position on player..
                     if(rectsoverlap(myplayer.position.x,myplayer.position.y,myplayer.width,myplayer.height,myspider[i].position.x-8,myspider[i].position.y-8,myspider[i].width+16,myspider[i].height+16)==true){
                         myspider[i].state=IDLE;
+                        myspider[i].position = oldposition;
                     }                        
                     // if spider reaches destination
                     if((abs(myspider[i].target.x-myspider[i].position.x) + abs(myspider[i].target.y-myspider[i].position.y))<10)myspider[i].state=IDLE;
@@ -1264,3 +1375,8 @@ float angledifference(float angle1, float angle2){
     return difference;
 
 }
+
+// Manhattan Distance (less precise)
+float getdistance(float x1,float y1,float x2,float y2){
+    return (float)abs(x2-x1)+abs(y2-y1);
+}