JNGL
Easy to use cross-platform 2D game library
Loading...
Searching...
No Matches
Sprite Class Reference

Higher-level representation of an image. More...

#include <jngl/Sprite.hpp>

Classes

class  Batch
 While this object is alive, don't do any other draw calls. Should never outlive its Sprite. More...
 
class  Loader
 Use this class to load a Sprite asynchronously. More...
 

Public Types

enum class  LoadType : uint8_t { NORMAL , HALF , THREADED }
 

Public Member Functions

 Sprite (const ImageData &, double scale, std::optional< std::string_view > filename=std::nullopt)
 Creates a Sprite from ImageData and scales it by scale.
 
 Sprite (const uint8_t *bytes, size_t width, size_t height)
 The sprite data is stored as packed RGBA bytes in an array, where the size of the array needs to be calculated as width * height * 4.
 
 Sprite (const std::string &filename, LoadType loadType=LoadType::NORMAL)
 
void step ()
 Does nothing.
 
void draw () const
 Draws the Sprite, centered by default.
 
void draw (const Mat3 &modelview, const ShaderProgram *shaderProgram=nullptr) const
 Draws the image centered using modelview.
 
void draw (Mat3 modelview, Alpha, const ShaderProgram *shaderProgram=nullptr) const
 
void draw (Mat3 modelview, Rgba color) const
 Draws the sprite but multiplies each pixel's color with color.
 
void draw (const ShaderProgram *shaderProgram) const
 Draws the sprite using the specified shader program.
 
Batch batch (const ShaderProgram *shaderProgram=nullptr) const
 Allows to draw the Sprite multiple times at different locations in an efficient way.
 
void drawScaled (float xfactor, float yfactor, const ShaderProgram *shaderProgram=nullptr) const
 Draws the image scaled by xfactor and yfactor
 
void drawClipped (float xstart, float xend, float ystart, float yend) const
 
void drawClipped (Vec2 start, Vec2 end) const
 Draw a cutout of the sprite. drawClipped({0, 0}, {1, 1}) would draw it normally.
 
void drawMesh (const std::vector< Vertex > &vertexes, const ShaderProgram *=nullptr) const
 Draws a list of triangles with the sprite's texture on it using the global modelview from jngl::modelview()
 
void drawMesh (const Mat3 &modelview, const std::vector< Vertex > &vertexes, const ShaderProgram *shaderProgram=nullptr) const
 Draws a list of triangles with the sprite's texture on it, ignores the Sprite's position.
 
void drawMesh (const Mat3 &modelview, const std::vector< Vertex > &vertexes, jngl::Rgba color, const ShaderProgram *=nullptr) const
 
void setBytes (const unsigned char *)
 
Vec2 getPos () const
 
void setPos (double x, double y)
 
template<class Vect >
void setPos (Vect p)
 
jngl::Vec2 getCenter () const
 
void setCenter (double x, double y)
 
template<class Vect >
void setCenter (Vect c)
 
double getLeft () const
 
void setLeft (double x)
 
double getTop () const
 
void setTop (double y)
 
double getRight () const
 
void setRight (double x)
 
double getBottom () const
 
void setBottom (double y)
 
double getX () const
 
void setX (double)
 
double getY () const
 
void setY (double)
 
Vec2 getSize () const
 
float getWidth () const
 
float getHeight () const
 
void drawBoundingBox () const
 
bool contains (jngl::Vec2 point) const
 

Static Public Member Functions

static const ShadervertexShader ()
 Returns a reference to JNGL's default vertex shader used to draw textures.
 

Public Attributes

std::shared_ptr< Finallyloader
 Function which actually loads the sprite.
 

Detailed Description

Higher-level representation of an image.

Definition at line 26 of file Sprite.hpp.

Collaboration diagram for Sprite:
[legend]

Member Enumeration Documentation

◆ LoadType

enum class LoadType : uint8_t
strong

Definition at line 28 of file Sprite.hpp.

Constructor & Destructor Documentation

◆ Sprite() [1/2]

Sprite ( const ImageData & ,
double scale,
std::optional< std::string_view > filename = std::nullopt )
explicit

Creates a Sprite from ImageData and scales it by scale.

When you want to draw an ImageData that hasn't been scaled, make sure to pass JNGL's scale factor so that it appears as the same size independent of the resolution of the user.

Example:

auto img = jngl::ImageData::load("foo.png");
auto sprite2 = std::make_unique<jngl::Sprite>("foo.png");
assert(std::lround(sprite1.getWidth()) == std::lround(sprite2.getWidth()));
static std::unique_ptr< ImageData > load(const std::string &filename, double scaleHint=1.)
Passing a filename will load the specified filename.
T make_unique(T... args)
double getScaleFactor()
Size of one screen pixel in actual pixels.
T lround(T... args)

