Browse Source

Create Example_-_Turret_TurnToTarget.c

Rudy Boudewijn van Etten 5 years ago
parent
commit
971f7afd7f
1 changed files with 94 additions and 0 deletions
  1. 94 0
      Example_-_Turret_TurnToTarget.c

+ 94 - 0
Example_-_Turret_TurnToTarget.c

@@ -0,0 +1,94 @@
+
+#include "raylib.h"
+#include <math.h> // for cos and sin
+
+// Return on which side of the line the point is. l-1 0= r=1
+// lineback x,y linefront x,y point x,y
+int orientation(int ax,int ay,int bx, int by, int cx, int cy);
+
+typedef struct turret{
+    float isactive;
+    float angle;
+    Vector2 position;
+    Vector2 barreltip; // tip of the cannon
+    Vector2 target;
+}turret;
+
+int main(void)
+{
+    // Initialization
+    //--------------------------------------------------------------------------------------
+    const int screenWidth = 800;
+    const int screenHeight = 450;
+
+    InitWindow(screenWidth, screenHeight, "raylib example.");
+ 
+    turret myturret={0};
+    myturret.isactive = true;
+    myturret.angle = 0.0f;
+    myturret.position = (Vector2){400,200};
+ 
+    SetTargetFPS(60);               // Set our game to run at 60 frames-per-second
+    //--------------------------------------------------------------------------------------
+
+    // Main game loop
+    while (!WindowShouldClose())    // Detect window close button or ESC key
+    {
+        // Update
+        //----------------------------------------------------------------------------------
+        
+        // The turret section.
+        if(myturret.isactive){
+            // Get the target coordinates.
+            myturret.target = GetMousePosition();
+            // Figure out if the target is left or right or center of the barrel.
+            int o = orientation(myturret.position.x,myturret.position.y,myturret.barreltip.x,myturret.barreltip.y,myturret.target.x,myturret.target.y);            
+            if(o==-1){ // target is left of the barrel so turn left.
+                myturret.angle-=0.01f;            
+            }else if(o==1){//target is right of the barrel so turn right.
+                myturret.angle+=0.01f;
+            }else{
+            }
+            // Keep the angle value between 0..360
+            if(myturret.angle<0)myturret.angle=myturret.angle+360;
+            if(myturret.angle>360)myturret.angle=0+myturret.angle;
+            // Get the new barreltip vector.
+            myturret.barreltip = (Vector2){myturret.position.x+(cos(myturret.angle)*16),myturret.position.y+(sin(myturret.angle)*16)};
+        }
+        
+        
+        //----------------------------------------------------------------------------------
+        // Draw
+        //----------------------------------------------------------------------------------
+        BeginDrawing();
+
+            ClearBackground(RAYWHITE);
+                
+            //draw the turret.
+            DrawCircle(myturret.position.x,myturret.position.y,10,DARKGRAY);            
+            DrawLineEx(myturret.position,myturret.barreltip,5,RED);
+
+            DrawText("Move the mouse around the turret to see it turn.",0,0,30,DARKGRAY);
+        EndDrawing();
+        //----------------------------------------------------------------------------------
+    }
+
+    // De-Initialization
+    //--------------------------------------------------------------------------------------
+    CloseWindow();        // Close window and OpenGL context
+    //--------------------------------------------------------------------------------------
+
+    return 0;
+
+
+}
+
+//
+// This is the orientation function. It returns -1 if the point is left of the inputted line.
+// 0 if on the same and 1 if on the right of the line.
+// aa,bb,point
+int orientation(int ax,int ay,int bx, int by, int cx, int cy){
+	if(((bx-ax)*(cy-ay)-(by-ay)*(cx-ax))<0)return -1;
+    if(((bx-ax)*(cy-ay)-(by-ay)*(cx-ax))>0)return 1;
+    return 0;
+}