[examples] improve input_virtual_controls example (#4584)

This commit is contained in:
danil 2024-12-08 09:52:09 +02:00 committed by GitHub
parent ca6c5f4f3c
commit 2820fcc29e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 113 additions and 62 deletions

View file

@ -6,7 +6,8 @@
* *
* Example create by GreenSnakeLinux (@GreenSnakeLinux), * Example create by GreenSnakeLinux (@GreenSnakeLinux),
* lighter by oblerion (@oblerion) and * lighter by oblerion (@oblerion) and
* reviewed by Ramon Santamaria (@raysan5) * reviewed by Ramon Santamaria (@raysan5) and
* improved by danilwhale (@danilwhale)
* *
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified, * Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
* BSD-like license that allows static linking with closed source software * BSD-like license that allows static linking with closed source software
@ -17,6 +18,16 @@
#include "raylib.h" #include "raylib.h"
#include <math.h> #include <math.h>
typedef enum {
BUTTON_NONE = -1,
BUTTON_UP,
BUTTON_LEFT,
BUTTON_RIGHT,
BUTTON_DOWN,
BUTTON_MAX
} PadButton;
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
// Program main entry point // Program main entry point
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
@ -29,24 +40,38 @@ int main(void)
InitWindow(screenWidth, screenHeight, "raylib [core] example - input virtual controls"); InitWindow(screenWidth, screenHeight, "raylib [core] example - input virtual controls");
const float dpadX = 90; Vector2 padPosition = { 100, 350 };
const float dpadY = 300; float buttonRadius = 30;
const float dpadRad = 25.0f;//radius of each pad
Color dpadColor = BLUE;
int dpadKeydown = -1;//-1 if not down, else 0,1,2,3
Vector2 buttonPositions[BUTTON_MAX] =
const float dpadCollider[4][2]= // collider array with x,y position
{ {
{dpadX,dpadY-dpadRad*1.5f},//up { padPosition.x,padPosition.y - buttonRadius*1.5f }, // Up
{dpadX-dpadRad*1.5f,dpadY},//left { padPosition.x - buttonRadius*1.5f, padPosition.y }, // Left
{dpadX+dpadRad*1.5f,dpadY},//right { padPosition.x + buttonRadius*1.5f, padPosition.y }, // Right
{dpadX,dpadY+dpadRad*1.5f}//down { padPosition.x, padPosition.y + buttonRadius*1.5f } // Down
}; };
const char dpadLabel[4]="XYBA";//label of Dpad
float playerX=100; const char *buttonLabels[BUTTON_MAX] =
float playerY=100; {
"Y", // Up
"X", // Left
"B", // Right
"A" // Down
};
Color buttonLabelColors[BUTTON_MAX] =
{
YELLOW, // Up
BLUE, // Left
RED, // Right
GREEN // Down
};
int pressedButton = BUTTON_NONE;
Vector2 inputPosition = { 0, 0 };
Vector2 playerPosition = { (float)screenWidth/2, (float)screenHeight/2 };
float playerSpeed = 75;
SetTargetFPS(60); SetTargetFPS(60);
//-------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------
@ -54,63 +79,89 @@ int main(void)
// Main game loop // Main game loop
while (!WindowShouldClose()) // Detect window close button or ESC key while (!WindowShouldClose()) // Detect window close button or ESC key
{ {
// Update // Update
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
dpadKeydown = -1; //reset if ((GetTouchPointCount() > 0))
int inputX = 0; {
int inputY = 0; // Use touch position
if(GetTouchPointCount()>0) inputPosition = GetTouchPosition(0);
{//use touch pos
inputX = GetTouchX();
inputY = GetTouchY();
} }
else else
{//use mouse pos
inputX = GetMouseX();
inputY = GetMouseY();
}
for(int i=0;i<4;i++)
{ {
//test distance each collider and input < radius // Use mouse position
if( fabsf(dpadCollider[i][1]-inputY) + fabsf(dpadCollider[i][0]-inputX) < dpadRad) inputPosition = GetMousePosition();
{
dpadKeydown = i;
break;
}
} }
// move player
switch(dpadKeydown){ // Reset pressed button to none
case 0: playerY -= 50*GetFrameTime(); pressedButton = BUTTON_NONE;
break;
case 1: playerX -= 50*GetFrameTime(); // Make sure user is pressing left mouse button if they're from desktop
break; if ((GetTouchPointCount() > 0) || ((GetTouchPointCount() == 0) && IsMouseButtonDown(MOUSE_BUTTON_LEFT)))
case 2: playerX += 50*GetFrameTime(); {
break; // Find nearest D-Pad button to the input position
case 3: playerY += 50*GetFrameTime(); for (int i = 0; i < BUTTON_MAX; i++)
default:;
};
//--------------------------------------------------------------------------
// Draw
//--------------------------------------------------------------------------
BeginDrawing();
ClearBackground(RAYWHITE);
for(int i=0;i<4;i++)
{ {
//draw all pad float distX = fabsf(buttonPositions[i].x - inputPosition.x);
DrawCircleV((Vector2) { dpadCollider[i][0], dpadCollider[i][1] }, dpadRad, dpadColor); float distY = fabsf(buttonPositions[i].y - inputPosition.y);
if(i!=dpadKeydown)
if ((distX + distY < buttonRadius))
{ {
//draw label pressedButton = i;
DrawText(TextSubtext(dpadLabel,i,1), break;
(int)dpadCollider[i][0]-7,
(int)dpadCollider[i][1]-8,20,BLACK);
} }
} }
}
// Move player according to pressed button
switch (pressedButton)
{
case BUTTON_UP:
{
playerPosition.y -= playerSpeed*GetFrameTime();
break;
}
case BUTTON_LEFT:
{
playerPosition.x -= playerSpeed*GetFrameTime();
break;
}
case BUTTON_RIGHT:
{
playerPosition.x += playerSpeed*GetFrameTime();
break;
}
case BUTTON_DOWN:
{
playerPosition.y += playerSpeed*GetFrameTime();
break;
}
default: break;
};
//--------------------------------------------------------------------------
// Draw
//--------------------------------------------------------------------------
BeginDrawing();
ClearBackground(RAYWHITE);
// Draw world
DrawCircleV(playerPosition, 50, MAROON);
// Draw GUI
for (int i = 0; i < BUTTON_MAX; i++)
{
DrawCircleV(buttonPositions[i], buttonRadius, (i == pressedButton)? DARKGRAY : BLACK);
DrawText(buttonLabels[i],
(int)buttonPositions[i].x - 7, (int)buttonPositions[i].y - 8,
20, buttonLabelColors[i]);
}
DrawText("move the player with D-Pad buttons", 10, 10, 20, DARKGRAY);
DrawRectangleRec((Rectangle) { playerX - 4, playerY - 4, 75, 28 }, RED);
DrawText("Player", (int)playerX, (int)playerY, 20, WHITE);
EndDrawing(); EndDrawing();
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
} }
// De-Initialization // De-Initialization

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.9 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Before After
Before After