Kaynağa Gözat

Create Simple_message_window.c

Rudy Boudewijn van Etten 5 yıl önce
ebeveyn
işleme
ac9d5519ed
1 değiştirilmiş dosya ile 141 ekleme ve 0 silme
  1. 141 0
      Gui/Simple_message_window.c

+ 141 - 0
Gui/Simple_message_window.c

@@ -0,0 +1,141 @@
+enum messages{MESSAGE1};
+
+#define GUI_MESSAGE_WIDTH 320
+#define GUI_MESSAGE_HEIGHT 200
+#define GUI_KEY_DELAY 10
+
+#include "raylib.h"
+#include <string.h>
+
+
+// This is our message. It is passed into the message function as MESSAGE1R(see switch)
+// The \n characters in text that is shown in the message gui's are line feeds. They 
+// start the next text a line down. (Set text 128 higher for larger chars.
+static const char message_intro[128] = "This sample illustrates a\ntext writing animation\neffect!\n\nCheck it out! ;)";
+// be sure to reset the framesCounter after every new message. (this is for the text effect.)
+static int framesCounter = 0;
+static bool messagedisplayed = false; // If this boolean is true than the message is completely shown.
+static int waitbetweenkeypresses = 0;
+
+// our global(static) functions.
+static void drawmessage(int x,int y,int message);
+static void drawroundedrect(int x, int y, int w,int h,Color col);//With this we draw our gui.
+
+
+int main(void)
+{
+    // Initialization
+    //--------------------------------------------------------------------------------------
+    const int screenWidth = 800;
+    const int screenHeight = 450;
+
+    InitWindow(screenWidth, screenHeight, "raylib example.");
+ 
+    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
+        //----------------------------------------------------------------------------------
+        
+        waitbetweenkeypresses++;//There needs to be a time between key presses.
+        
+        // Here we replay the message.
+        if(waitbetweenkeypresses>GUI_KEY_DELAY && messagedisplayed && IsKeyPressed(KEY_SPACE)){
+            waitbetweenkeypresses = 0;//reset the between keypresses timer
+            framesCounter = 0; // text display counter
+            messagedisplayed = false;
+        }
+        
+        //----------------------------------------------------------------------------------
+        // Draw
+        //----------------------------------------------------------------------------------
+        BeginDrawing();
+
+            ClearBackground(RAYWHITE);
+            
+            drawmessage(200,100,MESSAGE1);
+            
+            DrawRectangle(0,0,screenWidth,20,DARKGRAY);
+            DrawText("Press Space for finishing message or replaying message.!",0,0,20,RAYWHITE);
+
+        EndDrawing();
+        //----------------------------------------------------------------------------------
+    }
+
+    // De-Initialization
+    //--------------------------------------------------------------------------------------
+    CloseWindow();        // Close window and OpenGL context
+    //--------------------------------------------------------------------------------------
+
+    return 0;
+
+
+}
+
+void drawmessage(int x,int y,int message){
+
+    char text[128]="";
+    
+    switch (message){
+        case MESSAGE1:
+            strcat(text,message_intro);
+        break;
+    }
+    framesCounter+=4;
+    
+    // If the user presses space than display the complete message.
+    // (no time to wait for the typewriter effect.)
+    if(framesCounter<strlen(text)*10){
+        if(waitbetweenkeypresses>GUI_KEY_DELAY && IsKeyPressed(KEY_SPACE)){
+            framesCounter=strlen(text)*10;
+            messagedisplayed = true;
+            waitbetweenkeypresses = 0;
+        }        
+    }else{
+        messagedisplayed = true;
+    }
+    
+    
+    int w=GUI_MESSAGE_WIDTH;
+    int h=GUI_MESSAGE_HEIGHT;
+    drawroundedrect(x,y,w,h,BLACK);
+    drawroundedrect(x+1,y+1,w-2,h-2,LIGHTGRAY);
+    drawroundedrect(x+6,y+6,w-12,h-12,DARKGRAY);
+    drawroundedrect(x+8,y+8,w-16,h-16,BLACK);
+    DrawText(TextSubtext(text, 0, framesCounter/10), x+18, y+18, 20, WHITE);
+    //
+    // This here figures out when the message is displayed completely and then 
+    // draws a white triangle pointing downwards.  (Wait for user input here.)
+    if(framesCounter>strlen(text)*10){
+        x+=w-48;
+        y+=h-16;
+        DrawTriangle((Vector2){x,y},(Vector2){x+10,y+14},(Vector2){x+20,y},BLACK);
+        DrawTriangle((Vector2){x+1,y+1},(Vector2){x+9,y+13},(Vector2){x+18,y+1},WHITE);
+    }
+    
+}
+
+void drawroundedrect(int x, int y, int w,int h,Color col){
+
+    // our round border size.
+    int roundsize = 20;
+    
+    // if messy then look here..
+    if(w<50)roundsize/=2;
+    if(h<50)roundsize/=2;
+    if(w<20)roundsize/=2;
+    if(h<20)roundsize/=2;
+    
+    // first draw 4 circles at the corners
+    DrawCircle(x+roundsize,y+roundsize,roundsize,col);
+    DrawCircle(x+w-roundsize,y+roundsize,roundsize,col);
+    DrawCircle(x+roundsize,y+h-roundsize,roundsize,col);
+    DrawCircle(x+w-roundsize,y+h-roundsize,roundsize,col);
+
+    // Draw two rectangles on top of the circles..
+    DrawRectangle(x,y+roundsize,w,h-roundsize*2,col);
+    DrawRectangle(x+roundsize,y,w-roundsize*2,h,col);
+}