News:

Printed Amstrad Addict magazine announced, check it out here!

Main Menu

cpctelera 1.5 : cpct_drawToSpriteBuffer ?

Started by funkheld, 09:07, 29 January 21

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

funkheld


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

SpDizzy

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/

Hope this helps

funkheld


funkheld


thanks for the information.

the example is too confusing for me to learn.
is there no clear example for cpct_drawToSpriteBuffer ?

greeting

SpDizzy

#4
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')

funkheld

#5
thanks for info.


greeting

funkheld

#6
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) {};


}

funkheld

#7
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

funkheld

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) {};


}

Powered by SMFPacks Menu Editor Mod