Code: (Select All)
' QB64PE Fire Logo
'
' All the assets are here needed to create custom QB64PE logos
' The subroutine "GetAssets" gathers everything from the image and sound files
' The included animation is just a sample (main code).
'
' SPRITE SHEET SIZE
' ----------------------------- ---------
' LogoLargeSheetTransparent.PNG - 3000x4800 (10 columns, 16 rows)
' LogoSmallSheetTransparent.PNG - 215x 460
' LogoPhoenixMaskTransparent.PNG - 300x 300 (not really a sprite sheet as it contains only one image)
'
' Note: The screen or image used to create QB64PE logos is assumed to be 300x300 pixels.
' The numbers below are based on that 300x300 screen/image size.
'
' ON SCREEN
' SPRITE COORDINATES ON SHEET LOCATION SIZE ON SPRITE SHEET
' ------------------ ----------- ----------------- ------- -----------------------------
' PhoenixFire(x) - ( 0, 0) 110 phoenix fire images 300x300 LogoLargeSheetTransparent.PNG (0, 0)-(2999,3299) @ 300x300
' Fire(c) - ( 0, 0) 50 bottom fire images 300x300 LogoLargeSheetTransparent.PNG (0,3300)-(2999,4799) @ 300x300
' Sprite.RedPhoenix - ( 59, 8) ( 0, 0)-(182, 289) 183x290 LogoSmallSheetTransparent.PNG
' Sprite.QB64 - (110, 19) ( 0, 290)-( 78, 375) 79x 86 LogoSmallSheetTransparent.PNG
' Sprite.PE - (108, 162) ( 79, 240)-(162, 329) 84x 40 LogoSmallSheetTransparent.PNG
' Sprite.LetterQ - (110, 19) ( 0, 290)-( 36, 333) 37x 44 LogoSmallSheetTransparent.PNG
' Sprite.LetterB - (154, 19) ( 44, 290)-( 77, 330) 34x 41 LogoSmallSheetTransparent.PNG
' Sprite.Number6 - (111, 65) ( 1, 336)-( 34, 375) 34x 40 LogoSmallSheetTransparent.PNG
' Sprite.Number4 - (152, 65) ( 42, 336)-( 78, 375) 37x 40 LogoSmallSheetTransparent.PNG
' Sprite.LetterP - (108, 162) ( 79, 290)-(117, 329) 40x 40 LogoSmallSheetTransparent.PNG
' Sprite.LetterE - (154, 162) (125, 290)-(162, 329) 38x 40 LogoSmallSheetTransparent.PNG
' Sprite.WordPhoenix - (108, 162) ( 0, 376)-(214, 417) 215x 42 LogoSmallSheetTransparent.PNG
' Sprite.WordEdition - (154, 162) ( 0, 418)-(185, 459) 186x 42 LogoSmallSheetTransparent.PNG
' Sprite.PhoenixMask - ( 0, 0) ( 0, 0)-(299, 299) 300x300 LogoPhoenixMaskTransparent.PNG
' COLORS USED
' -----------
' Color of Q = _RGB32( 77, 161, 179) Dark Cyan
' Color of B = _RGB32( 26, 50, 230) Off Blue
' Color of 6 = _RGB32(242, 175, 13) Light Orange
' Color of 4 = _RGB32(242, 94, 13) Burnt Orange
' Color of P = _RGB32(255, 255, 0) Yellow
' Color of E = _RGB32(255, 255, 0) Yellow
' All RED in images = _RGB32(255, 0, 0) (red phoenix, red in "hoenix" and "dition")
' BLACK around "dition" and "hoenix" = _RGB32( 0, 0, 1) Almost Black (if letter border fading/hiding is desired)
' All other BLACK in images = _RGB32( 0, 0, 0) (letter outlines, phoenix mask)
' All TRANSPARENT in images = _RGB32(255, 0, 255) Magenta
OPTION _EXPLICIT ' declare those variables!
CONST BACKGROUND~& = _RGB32(0, 0, 0) ' background color
' Note: Background color not working correctly when flame outline is faded out. Need to correct this.
' Use black for now.
TYPE IMAGE ' IMAGE & LOCATION PROPERTIES
Image AS LONG ' sprite image
x AS SINGLE ' default screen X location
y AS SINGLE ' default screen Y location
END TYPE
TYPE SPRITE ' SPRITE IMAGE PROPERTIES
RedPhoenix AS IMAGE ' red phoenix silhoutte surrounded by black outline
QB64 AS IMAGE ' multicolored QB64 as one image each letter surrounded by black outline
PE AS IMAGE ' yellow PE as one image each letter surrounded by black outline
LetterQ AS IMAGE ' just the cyan letter Q surrounded by black outline
LetterB AS IMAGE ' just the blue letter B surrounded by black outline
Number6 AS IMAGE ' just the light orange number 6 surrounded by black outline
Number4 AS IMAGE ' just the dark orange number 4 surrounded by black outline
LetterP AS IMAGE ' just the yellow letter P surrounded by black outline
LetterE AS IMAGE ' just the yellow letter E surrounded by black outline
WordPhoenix AS IMAGE ' the entire word "Phoenix", yellow P, red "hoenix" surrounded by black outline
WordEdition AS IMAGE ' the entire word "Edition", yellow W, red "dition" surrounded by black outline
PhoenixMask AS IMAGE ' the black phoenix mask
END TYPE
DIM Sprite AS SPRITE ' sprite images
DIM Fire(49) AS LONG ' fire frames
DIM PhoenixFire(109) AS LONG ' red phoenix outline flame frames
DIM ClearScreen AS LONG ' CLS replacement
DIM FireBox AS LONG ' bottom fire animation box
DIM WordPhoenix AS LONG ' the entire word "Phoenix" image
DIM WordEdition AS LONG ' the entire word "Edition" image
DIM Screech AS LONG ' the sound a Phoenix makes (I think)
DIM px AS SINGLE ' letter P location before move
DIM py AS SINGLE
DIM ex AS SINGLE ' letter E location before move
DIM ey AS SINGLE
DIM pxvec AS SINGLE ' letter P vector to final location
DIM pyvec AS SINGLE
DIM exvec AS SINGLE ' letter E vector to final location
DIM eyvec AS SINGLE
DIM Alpha AS INTEGER ' alpha counter
DIM Skip AS INTEGER ' frame skip counter
DIM Frame AS INTEGER ' outline flame frame counter
DIM Size AS INTEGER ' size counter
'+-----------+
'| Main code |
'+-----------+
GetAssets ' set up images and sound
SCREEN _NEWIMAGE(300, 300, 32) ' set up screen
'+------------------------------+
'| Zoom flaming outline forward |
'+------------------------------+
Size = 0
Frame = 0
Skip = 0
DO
_LIMIT 120 ' 120 frames per second
Skip = Skip + 1 ' keep flames at 30 FPS
IF Skip = 4 THEN ' time for next flame frame?
Skip = 0 ' yes, reset 30FPS counter
Frame = Frame + 1 ' increment animation counter
IF Frame = 110 THEN Frame = 0 ' reset animation counter when needed
END IF
_PUTIMAGE (0, 0), ClearScreen ' clear screen
_PUTIMAGE (149 - Size, 149 - Size)-(149 + Size, 149 + Size), PhoenixFire(Frame) ' display flaming outline
_PUTIMAGE (149 - Size, 149 - Size)-(149 + Size, 149 + Size), Sprite.PhoenixMask.Image ' display phoenix mask
_DISPLAY ' update screen
Size = Size + 1 ' increase size of images
LOOP UNTIL Size = 150 ' leave when image full size
'+---------------------+
'| Fade in red phoenix |
'+---------------------+
px = 42 ' word "Phoenix" location
py = 202
ex = 57 ' word "Edition" location
ey = 247
Alpha = 0
_SNDPLAY Screech
DO
_LIMIT 30
Frame = Frame + 1
IF Frame = 110 THEN Frame = 0
_SETALPHA Alpha, _RGBA32(255, 0, 0, 0) TO _RGBA(255, 0, 0, 255), Sprite.RedPhoenix.Image ' fade phoenix red
Alpha = Alpha + 4 ' increase fade
_PUTIMAGE (0, 0), ClearScreen ' clear screen
_PUTIMAGE (0, 0), PhoenixFire(Frame) ' display flaming outline
_PUTIMAGE (Sprite.RedPhoenix.x, Sprite.RedPhoenix.y), Sprite.RedPhoenix.Image ' display red phoenix
_PUTIMAGE (Sprite.QB64.x, Sprite.QB64.y), Sprite.QB64.Image ' display QB64
UpdateWords ' update flames in letters of words
_PUTIMAGE (px, py), WordPhoenix ' display "Phoenix"
_PUTIMAGE (ex, ey), WordEdition ' display "Edition"
_DISPLAY ' update screen
LOOP UNTIL Alpha = 256
pxvec = (108 - px) / 30 ' calculate vectors of letter P to new location
pyvec = (162 - py) / 30 ' (30 steps)
exvec = (154 - ex) / 30 ' calculate vectors of letter E to new location
eyvec = (162 - ey) / 30 ' (30 steps)
'+----------------------------+
'| Move PE to banner location |
'+----------------------------+
Alpha = 255
DO
_LIMIT 30
Frame = Frame + 1
IF Frame = 110 THEN Frame = 0
_PUTIMAGE (0, 0), ClearScreen ' clear screen
_SETALPHA Alpha, _RGB32(0, 0, 0, 0) TO _RGB32(255, 255, 255, 255), PhoenixFire(Frame) ' fade out flaming outline
_PUTIMAGE (0, 0), PhoenixFire(Frame) ' display flaming outline
_PUTIMAGE (Sprite.RedPhoenix.x, Sprite.RedPhoenix.y), Sprite.RedPhoenix.Image ' display red phoenix
_PUTIMAGE (Sprite.QB64.x, Sprite.QB64.y), Sprite.QB64.Image ' display QB64
_PUTIMAGE (px, py), Sprite.LetterP.Image ' display letter P
px = px + pxvec ' update letter P position
py = py + pyvec
_PUTIMAGE (ex, ey), Sprite.LetterE.Image ' display letter E
ex = ex + exvec ' update letter E position
ey = ey + eyvec
Alpha = Alpha - 5 ' increase fade
_DISPLAY ' update screen
LOOP UNTIL INT(px) > 107 ' leave when letter P in place
'+--------------------+
'| Display final logo |
'+--------------------+
_PUTIMAGE (0, 0), ClearScreen
_PUTIMAGE (Sprite.RedPhoenix.x, Sprite.RedPhoenix.y), Sprite.RedPhoenix.Image
_PUTIMAGE (Sprite.QB64.x, Sprite.QB64.y), Sprite.QB64.Image
_PUTIMAGE (Sprite.PE.x, Sprite.PE.y), Sprite.PE.Image
_DISPLAY
SLEEP 1
FOR Frame = 0 TO 109 ' free assets from RAM
_FREEIMAGE PhoenixFire(Frame)
IF Frame < 50 THEN _FREEIMAGE Fire(Frame)
NEXT Frame
_FREEIMAGE FireBox
_FREEIMAGE ClearScreen
_FREEIMAGE WordPhoenix
_FREEIMAGE WordEdition
_FREEIMAGE Sprite.RedPhoenix.Image
_FREEIMAGE Sprite.QB64.Image
_FREEIMAGE Sprite.PE.Image
_FREEIMAGE Sprite.LetterQ.Image
_FREEIMAGE Sprite.LetterB.Image
_FREEIMAGE Sprite.Number6.Image
_FREEIMAGE Sprite.Number4.Image
_FREEIMAGE Sprite.LetterP.Image
_FREEIMAGE Sprite.LetterE.Image
_FREEIMAGE Sprite.WordPhoenix.Image
_FREEIMAGE Sprite.WordEdition.Image
_FREEIMAGE Sprite.PhoenixMask.Image
_SNDCLOSE Screech
SYSTEM ' return to OS
' ______________________________________________________________________________________________________
'/ \
SUB UpdateWords () ' UpdateWords |
' __________________________________________________________________________________________________|____
'/ \
'| Updates the fire animation inside "hoenix" and "dition". |
'\_______________________________________________________________________________________________________/
SHARED Sprite AS SPRITE
SHARED WordPhoenix AS LONG
SHARED WordEdition AS LONG
SHARED FireBox AS LONG
UpdateFireBox -1 ' next flame animation
_CLEARCOLOR _RGB32(255, 0, 0), Sprite.WordPhoenix.Image ' make red transparent
_PUTIMAGE (0, 0), FireBox, WordPhoenix, (0, 258)-(214, 299) ' put fire on image
_PUTIMAGE (0, 0), Sprite.WordPhoenix.Image, WordPhoenix ' overlay word onto image
_CLEARCOLOR _RGB32(255, 255, 255), WordPhoenix ' make white transparent
_CLEARCOLOR _RGB32(255, 0, 0), Sprite.WordEdition.Image ' make red transparent
_PUTIMAGE (0, 0), FireBox, WordEdition, (114, 258)-(299, 299) ' put fire on image
_PUTIMAGE (0, 0), Sprite.WordEdition.Image, WordEdition ' overlay word onto image
_CLEARCOLOR _RGB32(255, 255, 255), WordEdition ' make white transparent
END SUB
' ______________________________________________________________________________________________________
'/ \
SUB UpdateFireBox (Action AS INTEGER) ' UpdateFireBox |
' __________________________________________________________________________________________________|____
'/ \
'| Updates the firebox image with the next fire animation frame |
'| |
'| Action: 0 same frame, non 0 next frame |
'\_______________________________________________________________________________________________________/
SHARED FireBox AS LONG
SHARED Fire() AS LONG
SHARED ClearScreen AS LONG
STATIC c AS INTEGER
IF Action THEN ' move to next frame?
c = c + 1 ' yes, increment frame counter
IF c = 50 THEN c = 0 ' reset counter when needed
END IF
_PUTIMAGE (0, 0), ClearScreen, FireBox ' clear firebox image
_PUTIMAGE (0, 0), Fire(c), FireBox ' display next frame in animation
END SUB
' ______________________________________________________________________________________________________
'/ \
SUB GetAssets () ' GetAssets |
' __________________________________________________________________________________________________|____
'/ \
'| Get images and sounds from asset files |
'\_______________________________________________________________________________________________________/
SHARED Fire() AS LONG ' fire frames
SHARED PhoenixFire() AS LONG ' red phoenix outline flame frames
SHARED Sprite AS SPRITE ' need access to sprite images
SHARED ClearScreen AS LONG ' blank screen (alternate CLS)
SHARED FireBox AS LONG ' image to hold bottom flame animation
SHARED WordPhoenix AS LONG ' "Phoenix" word image holder
SHARED WordEdition AS LONG ' "Edition" word image holder
SHARED Screech AS LONG ' phoenix mating call?
DIM SmallSheet AS LONG ' small sprite sheet
DIM LargeSheet AS LONG ' large sprite sheet
DIM x AS INTEGER ' row counter
DIM y AS INTEGER ' column counter
DIM c AS INTEGER ' image counter
ClearScreen = _NEWIMAGE(300, 300, 32) ' create CLS alternative
_DEST ClearScreen
CLS , BACKGROUND
_DEST 0
FireBox = _NEWIMAGE(300, 300, 32) ' create image holders
WordPhoenix = _NEWIMAGE(215, 42, 32)
WordEdition = _NEWIMAGE(186, 42, 32)
Screech = _SNDOPEN("LogoPhoenix.ogg") ' load phoenix mating call
'+------------------+
'| Load image files |
'+------------------+
Sprite.PhoenixMask.Image = _LOADIMAGE("LogoPhoenixMaskTransparent.png", 32) ' load phoenix black mask
SmallSheet = _LOADIMAGE("LogoSmallSheetTransparent.png", 32) ' load small sprite sheet
LargeSheet = _LOADIMAGE("LogoLargeSheetTransparent.png", 32) ' load large sprite sheet
'+---------------------------------------------------------------------------------------------------+
'| Set location of images on screen, create image containers, extract images from small sprite sheet.|
'+---------------------------------------------------------------------------------------------------+
'+---------------------------------------------------+
'| Red phoenix silhoutte surrounded by black outline |
'+---------------------------------------------------+
Sprite.RedPhoenix.x = 59: Sprite.RedPhoenix.y = 8
Sprite.RedPhoenix.Image = _NEWIMAGE(183, 290, 32)
_PUTIMAGE , SmallSheet, Sprite.RedPhoenix.Image, (0, 0)-(182, 289)
'+------------------------------------------------------------------------+
'| Multicolored QB64 as one image each letter surrounded by black outline |
'+------------------------------------------------------------------------+
Sprite.QB64.x = 110: Sprite.QB64.y = 19
Sprite.QB64.Image = _NEWIMAGE(79, 86, 32)
_PUTIMAGE , SmallSheet, Sprite.QB64.Image, (0, 290)-(78, 375)
'+----------------------------------------------------------------+
'| Yellow PE as one image each letter surrounded by black outline |
'+----------------------------------------------------------------+
Sprite.PE.x = 108: Sprite.PE.y = 162
Sprite.PE.Image = _NEWIMAGE(84, 40, 32)
_PUTIMAGE , SmallSheet, Sprite.PE.Image, (79, 290)-(162, 329)
'+----------------------------------------------------+
'| Just the cyan letter Q surrounded by black outline |
'+----------------------------------------------------+
Sprite.LetterQ.x = 110: Sprite.LetterQ.y = 19
Sprite.LetterQ.Image = _NEWIMAGE(37, 44, 32)
_PUTIMAGE , SmallSheet, Sprite.LetterQ.Image, (0, 290)-(36, 333)
'+----------------------------------------------------+
'| Just the blue letter B surrounded by black outline |
'+----------------------------------------------------+
Sprite.LetterB.x = 154: Sprite.LetterB.y = 19
Sprite.LetterB.Image = _NEWIMAGE(34, 41, 32)
_PUTIMAGE , SmallSheet, Sprite.LetterB.Image, (44, 290)-(77, 330)
'+------------------------------------------------------------+
'| Just the light orange number 6 surrounded by black outline |
'+------------------------------------------------------------+
Sprite.Number6.x = 111: Sprite.Number6.y = 65
Sprite.Number6.Image = _NEWIMAGE(34, 40, 32)
_PUTIMAGE , SmallSheet, Sprite.Number6.Image, (1, 336)-(34, 375)
'+-----------------------------------------------------------+
'| Just the dark orange number 4 surrounded by black outline |
'+-----------------------------------------------------------+
Sprite.Number4.x = 152: Sprite.Number4.y = 65
Sprite.Number4.Image = _NEWIMAGE(37, 40, 32)
_PUTIMAGE , SmallSheet, Sprite.Number4.Image, (42, 336)-(78, 375)
'+------------------------------------------------------+
'| Just the yellow letter P surrounded by black outline |
'+------------------------------------------------------+
Sprite.LetterP.x = 108: Sprite.LetterP.y = 162
Sprite.LetterP.Image = _NEWIMAGE(40, 40, 32)
_PUTIMAGE , SmallSheet, Sprite.LetterP.Image, (79, 290)-(117, 329)
'+------------------------------------------------------+
'| Just the yellow letter E surrounded by black outline |
'+------------------------------------------------------+
Sprite.LetterE.x = 154: Sprite.LetterE.y = 162
Sprite.LetterE.Image = _NEWIMAGE(38, 40, 32)
_PUTIMAGE , SmallSheet, Sprite.LetterE.Image, (125, 290)-(162, 329)
'+-------------------------------------------------------------------------------+
'| The entire word "Phoenix", yellow P, red "hoenix" surrounded by black outline |
'+-------------------------------------------------------------------------------+
Sprite.WordPhoenix.x = 108: Sprite.WordPhoenix.y = 162
Sprite.WordPhoenix.Image = _NEWIMAGE(215, 42, 32)
_PUTIMAGE , SmallSheet, Sprite.WordPhoenix.Image, (0, 376)-(214, 417)
'+-------------------------------------------------------------------------------+
'| The entire word "Edition", yellow E, red "dition" surrounded by black outline |
'+-------------------------------------------------------------------------------+
Sprite.WordEdition.x = 154: Sprite.WordEdition.y = 162
Sprite.WordEdition.Image = _NEWIMAGE(186, 42, 32)
_PUTIMAGE , SmallSheet, Sprite.WordEdition.Image, (0, 418)-(185, 459)
_FREEIMAGE SmallSheet ' small sprite sheet no longer needed
'+----------------------------------------+
'| extract images from large sprite sheet |
'+----------------------------------------+
y = 0
c = -1
DO
x = 0
DO
'+--------------------------------------+
'| Extract phoenix flame outline images |
'+--------------------------------------+
c = c + 1
PhoenixFire(c) = _NEWIMAGE(300, 300, 32)
_PUTIMAGE , LargeSheet, PhoenixFire(c), (x * 300, y * 300)-(x * 300 + 299, y * 300 + 299)
'+-----------------------------+
'| Extract bottom flame images |
'+-----------------------------+
IF c < 50 THEN
Fire(c) = _NEWIMAGE(300, 300, 32)
_PUTIMAGE , LargeSheet, Fire(c), (x * 300, 3300 + y * 300)-(x * 300 + 299, y * 300 + 3599)
END IF
x = x + 1
LOOP UNTIL x = 10
y = y + 1
LOOP UNTIL y = 11
_FREEIMAGE LargeSheet ' large sprite sheet no longer needed
END SUB