One of the ways I came up with was to using the MoveImage() function.
But it has one problem: You can't properly scroll 4bit textures or 8bit textures properly in the X axis (works fine for the Y axis though).
Plus I have no idea of how it impacts performance.
This is the code I'm currently using:
Code: Select all
// Texture Scroller
RECT txa_copy[4];
short txa_src_x, txa_src_y;
short txa_dst_x, txa_dst_y;
unsigned char txa_w, txa_h;
unsigned char txa_ofs_x, txa_ofs_y;
char txa_spd_x;
char txa_spd_y;
void TexAnim_Setup(short sx, short sy, short dx, short dy, unsigned char w, unsigned char h, char spdx, char spdy) {
txa_src_x = sx;
txa_src_y = sy;
txa_dst_x = dx;
txa_dst_y = dy;
txa_w = w;
txa_h = h;
txa_ofs_x = 0;
txa_ofs_y = 0;
txa_spd_x = spdx;
txa_spd_y = spdy;
}
void TexAnim_Update() {
txa_copy[0].x = txa_src_x;
txa_copy[0].y = txa_src_y;
txa_copy[0].w = txa_w - txa_ofs_x;
txa_copy[0].h = txa_h - txa_ofs_y;
txa_copy[1].x = txa_src_x + (txa_w - txa_ofs_x) % txa_w;
txa_copy[1].y = txa_src_y + (txa_h - txa_ofs_y) % txa_w;
txa_copy[1].w = txa_ofs_x;
txa_copy[1].h = txa_ofs_y;
txa_copy[2].x = txa_copy[0].x;
txa_copy[2].w = txa_copy[0].w;
txa_copy[2].y = txa_copy[1].y;
txa_copy[2].h = txa_copy[1].h;
txa_copy[3].x = txa_copy[0].x;
txa_copy[3].w = txa_copy[0].w;
txa_copy[3].y = txa_copy[0].y;
txa_copy[3].h = txa_copy[0].h;
MoveImage(&txa_copy[0], txa_dst_x+txa_ofs_x, txa_dst_y+txa_ofs_y);
MoveImage(&txa_copy[1], txa_dst_x, txa_dst_y);
MoveImage(&txa_copy[2], txa_dst_x, txa_dst_y);
MoveImage(&txa_copy[3], txa_dst_x, txa_dst_y+txa_ofs_y);
txa_ofs_x = (txa_ofs_x + txa_spd_x)%txa_w;
txa_ofs_y = (txa_ofs_y + txa_spd_y)%txa_h;
}
I've heard that I could change the Draw Environment and render polygons to some texture page in order to achieve this, but I'm not sure exactly how to do it, or even, if it has better performance than this.