Improved structure for text_strings_management
This commit is contained in:
parent
12ee86c491
commit
dad91f23e3
|
|
@ -19,10 +19,13 @@
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#define MAX_TEXT_LENGTH 100 // Maximum text particle text length
|
#define MAX_TEXT_LENGTH 100
|
||||||
#define MAX_TEXT_PARTICLES 100 // Maximum quantity of text particles
|
#define MAX_TEXT_PARTICLES 100
|
||||||
#define FONT_SIZE 30
|
#define FONT_SIZE 30
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Types and Structures Definition
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
typedef struct TextParticle {
|
typedef struct TextParticle {
|
||||||
char text[MAX_TEXT_LENGTH];
|
char text[MAX_TEXT_LENGTH];
|
||||||
Rectangle rect; // Boundary
|
Rectangle rect; // Boundary
|
||||||
|
|
@ -36,138 +39,16 @@ typedef struct TextParticle {
|
||||||
bool grabbed;
|
bool grabbed;
|
||||||
} TextParticle;
|
} TextParticle;
|
||||||
|
|
||||||
TextParticle CreateTextParticle(const char *text, float x, float y, Color color)
|
//----------------------------------------------------------------------------------
|
||||||
{
|
// Module Functions Declaration
|
||||||
TextParticle tp = {
|
//----------------------------------------------------------------------------------
|
||||||
.text = "",
|
void PrepareFirstTextParticle(const char* text, TextParticle *tps, int *particleCount);
|
||||||
.rect = { x, y, 30, 30 },
|
TextParticle CreateTextParticle(const char *text, float x, float y, Color color);
|
||||||
.vel = { GetRandomValue(-200, 200), GetRandomValue(-200, 200) },
|
void SliceTextParticle(TextParticle *tp, int particlePos, int sliceLength, TextParticle *tps, int *particleCount);
|
||||||
.ppos = { 0 },
|
void SliceTextParticleByChar(TextParticle *tp, char charToSlice, TextParticle *tps, int *particleCount);
|
||||||
.padding = 5.0f,
|
void ShatterTextParticle(TextParticle *tp, int particlePos, TextParticle *tps, int *particleCount);
|
||||||
.borderWidth = 5.0f,
|
void GlueTextParticles(TextParticle *grabbed, TextParticle *target, TextParticle *tps, int *particleCount);
|
||||||
.friction = 0.99,
|
void RealocateTextParticles(TextParticle *tps, int particlePos, int *particleCount);
|
||||||
.elasticity = 0.9,
|
|
||||||
.color = color,
|
|
||||||
.grabbed = false
|
|
||||||
};
|
|
||||||
|
|
||||||
TextCopy(tp.text, text);
|
|
||||||
tp.rect.width = MeasureText(tp.text, FONT_SIZE)+tp.padding*2;
|
|
||||||
tp.rect.height = FONT_SIZE+tp.padding*2;
|
|
||||||
return tp;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MoveTextParticles(TextParticle *tps, int particlePos, int *particleCount)
|
|
||||||
{
|
|
||||||
for (int i = particlePos+1; i < *particleCount; i++)
|
|
||||||
{
|
|
||||||
tps[i-1] = tps[i];
|
|
||||||
}
|
|
||||||
(*particleCount)--;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SliceTextParticle(TextParticle *tp, int particlePos, int sliceLength, TextParticle *tps, int *particleCount)
|
|
||||||
{
|
|
||||||
int length = TextLength(tp->text);
|
|
||||||
|
|
||||||
if((length > 1) && ((*particleCount+length) < MAX_TEXT_PARTICLES))
|
|
||||||
{
|
|
||||||
// create new particles
|
|
||||||
for (int i = 0; i < length; i += sliceLength)
|
|
||||||
{
|
|
||||||
const char *text = sliceLength == 1 ? TextFormat("%c", tp->text[i]) : TextSubtext(tp->text, i, sliceLength);
|
|
||||||
tps[(*particleCount)++] = CreateTextParticle(
|
|
||||||
text,
|
|
||||||
tp->rect.x + i * tp->rect.width/length,
|
|
||||||
tp->rect.y,
|
|
||||||
(Color) { GetRandomValue(0, 255), GetRandomValue(0, 255), GetRandomValue(0, 255), 255 }
|
|
||||||
);
|
|
||||||
}
|
|
||||||
MoveTextParticles(tps, particlePos, particleCount);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SliceTextParticleByChar(TextParticle *tp, char charToSlice, TextParticle *tps, int *particleCount)
|
|
||||||
{
|
|
||||||
int tokenCount = 0;
|
|
||||||
const char **tokens = TextSplit(tp->text, charToSlice, &tokenCount);
|
|
||||||
|
|
||||||
if (tokenCount > 1)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < tokenCount; i++) {
|
|
||||||
int tokenLength = TextLength(tokens[i]);
|
|
||||||
tps[(*particleCount)++] = CreateTextParticle(
|
|
||||||
TextFormat("%s", tokens[i]),
|
|
||||||
tp->rect.x + i * tp->rect.width/tokenLength,
|
|
||||||
tp->rect.y,
|
|
||||||
(Color) { GetRandomValue(0, 255), GetRandomValue(0, 255), GetRandomValue(0, 255), 255 }
|
|
||||||
);
|
|
||||||
}
|
|
||||||
tps[(*particleCount)++] = CreateTextParticle(
|
|
||||||
TextFormat("%c", charToSlice),
|
|
||||||
tp->rect.x,
|
|
||||||
tp->rect.y,
|
|
||||||
(Color) { GetRandomValue(0, 255), GetRandomValue(0, 255), GetRandomValue(0, 255), 255 }
|
|
||||||
);
|
|
||||||
if (tokenCount)
|
|
||||||
{
|
|
||||||
MoveTextParticles(tps, 0, particleCount);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ShatterTextParticle(TextParticle *tp, int particlePos, TextParticle *tps, int *particleCount)
|
|
||||||
{
|
|
||||||
SliceTextParticle(tp, particlePos, 1, tps, particleCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
void GlueTextParticles(TextParticle *grabbed, TextParticle *target, TextParticle *tps, int *particleCount)
|
|
||||||
{
|
|
||||||
int p1 = -1;
|
|
||||||
int p2 = -1;
|
|
||||||
|
|
||||||
for (int i = 0; i < *particleCount; i++)
|
|
||||||
{
|
|
||||||
if (&tps[i] == grabbed) p1 = i;
|
|
||||||
if (&tps[i] == target) p2 = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((p1 != -1) && (p2 != -1))
|
|
||||||
{
|
|
||||||
TextParticle tp = CreateTextParticle(
|
|
||||||
TextFormat( "%s%s", grabbed->text, target->text),
|
|
||||||
grabbed->rect.x,
|
|
||||||
grabbed->rect.y,
|
|
||||||
RAYWHITE
|
|
||||||
);
|
|
||||||
tp.grabbed = true;
|
|
||||||
tps[(*particleCount)++] = tp;
|
|
||||||
grabbed->grabbed = false;
|
|
||||||
if (p1 < p2)
|
|
||||||
{
|
|
||||||
MoveTextParticles(tps, p2, particleCount);
|
|
||||||
MoveTextParticles(tps, p1, particleCount);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
MoveTextParticles(tps, p1, particleCount);
|
|
||||||
MoveTextParticles(tps, p2, particleCount);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ResetToUpper(const char* text, TextParticle *tps, int *particleCount) {
|
|
||||||
tps[0] = CreateTextParticle(
|
|
||||||
text,
|
|
||||||
GetScreenWidth()/2,
|
|
||||||
GetScreenHeight()/2,
|
|
||||||
RAYWHITE
|
|
||||||
);
|
|
||||||
*particleCount = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------
|
||||||
// Program main entry point
|
// Program main entry point
|
||||||
|
|
@ -181,19 +62,13 @@ int main(void)
|
||||||
|
|
||||||
InitWindow(screenWidth, screenHeight, "raylib [shapes] example - strings management");
|
InitWindow(screenWidth, screenHeight, "raylib [shapes] example - strings management");
|
||||||
|
|
||||||
TextParticle textParticles[MAX_TEXT_PARTICLES] = {
|
TextParticle textParticles[MAX_TEXT_PARTICLES] = { 0 };
|
||||||
CreateTextParticle(
|
int particleCount = 0;
|
||||||
"raylib => fun videogames programming!",
|
|
||||||
GetScreenWidth()/2,
|
|
||||||
GetScreenHeight()/2,
|
|
||||||
RAYWHITE
|
|
||||||
)
|
|
||||||
};
|
|
||||||
|
|
||||||
int particleCount = 1;
|
|
||||||
TextParticle *grabbedTextParticle = NULL;
|
TextParticle *grabbedTextParticle = NULL;
|
||||||
Vector2 pressOffset = {0};
|
Vector2 pressOffset = {0};
|
||||||
|
|
||||||
|
PrepareFirstTextParticle("raylib => fun videogames programming!", textParticles, &particleCount);
|
||||||
|
|
||||||
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
||||||
//---------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
@ -262,14 +137,13 @@ int main(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Reset using TextTo* functions
|
||||||
// Reset using TextTo functions
|
if (IsKeyPressed(KEY_ONE)) PrepareFirstTextParticle("raylib => fun videogames programming!", textParticles, &particleCount);
|
||||||
if (IsKeyPressed(KEY_ONE)) ResetToUpper("raylib => fun videogames programming!", textParticles, &particleCount);
|
if (IsKeyPressed(KEY_TWO)) PrepareFirstTextParticle(TextToUpper("raylib => fun videogames programming!"), textParticles, &particleCount);
|
||||||
if (IsKeyPressed(KEY_TWO)) ResetToUpper(TextToUpper("raylib => fun videogames programming!"), textParticles, &particleCount);
|
if (IsKeyPressed(KEY_THREE)) PrepareFirstTextParticle(TextToLower("raylib => fun videogames programming!"), textParticles, &particleCount);
|
||||||
if (IsKeyPressed(KEY_THREE)) ResetToUpper(TextToLower("raylib => fun videogames programming!"), textParticles, &particleCount);
|
if (IsKeyPressed(KEY_FOUR)) PrepareFirstTextParticle(TextToPascal("raylib_fun_videogames_programming"), textParticles, &particleCount);
|
||||||
if (IsKeyPressed(KEY_FOUR)) ResetToUpper(TextToPascal("raylib_fun_videogames_programming"), textParticles, &particleCount);
|
if (IsKeyPressed(KEY_FIVE)) PrepareFirstTextParticle(TextToSnake("RaylibFunVideogamesProgramming"), textParticles, &particleCount);
|
||||||
if (IsKeyPressed(KEY_FIVE)) ResetToUpper(TextToSnake("RaylibFunVideogamesProgramming"), textParticles, &particleCount);
|
if (IsKeyPressed(KEY_SIX)) PrepareFirstTextParticle(TextToCamel("raylib_fun_videogames_programming"), textParticles, &particleCount);
|
||||||
if (IsKeyPressed(KEY_SIX)) ResetToUpper(TextToCamel("raylib_fun_videogames_programming"), textParticles, &particleCount);
|
|
||||||
|
|
||||||
// Slice by char pressed only when we have one text particle
|
// Slice by char pressed only when we have one text particle
|
||||||
char charPressed = GetCharPressed();
|
char charPressed = GetCharPressed();
|
||||||
|
|
@ -383,3 +257,144 @@ int main(void)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Module Functions Definition
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
void PrepareFirstTextParticle(const char* text, TextParticle *tps, int *particleCount)
|
||||||
|
{
|
||||||
|
tps[0] = CreateTextParticle(
|
||||||
|
text,
|
||||||
|
GetScreenWidth()/2,
|
||||||
|
GetScreenHeight()/2,
|
||||||
|
RAYWHITE
|
||||||
|
);
|
||||||
|
*particleCount = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
TextParticle CreateTextParticle(const char *text, float x, float y, Color color)
|
||||||
|
{
|
||||||
|
TextParticle tp = {
|
||||||
|
.text = "",
|
||||||
|
.rect = { x, y, 30, 30 },
|
||||||
|
.vel = { GetRandomValue(-200, 200), GetRandomValue(-200, 200) },
|
||||||
|
.ppos = { 0 },
|
||||||
|
.padding = 5.0f,
|
||||||
|
.borderWidth = 5.0f,
|
||||||
|
.friction = 0.99,
|
||||||
|
.elasticity = 0.9,
|
||||||
|
.color = color,
|
||||||
|
.grabbed = false
|
||||||
|
};
|
||||||
|
|
||||||
|
TextCopy(tp.text, text);
|
||||||
|
tp.rect.width = MeasureText(tp.text, FONT_SIZE)+tp.padding*2;
|
||||||
|
tp.rect.height = FONT_SIZE+tp.padding*2;
|
||||||
|
return tp;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SliceTextParticle(TextParticle *tp, int particlePos, int sliceLength, TextParticle *tps, int *particleCount)
|
||||||
|
{
|
||||||
|
int length = TextLength(tp->text);
|
||||||
|
|
||||||
|
if((length > 1) && ((*particleCount+length) < MAX_TEXT_PARTICLES))
|
||||||
|
{
|
||||||
|
for (int i = 0; i < length; i += sliceLength)
|
||||||
|
{
|
||||||
|
const char *text = sliceLength == 1 ? TextFormat("%c", tp->text[i]) : TextSubtext(tp->text, i, sliceLength);
|
||||||
|
tps[(*particleCount)++] = CreateTextParticle(
|
||||||
|
text,
|
||||||
|
tp->rect.x + i * tp->rect.width/length,
|
||||||
|
tp->rect.y,
|
||||||
|
(Color) { GetRandomValue(0, 255), GetRandomValue(0, 255), GetRandomValue(0, 255), 255 }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
RealocateTextParticles(tps, particlePos, particleCount);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SliceTextParticleByChar(TextParticle *tp, char charToSlice, TextParticle *tps, int *particleCount)
|
||||||
|
{
|
||||||
|
int tokenCount = 0;
|
||||||
|
const char **tokens = TextSplit(tp->text, charToSlice, &tokenCount);
|
||||||
|
|
||||||
|
if (tokenCount > 1)
|
||||||
|
{
|
||||||
|
int textLength = TextLength(tp->text);
|
||||||
|
for (int i = 0; i < textLength; i++)
|
||||||
|
{
|
||||||
|
if (tp->text[i] == charToSlice)
|
||||||
|
{
|
||||||
|
tps[(*particleCount)++] = CreateTextParticle(
|
||||||
|
TextFormat("%c", charToSlice),
|
||||||
|
tp->rect.x,
|
||||||
|
tp->rect.y,
|
||||||
|
(Color) { GetRandomValue(0, 255), GetRandomValue(0, 255), GetRandomValue(0, 255), 255 }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int i = 0; i < tokenCount; i++)
|
||||||
|
{
|
||||||
|
int tokenLength = TextLength(tokens[i]);
|
||||||
|
tps[(*particleCount)++] = CreateTextParticle(
|
||||||
|
TextFormat("%s", tokens[i]),
|
||||||
|
tp->rect.x + i * tp->rect.width/tokenLength,
|
||||||
|
tp->rect.y,
|
||||||
|
(Color) { GetRandomValue(0, 255), GetRandomValue(0, 255), GetRandomValue(0, 255), 255 }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (tokenCount)
|
||||||
|
{
|
||||||
|
RealocateTextParticles(tps, 0, particleCount);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShatterTextParticle(TextParticle *tp, int particlePos, TextParticle *tps, int *particleCount)
|
||||||
|
{
|
||||||
|
SliceTextParticle(tp, particlePos, 1, tps, particleCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GlueTextParticles(TextParticle *grabbed, TextParticle *target, TextParticle *tps, int *particleCount)
|
||||||
|
{
|
||||||
|
int p1 = -1;
|
||||||
|
int p2 = -1;
|
||||||
|
|
||||||
|
for (int i = 0; i < *particleCount; i++)
|
||||||
|
{
|
||||||
|
if (&tps[i] == grabbed) p1 = i;
|
||||||
|
if (&tps[i] == target) p2 = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((p1 != -1) && (p2 != -1))
|
||||||
|
{
|
||||||
|
TextParticle tp = CreateTextParticle(
|
||||||
|
TextFormat( "%s%s", grabbed->text, target->text),
|
||||||
|
grabbed->rect.x,
|
||||||
|
grabbed->rect.y,
|
||||||
|
RAYWHITE
|
||||||
|
);
|
||||||
|
tp.grabbed = true;
|
||||||
|
tps[(*particleCount)++] = tp;
|
||||||
|
grabbed->grabbed = false;
|
||||||
|
if (p1 < p2)
|
||||||
|
{
|
||||||
|
RealocateTextParticles(tps, p2, particleCount);
|
||||||
|
RealocateTextParticles(tps, p1, particleCount);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
RealocateTextParticles(tps, p1, particleCount);
|
||||||
|
RealocateTextParticles(tps, p2, particleCount);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void RealocateTextParticles(TextParticle *tps, int particlePos, int *particleCount)
|
||||||
|
{
|
||||||
|
for (int i = particlePos+1; i < *particleCount; i++)
|
||||||
|
{
|
||||||
|
tps[i-1] = tps[i];
|
||||||
|
}
|
||||||
|
(*particleCount)--;
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user