The render component will provide all of the graphic display of the entity. This can be a static sprite or an animation. The static sprite can be an entire texture, or a portion of a texture. For example, you may load an entire texture into the video card and simply use a portion of it. The animation may load a texture of frames into the video card and then display the appropriate frame or sub-image of the texture as needed.
First we can see the graphics engine loading a sprite with a texture. This texture is a sprite sheet with multiple different views for the sprite's graphical representation.
Sprite Sheet Full Texture |
#include "precomp.hpp"
#include "Engine.hpp"
#include <vector>
#include <stdlib.h>
int main(int aargc, const char* argv[])
{
// Setup the window
Engine* engine = new Engine("Game Engine Sprite Test", 800,600);
// Load a texture
int t0 = engine->addTexture("link_64px.png");
// Create collision area
std::vector<ge::fVertex> square;
square.push_back(ge::fVertex(0.0f,0.0f));
square.push_back(ge::fVertex(64.0f,0.0f));
square.push_back(ge::fVertex(64.0f,64.0f));
square.push_back(ge::fVertex(0.0f,64.0f));
// Create a collider sprite
Entity* link = engine->addColliderSprite(&square, ge::Collision_SOLID, t0);
//std::vector<Entity*>::iterator it;
while(engine->isRunning())
{
engine->run();
}
delete engine;
engine = NULL;
}
Note: These may become integer based sizes as images are in whole pixels, but I am testing whether keeping everything in float is better than converting between int and float repeatedly.
Now you can see in the above picture and code that loading a texture into the sprite causes the entire texture to be drawn but we don't want that in the case of sprite sheets.
Single Frame Sprite |
#include "precomp.hpp"
#include "Engine.hpp"
#include <vector>
#include <stdlib.h>
int main(int aargc, const char* argv[])
{
// Setup the window
Engine* engine = new Engine("Game Engine Sprite Test", 800,600);
// Load a texture
int t0 = engine->addTexture("link_64px.png");
// Create collision area
std::vector<ge::fVertex> square;
square.push_back(ge::fVertex(0.0f,0.0f));
square.push_back(ge::fVertex(64.0f,0.0f));
square.push_back(ge::fVertex(64.0f,64.0f));
square.push_back(ge::fVertex(0.0f,64.0f));
// Create a collider sprite
Entity* link = engine->addColliderSprite(&square, ge::Collision_SOLID, t0);
// Set the sprite to a single frame
link->setTextureRect(0.0f,64.0f,0.0f,59.1f);
//std::vector<Entity*>::iterator it;
while(engine->isRunning())
{
engine->run();
}
delete engine;
engine = NULL;
}
Here you can see that with a single line change in the source, we now have just the forward facing Link. Now let's turn this into an animation and see how the sprite performs ... to be continued.
No comments:
Post a Comment