Dark Bit Factory & Gravity
PROGRAMMING => Freebasic => Topic started by: DrewPee on September 13, 2006
-
I noticed that somebody (a while ago now) had written something in Blitz that looked like a C64 loading/depacking screen . . .
so i decided to try and write one using FreeBasic and tinyptc, and i think ive done it - see what you think.
I guess it aint much use to anybody but at least i have the hang of tinyptc now!!! Thanks to all you other coders on here!
DrewPee
-
Nice work mate :)
-
Not looked at this yet as im in work, but its good to see your getting the hang of tinyptc, keep up the good work
-
Thanks guys - it took a while to stick in but I think I have it now!
DrewPee
-
big thumbs up mate for taking the dive into tiny ptc as i know it can be a bit daunting at first good stuff :)
-
The trick with tinyptc is to remember that it soesn't matter how the colours get into the screen array. Actually I was a bit confused about the way you'd coded it, it seemed to run slowly, I remember the loading bars being a little bit faster so I took the liberty of optimising the code a little, though your cool technique stays intact :)
'
' C64 DEPACK SCREEN BY DREWPEE, SOME OPTIMISATIONS BY SHOCKWAVE.
'
option explicit
#define PTC_WIN
#Include Once "tinyptc.bi"
Const XRES=640
Const YRES=480
Dim Shared ScreenBuffer(XRES*YRES)
If(ptc_open("C64 unpacking by DrewPee",xres,yres)=0) Then
End -1
End If
dim as uinteger y,blk,rgbb,XW
dim as ubyte ranr,rang,ranb
DIM SHARED PP AS INTEGER PTR
do
ranr=(INT(RND(1)*255)+1)
rang=(INT(RND(1)*255)+1)
ranb=(INT(RND(1)*255)+1)
rgbb=rgb(ranr,rang,ranb)
XW=xres
for y=0 to yres-1
blk=rnd*(100)
if blk>90 then
ranr=(INT(RND(1)*255)+1)
rang=(INT(RND(1)*255)+1)
ranb=(INT(RND(1)*255)+1)
rgbb=rgb(ranr,rang,ranb)
end if
if y<yres then
PP = @ScreenBuffer(Y*XRES)
asm
mov eax,dword ptr[rgbb]
mov ecx, [XW]
mov edi, [PP]
cld
rep stosd
end asm
end if
next y
ptc_update @screenbuffer(0)
LOOP UNTIL INKEY$<>""
ptc_close
end
Please note that it is not the asm that has made a huge difference here, it's the way your code was structured. I've broken it down for you;
GENERATE BLOCK SIZE AND COLOUR
NOTE THAT THIS IS WHERE YOUR OUTER LOOP STARTS!
do
blk=(INT(RND(1)*20)+1)
ranr=(INT(RND(1)*255)+1)
rang=(INT(RND(1)*255)+1)
ranb=(INT(RND(1)*255)+1)
DRAW **ONLY** THE BLOCK YOU CALCULATED ABOVE
for y=top to top+blk
for x=0 to xres-1
feedpixels(x,y,rgb(ranr,rang,ranb))
next x
next y
MOVE THE BLOCK OFFSET AND BOUNDS CHECK;
top=top+blk
if top-blk>=564 then top=0
UPDATE THE SCREEN AFTER ONLY DRAWING ONE BLOCK!!!!!!!
ptc_update @screenbuffer(0)
LOOP UNTIL INKEY$<>""
In fact if you'd put the command Erase ScreenBuffer after the ptc update your problem would become clearer as you'd see that you only drew one raster block per update.
If that was the effect that you intended to do though I sincerely apologise for my meddling and I'll stfu :)
-
Thanks for the optimisations Shockwave - the effect did need to be faster I guess.
I just need to do something with it now!!!!
Drew
-
Yes indeed :) A demo would be nice mate.