You may pass a filename, then JNGL will use that as a key for its internal texture cache, meaning that if there's already a file loaded with that name, it won't upload the passed ImageData to the GPU again.

◆ Sprite() [2/2]

Sprite ( const std::string & filename,
LoadType loadType = LoadType::NORMAL )
explicit
Deprecated
Use Loader instead

Member Function Documentation

◆ draw() [1/3]

void draw ( const Mat3 & modelview,
const ShaderProgram * shaderProgram = nullptr ) const

Draws the image centered using modelview.

Parameters
shaderProgramPassing nullptr uses the default.

◆ draw() [2/3]

void draw ( Mat3 modelview,
Rgba color ) const

Draws the sprite but multiplies each pixel's color with color.

If the sprite is mostly white, this will make it appear in the specified color. If it's black, nothing will change.

◆ draw() [3/3]

void draw ( const ShaderProgram * shaderProgram) const

Draws the sprite using the specified shader program.

Parameters
shaderProgramA pointer to the ShaderProgram object to use for drawing.

◆ batch()

Batch batch ( const ShaderProgram * shaderProgram = nullptr) const

Allows to draw the Sprite multiple times at different locations in an efficient way.

This is pureley a performance optimisation. If it's fast enough, use Sprite::draw instead.

Example:

void MyWork::draw() const {
auto batch = mySprite.batch();
for (jngl::Vec2 position : positions) {
}
}
void draw(Mat3 modelview) const
Draws the Sprite which created this Batch centered using modelview.
Batch batch(const ShaderProgram *shaderProgram=nullptr) const
Allows to draw the Sprite multiple times at different locations in an efficient way.
Two-dimensional vector.
Definition Vec2.hpp:36
jngl::Mat3 modelview()
Returns a copy of the global ModelView matrix.
void translate(double x, double y)
Multiplies the global ModelView matrix with a translation matrix.
Parameters
shaderProgramPassing nullptr uses the default.

◆ drawScaled()

void drawScaled ( float xfactor,
float yfactor,
const ShaderProgram * shaderProgram = nullptr ) const

Draws the image scaled by xfactor and yfactor

Parameters
xfactorScale width by this factor
yfactorScale height by this factor
shaderProgramPassing nullptr uses the default.

drawScaled(1, 1) would draw it normally. You can pass negative values to flip the image. For example drawScaled(-1, 1) would draw the image horizontally flipped.

Deprecated
Scale the modelview matrix instead using jngl::Mat3::scale

◆ drawClipped()

void drawClipped ( float xstart,
float xend,
float ystart,
float yend ) const
Deprecated
Use new drawClipped(Vec2, Vec2) method instead

◆ drawMesh()

void drawMesh ( const Mat3 & modelview,
const std::vector< Vertex > & vertexes,
const ShaderProgram * shaderProgram = nullptr ) const

Draws a list of triangles with the sprite's texture on it, ignores the Sprite's position.

Example:

// mySprite is a Texture Atlas with two images next to each other.
// First image:
vertexes.emplace_back( 0, 0, 0, 0); // triangle 1
vertexes.emplace_back(10, 0, 0.5, 0);
vertexes.emplace_back(10, 10, 0.5, 1);
vertexes.emplace_back(10, 10, 0.5, 1); // triangle 2
vertexes.emplace_back( 0, 10, 0, 1);
vertexes.emplace_back( 0, 0, 0, 0);
// Second image:
vertexes.emplace_back(30, 0, 0.5, 0); // triangle 1
vertexes.emplace_back(40, 0, 1, 0);
vertexes.emplace_back(40, 10, 1, 1);
vertexes.emplace_back(40, 10, 1, 1); // triangle 2
vertexes.emplace_back(30, 10, 0.5, 1);
vertexes.emplace_back(30, 0, 0.5, 0);
mySprite.drawMesh(vertexes);
T emplace_back(T... args)
Parameters
shaderProgramPassing nullptr uses the default.

◆ setPos()

template<class Vect >
void setPos ( Vect p)
inline

Definition at line 241 of file Sprite.hpp.

◆ setCenter()

template<class Vect >
void setCenter ( Vect c)
inline

Definition at line 247 of file Sprite.hpp.

Member Data Documentation

◆ loader

Function which actually loads the sprite.

Definition at line 236 of file Sprite.hpp.


The documentation for this class was generated from the following file: