浏览代码

Add files via upload

Rudy Boudewijn van Etten 4 年之前
父节点
当前提交
d3832a6098
共有 2 个文件被更改,包括 182 次插入168 次删除
  1. 182 168
      ai/racing/racing.c
  2. 二进制
      ai/racing/racing.exe

+ 182 - 168
ai/racing/racing.c

@@ -1,168 +1,182 @@
-/*******************************************************************************************
-*
-
-* Trying to figure out how to do a racing game using lanes...
-*
-* I made a array of vector2d's, this in a circle as the racetrack.
-* there are 5 lanes. 5 bots that should be able to race against each other.
-*
-* work in progress or figure out yourself.
-*
-********************************************************************************************/
-
-#include "raylib.h"
-#include <math.h>
-
-#define MAXLANES 5
-#define MAXBOTS 5
-
-typedef struct thebot{
-    Vector2 position;
-    float speed;
-    int pos;
-    int lane;
-}thebot;
-
-static struct thebot bot[MAXBOTS];
-
-Vector2 track[5][360];
-
-void maketrack();
-void drawtrack();
-void updatebots();
-void drawbots();
-static float edistance(float x1,float y1,float x2,float y2);
-
-int main(void)
-{
-    // Initialization
-    //--------------------------------------------------------------------------------------
-    const int screenWidth = 800;
-    const int screenHeight = 450;
-
-    InitWindow(screenWidth, screenHeight, "raylib [core] example - basic window");
-    maketrack();
-    for(int i=0;i<MAXBOTS;i++){
-        bot[i].position = track[i][0];
-        bot[i].lane=i;
-        bot[i].pos = 0;
-        bot[i].speed = GetRandomValue(500,1000)/1000.0f;
-    }
-
-    SetTargetFPS(60);               // Set our game to run at 60 frames-per-second
-    //--------------------------------------------------------------------------------------
-
-
-    //track[0][0] = (Vector2){0,0};
-
-    // Main game loop
-    while (!WindowShouldClose())    // Detect window close button or ESC key
-    {
-        // Update
-        //----------------------------------------------------------------------------------
-        // TODO: Update your variables here
-        //----------------------------------------------------------------------------------
-        updatebots();
-        updatebots();
-        // Draw
-        //----------------------------------------------------------------------------------
-        BeginDrawing();
-
-        ClearBackground(RAYWHITE);
-
-
-        drawtrack();
-        drawbots();
-        //DrawText(FormatText("%f",(float)GetRandomValue(0,10000)/10000*2-1), 190, 200, 20, LIGHTGRAY);
-
-        EndDrawing();
-        //----------------------------------------------------------------------------------
-    }
-
-    // De-Initialization
-    //--------------------------------------------------------------------------------------
-    CloseWindow();        // Close window and OpenGL context
-    //--------------------------------------------------------------------------------------
-
-    return 0;
-}
-
-void drawtrack(){
-    for(int i=1;i<360;i++){
-    for(int t=0;t<5;t++){
-        DrawLineV(track[t][i-1],track[t][i],BLACK);
-    }
-    }
-}
-
-void maketrack(){
-    float x = 0.0f;
-    float y = 0.0f;
-    for(int i=0;i<360;i++){
-    for(int t=0;t<5;t++){
-        track[t][i] = (Vector2){x+x/100*t*10.0f,y+y/100*t*10.0f};
-        track[t][i].x += 320;
-        track[t][i].y += 100;
-        track[t][i].y -= t*10;
-    }
-        x+=cos(i*DEG2RAD)*2;
-        y+=sin(i*DEG2RAD)*2;
-
-    }
-}
-
-void updatebots(){
-    for(int i=0;i<MAXBOTS;i++){
-        float l=edistance(      bot[i].position.x,
-                                bot[i].position.y,
-                                track[bot[i].lane][bot[i].pos].x,
-                                track[bot[i].lane][bot[i].pos].y);
-        if(l<5){
-            bot[i].pos+=1;
-            if(bot[i].pos>359)bot[i].pos=0;            
-        }
-        float an = atan2(bot[i].position.y-track[bot[i].lane][bot[i].pos].y,bot[i].position.x-track[bot[i].lane][bot[i].pos].x);
-        bot[i].position.x-=cos(an)*bot[i].speed;
-        bot[i].position.y-=sin(an)*bot[i].speed;
-        // Switch lane logic
-        bool close=false;
-        for(int j=0;j<MAXBOTS;j++){
-            if(j==i)continue;
-            float l=edistance(      bot[i].position.x,
-                                    bot[i].position.y,
-                                    bot[j].position.x,
-                                    bot[j].position.y);
-            if(l<20)close=true;
-        }
-        if(close==false){
-            if(bot[i].lane>0)bot[i].lane--;
-        }
-        // if overtake and only 2 close by
-        int cnt=0;
-        for(int j=0;j<MAXBOTS;j++){
-            if(j==i)continue;
-            float l=edistance(      bot[i].position.x,
-                                    bot[i].position.y,
-                                    bot[j].position.x,
-                                    bot[j].position.y);
-            if(l<20 && bot[j].speed<bot[i].speed)cnt++;
-        }
-        if(cnt==1){
-            if(bot[i].lane==0){
-                bot[i].lane++;
-                bot[i].pos++;
-            }
-        }
-    }    
-}
-
-void drawbots(){
-    for(int i=0;i<MAXBOTS;i++){
-        DrawCircleV(bot[i].position,5,RED);
-    }
-}
-
-// Euclidean distance (more precise)
-float edistance(float x1,float y1,float x2,float y2){
-    return sqrt( (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2) );
-}
+/*******************************************************************************************
+* I started this racing game experiment on the iphone and with appgamekit mobile during todays f1's forumula 1 race.
+* 
+*
+* Trying to figure out how to do a racing game using lanes...
+*
+* I made a array of vector2d's, this in a circle as the racetrack.
+* there are 5 lanes. 5 bots that should be able to race against each other.
+*
+* work in progress or figure out yourself.
+*
+********************************************************************************************/
+
+#include "raylib.h"
+#include <math.h>
+
+#define MAXLANES 5
+#define MAXBOTS 5
+
+typedef struct thebot{
+    Vector2 position;
+    float speed;
+    int pos;
+    int lane;
+}thebot;
+
+static struct thebot bot[MAXBOTS];
+
+Vector2 track[5][360];
+
+void maketrack();
+void drawtrack();
+void updatebots();
+void drawbots();
+static float edistance(float x1,float y1,float x2,float y2);
+
+int main(void)
+{
+    // Initialization
+    //--------------------------------------------------------------------------------------
+    const int screenWidth = 800;
+    const int screenHeight = 450;
+
+    InitWindow(screenWidth, screenHeight, "raylib [core] example - basic window");
+    maketrack();
+    for(int i=0;i<MAXBOTS;i++){
+        bot[i].position = track[i][0];
+        bot[i].lane=i;
+        bot[i].pos = 0;
+        bot[i].speed = GetRandomValue(500,1000)/1000.0f;
+    }
+
+    SetTargetFPS(60);               // Set our game to run at 60 frames-per-second
+    //--------------------------------------------------------------------------------------
+
+
+    //track[0][0] = (Vector2){0,0};
+
+    // Main game loop
+    while (!WindowShouldClose())    // Detect window close button or ESC key
+    {
+        // Update
+        //----------------------------------------------------------------------------------
+        // TODO: Update your variables here
+        //----------------------------------------------------------------------------------
+        updatebots();
+        updatebots();
+        // Draw
+        //----------------------------------------------------------------------------------
+        BeginDrawing();
+
+        ClearBackground(RAYWHITE);
+
+
+        drawtrack();
+        drawbots();
+        //DrawText(FormatText("%f",(float)GetRandomValue(0,10000)/10000*2-1), 190, 200, 20, LIGHTGRAY);
+
+        EndDrawing();
+        //----------------------------------------------------------------------------------
+    }
+
+    // De-Initialization
+    //--------------------------------------------------------------------------------------
+    CloseWindow();        // Close window and OpenGL context
+    //--------------------------------------------------------------------------------------
+
+    return 0;
+}
+
+void drawtrack(){
+    for(int i=1;i<360;i++){
+    for(int t=0;t<5;t++){
+        DrawLineV(track[t][i-1],track[t][i],BLACK);
+    }
+    }
+}
+//
+// We have a array of [lanes][nodes] = vector2d
+// We create it by just making a circle in 360 steps. The cars wil go from node to node and loop this.
+//
+//
+void maketrack(){
+    float x = 0.0f;
+    float y = 0.0f;
+    for(int i=0;i<360;i++){
+    for(int t=0;t<5;t++){
+        track[t][i] = (Vector2){x+x/100*t*10.0f,y+y/100*t*10.0f};
+        track[t][i].x += 320;
+        track[t][i].y += 100;
+        track[t][i].y -= t*10;
+    }
+        x+=cos(i*DEG2RAD)*2;
+        y+=sin(i*DEG2RAD)*2;
+
+    }
+}
+
+//
+// Here the magic should happen(i think) Move towards the next node/. 
+// If close to the target node then next node.
+//
+// Lane magic code should be added here.
+//
+void updatebots(){
+    for(int i=0;i<MAXBOTS;i++){
+        float l=edistance(      bot[i].position.x,
+                                bot[i].position.y,
+                                track[bot[i].lane][bot[i].pos].x,
+                                track[bot[i].lane][bot[i].pos].y);
+        if(l<5){
+            bot[i].pos+=1;
+            if(bot[i].pos>359)bot[i].pos=0;            
+        }
+        float an = atan2(bot[i].position.y-track[bot[i].lane][bot[i].pos].y,bot[i].position.x-track[bot[i].lane][bot[i].pos].x);
+        bot[i].position.x-=cos(an)*bot[i].speed;
+        bot[i].position.y-=sin(an)*bot[i].speed;
+        // Switch lane logic
+        bool close=false;
+        for(int j=0;j<MAXBOTS;j++){
+            if(j==i)continue;
+            float l=edistance(      bot[i].position.x,
+                                    bot[i].position.y,
+                                    bot[j].position.x,
+                                    bot[j].position.y);
+            if(l<20)close=true;
+        }
+        if(close==false){
+            if(bot[i].lane>0){
+                bot[i].lane--;
+                bot[i].pos+=8;
+            }
+        }
+        // if overtake and only 2 close by
+        int cnt=0;
+        for(int j=0;j<MAXBOTS;j++){
+            if(j==i)continue;
+            float l=edistance(      bot[i].position.x,
+                                    bot[i].position.y,
+                                    bot[j].position.x,
+                                    bot[j].position.y);
+            if(l<20 && bot[j].speed<bot[i].speed)cnt++;
+        }
+        if(cnt==1){
+            if(bot[i].lane==0){
+                bot[i].lane++;
+                bot[i].pos+=8;
+            }
+        }
+    }    
+}
+
+void drawbots(){
+    for(int i=0;i<MAXBOTS;i++){
+        DrawCircleV(bot[i].position,5,RED);
+    }
+}
+
+// Euclidean distance (more precise)
+float edistance(float x1,float y1,float x2,float y2){
+    return sqrt( (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2) );
+}

二进制
ai/racing/racing.exe