Repository navigation
Expand file tree
/
Copy pathsprites.cpp
More file actions
110 lines (95 loc) · 3.13 KB
/
Copy pathsprites.cpp
File metadata and controls
110 lines (95 loc) · 3.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/*******************************************************************************************
*
* Sprite animation and movement example
*
* Welcome to raylib!
*
* To test examples, just press F6 and execute raylib_compile_execute script
* Note that compiled executable is placed in the same folder as .c file
*
* You can find all basic examples on C:\raylib\raylib\examples folder or
* raylib official webpage: www.raylib.com
*
* Enjoy using raylib. :)
*
* This example has been created using raylib 4.0 (www.raylib.com)
* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
*
* Copyright (c) 2022 Jeffery Myers
*
********************************************************************************************/
#include "sprites.h"
#include <math.h>
SpriteSheet LoadSpriteSheet(const char* file, int cols, int rows)
{
SpriteSheet sheet = { 0 };
sheet.SheetTexture = LoadTexture(file);
if (sheet.SheetTexture.id >= 0)
{
float w = (float)sheet.SheetTexture.width / cols;
float h = (float)sheet.SheetTexture.height / rows;
for (int y = 0; y < rows; y++)
{
for (int x = 0; x < cols; x++)
{
sheet.Frames.emplace_back(Rectangle{ x * w,y * h,w,h });
}
}
}
return std::move(sheet);
}
int AddFippedFrames(SpriteSheet& sheet, int start, int end, bool flipX, int flipY)
{
int delta = end - start;
int offset = delta / abs(delta);
int newStart = (int)sheet.Frames.size();
for (int i = start; i != end + offset; i += offset)
{
if (i >= 0 || i < (int)sheet.Frames.size())
{
Rectangle rect = sheet.Frames[i];
if (flipX)
rect.width *= -1;
if (flipY)
rect.height *= -1;
sheet.Frames.emplace_back(std::move(rect));
}
}
return newStart;
}
void DrawSprite(SpriteInstance& sprite)
{
if (sprite.Sheet == nullptr || sprite.Sheet->SheetTexture.id == 0 || sprite.Animation == nullptr)
return;
Rectangle frame = sprite.Sheet->Frames[sprite.CurrentFrame];
DrawTexturePro(sprite.Sheet->SheetTexture, frame, Rectangle{ sprite.Position.x,sprite.Position.y,fabsf(frame.width),fabsf(frame.height)}, sprite.Offset, 0, WHITE);
}
void UpdateSpriteAnimation(SpriteInstance& sprite)
{
if (sprite.Animation == nullptr)
return;
sprite.FrameLifetime += GetFrameTime();
if (sprite.FrameLifetime > 1.0f / sprite.Animation->FPS)
{
sprite.FrameLifetime = 0;
sprite.CurrentFrame++;
sprite.AnimationDone = false;
if (sprite.CurrentFrame > sprite.Animation->EndFrame)
{
if (sprite.Animation->Loops)
sprite.CurrentFrame = sprite.Animation->StartFrame;
else
{
sprite.AnimationDone = true;
sprite.CurrentFrame--;
}
}
}
}
void SetSpriteAnimation(SpriteInstance& sprite, const SpriteAnimation& animation)
{
sprite.Animation = &animation;
sprite.CurrentFrame = animation.StartFrame;
sprite.FrameLifetime = 0;
sprite.AnimationDone = false;
}