Hi good afternoon.
how does cpct_drawToSpriteBuffer work with cpctelera 1.5?
there is something shown as a demo, but I am missing the connection to an executable program.
who can please help once?
thanks.
greeting
Please take a look at CPCtelera samples folder:
\examples\medium\softDoubleBuffer\
Also, this is the original thread started by Arnaud, about routine implementation:
http://www.cpcwiki.eu/forum/programming/help-for-speed-up-to-copy-sprite-array-to-another/ (http://www.cpcwiki.eu/forum/programming/help-for-speed-up-to-copy-sprite-array-to-another/)
Hope this helps
hello thanks for help.
greeting
thanks for the information.
the example is too confusing for me to learn.
is there no clear example for cpct_drawToSpriteBuffer ?
greeting
Quote from: funkheld on 17:55, 29 January 21is there no clear example for cpct_drawToSpriteBuffer ?
I think the example is neatly clear and well documented by the authors. Take your time for read and make a try and you will understand it more in deep.Basically, it declares a software Back buffer (not on VMEM) for storing and composing sprites there:u8 gSpriteBackBuffer[VIEW_W_BYTES*VIEW_H_BYTES];
A pointer to that Back buffer (updated for every sprite to be drawn):backBufferPtr = cpctm_spriteBufferPtr(gSpriteBackBuffer, VIEW_W_BYTES, xPos, yPos);
Then, it draws separately each sprite/tiles to this Back buffer for composing the final sprite.cpct_drawToSpriteBuffer(VIEW_W_BYTES, backBufferPtr, G_BACK_00_W, G_BACK_00_H, g_tileset[tile])
This one with a previously declared mask table for transparency (gMaskTable):cpct_drawToSpriteBufferMaskedAlignedTable(VIEW_W_BYTES, backBufferPtr, G_TITLE_W, G_TITLE_H, g_title, gMaskTable);
And this other one with own mask for transparency defined on sprite bytes:
cpct_drawToSpriteBufferMasked(VIEW_W_BYTES, backBufferPtr, G_SHIP_W, G_SHIP_H, g_ship);
Once Back buffer is composed with desaired sprites, this is drawed to screen (copied to video memory at given pVideoMemLocation), as a normal sprite:cpct_drawSprite(gSpriteBackBuffer, pVideoMemLocation, VIEW_W_BYTES, VIEW_H_BYTES);
If you inspect cpct_drawToSpriteBuffer source code on CPCtelera you will see is in essence an ldir (copy bytes from 'hl' to 'de' until 'bc' reaches '0')
thanks for info.
greeting
hi..
this is ok.
the screen capture now has a section of the screen in 0x4000. the section
can be moved with QWSE. the sprite stays firmly in the middle. no flicker.
greeting
demo is backtest.dsk.
run"test"
#include <cpctelera.h>
#include "sprite816.h"
#include "cpct_floppy.h"
#define SCR_W 80
#define SCR_H 200
#define g_back_w 40
#define g_back_h 48
u8 gScreenCapture[ g_back_h * g_back_w];
u16 nx,ny,x,y,xscr,yscr,xback,yback;
u8* pvmem;
u8* drawptr;
setze_back()
{
pvmem = cpct_getScreenPtr(0x4000,xback,yback);
cpct_getScreenToSprite(pvmem, gScreenCapture, g_back_w, g_back_h);
drawptr=cpctm_spriteBufferPtr(gScreenCapture, g_back_w,nx,ny);
cpct_drawToSpriteBufferMasked(g_back_w,drawptr,G_TILE_SPRITE816_W,G_TILE_SPRITE816_H,g_tile_sprite816);
pvmem = cpct_getScreenPtr(CPCT_VMEM_START, xscr,yscr);
cpct_drawSprite(gScreenCapture, pvmem, g_back_w, g_back_h);
}
void main(void) {
cpct_disableFirmware();
cpct_setPalette(g_tile_palette, 4);
cpct_setVideoMode(0);
StoreDriveLetter();
InitializeAmsdos();
cpct_loadBinaryFile("TEST.SCR", 0x4000);
nx=20;
ny=25;
xscr=20;
yscr=80;
xback=20;
yback=100;
setze_back();
while(1) {
cpct_scanKeyboard_f();
if(cpct_isKeyPressed(Key_E) && xback < (SCR_W - g_back_w))
{
xback=xback+1;
setze_back();
}
else if (cpct_isKeyPressed(Key_Q) && xback > 0)
{
xback=xback-1;
setze_back();
}
if(cpct_isKeyPressed(Key_W) && yback > 0)
{
yback=yback-2;
setze_back();
}
else if (cpct_isKeyPressed(Key_S) && yback < (SCR_H - g_back_h) )
{
yback=yback+2;
setze_back();
}
}
while(1) {};
}
a text screen for a spaceship inside with a window for the outside view.
turning the spaceship with QWES.
you can make great players.
run"test
greeting
QWES turn the spaceship.
3 different screens load from dsk:
key R = test.scr
key T = test1.scr
key Z (Y) = test2.scr
run"test
greeting
#include <cpctelera.h>
#include "sprite816.h"
#include "cpct_floppy.h"
#define SCR_W 80
#define SCR_H 200
#define g_back_w 24
#define g_back_h 32
u8 gScreenCapture[ g_back_h * g_back_w];
u16 nx,ny,x,y,xscr,yscr,xback,yback;
u8* pvmem;
u8* drawptr;
setze_back()
{
pvmem = cpct_getScreenPtr(0x4000,xback,yback);
cpct_getScreenToSprite(pvmem, gScreenCapture, g_back_w, g_back_h);
drawptr=cpctm_spriteBufferPtr(gScreenCapture, g_back_w,nx,ny);
cpct_drawToSpriteBufferMasked(g_back_w,drawptr,G_TILE_SPRITE816_W,G_TILE_SPRITE816_H,g_tile_sprite816);
pvmem = cpct_getScreenPtr(CPCT_VMEM_START, xscr,yscr);
cpct_drawSprite(gScreenCapture, pvmem, g_back_w, g_back_h);
}
void main(void) {
cpct_disableFirmware();
cpct_setPalette(g_tile_palette, 4);
cpct_setVideoMode(0);
StoreDriveLetter();
InitializeAmsdos();
cpct_loadBinaryFile("TEST.SCR", 0x4000);
pvmem = cpctm_screenPtr(0xc000, 0,0);
cpct_setDrawCharM0(7,6);
cpct_drawStringM0(" ", pvmem);
pvmem = cpctm_screenPtr(0xc000, 0,8);
cpct_setDrawCharM0(7,6);
cpct_drawStringM0(" ", pvmem);
pvmem = cpctm_screenPtr(0xc000, 0,16);
cpct_setDrawCharM0(7,6);
cpct_drawStringM0(" ", pvmem);
pvmem = cpctm_screenPtr(0xc000, 0,24);
cpct_setDrawCharM0(7,6);
cpct_drawStringM0(" ", pvmem);
pvmem = cpctm_screenPtr(0xc000, 0,32);
cpct_setDrawCharM0(7,6);
cpct_drawStringM0(" ", pvmem);
pvmem = cpctm_screenPtr(0xc000, 0,40);
cpct_setDrawCharM0(7,6);
cpct_drawStringM0(" ", pvmem);
pvmem = cpctm_screenPtr(0xc000, 20,0+48);
cpct_setDrawCharM0(7,6);
cpct_drawStringM0("AAAAAAAAAA", pvmem);
pvmem = cpctm_screenPtr(0xc000, 20,8+48);
cpct_setDrawCharM0(7, 6);
cpct_drawStringM0("BBBBBBBBBB", pvmem);
pvmem = cpctm_screenPtr(0xc000, 20,16+48);
cpct_setDrawCharM0(1, 9);
cpct_drawStringM0("CCCCCCCCCC", pvmem);
pvmem = cpctm_screenPtr(0xc000, 20,24+48);
cpct_setDrawCharM0(1, 9);
cpct_drawStringM0("DDDDDDDDDD", pvmem);
pvmem = cpctm_screenPtr(0xc000, 20,32+48);
cpct_setDrawCharM0(7,6);
cpct_drawStringM0("EEEEEEEEEE", pvmem);
pvmem = cpctm_screenPtr(0xc000, 20,40+48);
cpct_setDrawCharM0(7,6);
cpct_drawStringM0("FFFFFFFFFF", pvmem);
nx=10;
ny=10;
xscr=28;
yscr=10;
xback=20;
yback=100;
setze_back();
while(1) {
cpct_scanKeyboard_f();
if(cpct_isKeyPressed(Key_E) && xback < (SCR_W - g_back_w))
{
xback=xback+1;
setze_back();
}
else if (cpct_isKeyPressed(Key_Q) && xback > 0)
{
xback=xback-1;
setze_back();
}
if(cpct_isKeyPressed(Key_W) && yback > 0)
{
yback=yback-2;
setze_back();
}
else if (cpct_isKeyPressed(Key_S) && yback < (SCR_H - g_back_h) )
{
yback=yback+2;
setze_back();
}
else if (cpct_isKeyPressed(Key_R))
{
StoreDriveLetter();
InitializeAmsdos();
cpct_loadBinaryFile("TEST.SCR", 0x4000);
setze_back();
}
else if (cpct_isKeyPressed(Key_T))
{
StoreDriveLetter();
InitializeAmsdos();
cpct_loadBinaryFile("TEST1.SCR", 0x4000);
setze_back();
}
else if (cpct_isKeyPressed(Key_Y))
{
StoreDriveLetter();
InitializeAmsdos();
cpct_loadBinaryFile("TEST2.SCR", 0x4000);
setze_back();
}
}
while(1) {};
}