How many people remember when demos were popular
showing off all the effects a programmer could produce and/or the programming language was capable of
Well ive been playing with AGK's physics and AGK's collisions and come up with this.
Let me know what you think
// Project: RetroDemo
// Created: 2017-02-26
#constant xMax=1024
#constant yMax=768
#constant Bg=1000
gravity=50
global ang#=0
counter=0
rem balls from 1 to 20
rem triangles from 21 to 30
rem text sprites from 100 to string length
rem rotators from 31 to 35
rem sprite 800 and 801 curtains
rem sprite 999 temporary the end sprite
rem sprites 1001 to 1100 the end wave sprites
// show all errors
SetErrorMode(2)
// set window properties
SetWindowTitle( "RetroDemo" )
SetWindowSize( 1024, 768, 0 )
// set display properties
SetVirtualResolution( 1024, 768 )
SetOrientationAllowed( 1, 1, 1, 1 )
SetSyncRate( 30, 0 ) // 30fps instead of 60 to save battery
UseNewDefaultFonts( 1 ) // since version 2.0.22 we can use nicer default fonts
type mySprite
id as integer :rem id of sprite
PointX as integer :rem makes it move
centreX as integer :rem centre of sine wave x axis
yPosition as integer:rem yPosition on y-axis
amplitude as integer:rem the heaight of the wave
speedX# as float :rem how fast sine travels on x-axis
WaveWidth as integer:rem how wide the sinewave is
frequency# as float :rem speed sprite should move up and down (0.0 to 6.0)
img as integer :rem holds the image number for the sprite
endtype
type ball
id as integer
x as float
y as float
endtype
//SetPhysicsDebugOn()
SetPhysicsScale( 0.1)
SetPhysicsGravity(0,gravity)
SetPhysicsWallTop(0)
SetPhysicsWallBottom(0)
CreateSprite(800,createCurtain(1))
//SetSpriteSize(200,10,yMax)
SetSpriteOffset(800,xMax,0)
SetSpriteTransparency(800,0)
SetSpriteDepth(800,0)
SetSpritePositionByOffset(800,0,0)
CreateSprite(801,createCurtain(2))
//SetSpriteSize(201,10,yMax)
SetSpriteOffset(801,0,0)
SetSpriteTransparency(801,0)
SetSpriteDepth(801,0)
SetSpritePositionByOffset(801,xMax,0)
backgroundText("THE END")
//for the animated ending
drawsprite(999)
Render()
MakeWave()
deletesprite(999)
ClearScreen()
global dim balls[20] as ball
SetClearColor(0,0,0)
img=createEllipse()
setupballs(img)
text$=invertText("FUBARPK presents a Mega Ball Demo"):strlen=len(text$)
dim spr[strlen] as mySprite
for num=1 to strlen
spr[num].id=num+100:spr[num].img=num
spr[num].centreX=xMax/2
spr[num].yPosition=yMax/2
spr[num].amplitude=20
spr[num].speedX#=.51
spr[num].WaveWidth=xMax
spr[num].frequency#=1.4
spr[num].PointX=90-(num*3)
createTextImage(Mid(text$,num,1),spr[num].img)
createSprite(spr[num].id,spr[num].img)
SetSpriteColor(spr[num].id, Random(1,255),Random(1,255), Random(1,255), 255 )
SetSpriteTransparency(spr[num].id,1)
SetSpritePhysicsOn(spr[num].id,1)
next num
placeRotators()
high=0:score=0
flag=1
intro(strlen)
deleteTextSprites(strlen)
img2=createTriangle()
setupBase(img2)
sync()
//left side boundary
createSprite(36,0)
SetSpriteSize(36,10,yMax)
SetSpriteColor(36,255,255,255,255)
SetSpriteDepth ( 36, 0 )
SetSpritePositionByOffset(36,5,yMax/2)
SetSpritePhysicsOn(36,1)
SetSpriteGroup(36,3)
//right side boundary
createSprite(37,0)
SetSpriteSize(37,10,yMax)
SetSpriteColor(37,255,255,255,255)
SetSpriteDepth ( 37, 0 )
SetSpritePositionByOffset(37,xMax-5,yMax/2)
SetSpritePhysicsOn(37,1)
SetSpriteGroup(37,3)
if GetSpriteExists(Bg) then DeleteSprite(Bg)
createsprite(Bg,0)
setspritesize(Bg,xMax ,yMax)
SetSpriteColor(Bg,0,0,0,5)
EnableClearColor(0) ///Adds blur effect
render()
ClearScreen()
gravity=4
SetPhysicsGravity(0,gravity)
ResetTimer()
time#=timer()
do
DrawSprite (Bg)
for num=1 to 20
if GetSpriteYByOffset(balls[num].id) > yMax
balls[num].y =-150
balls[num].x=random(100,xMax)
SetSpriteColor( balls[num].id, Random(1,255),Random(1,255), Random(1,255), 255 )
SetSpriteVisible(balls[num].id,1)
SetSpritePositionByOffset(balls[num].id,balls[num].x,balls[num].y)
endif
for num2check=21 to 30
if GetSpriteExists(num2check)
if GetSpriteCollision(balls[num].id,num2check)
hit(balls[num].id,100,img)
hit(num2Check,200,img2)
inc counter
endif
endif
next num2check
next num
ang#=ang#+.5
SetSpriteAngle( 31, ang# ) :rem centre rotator
SetSpriteAngle( 32, -ang# ):rem top left
SetSpriteAngle( 33, -ang# ):rem top right
SetSpriteAngle( 34, -ang# ):rem bottom Left
SetSpriteAngle( 35, -ang# ):rem bottom right
if ( GetPointerPressed ( ) = 1 )
hit = GetSpriteHitGroup( 1,ScreenToWorldX(GetPointerX()), ScreenToWorldY(GetPointerY()) )
endif
if hit<>0
//SetSpriteVisible(hit,0):
//Print( hit)
hit(hit,100,img)
score=score+(10*(11-counter)): myScore$="Score:"+str(score)
Hit=0
endif
if Timer()-time#>2
ResetTimer()
if GetTextExists(100) then DeleteText(100)
if gravity<50
inc gravity
SetPhysicsGravity(0,gravity)
endif
endif
if counter>5
//DeleteAllSprites()
theEnd()
endif
Sync()
loop
end
function createEllipse()
Render()
DrawEllipse(50,50,25,25,MakeColor(255,255,255),MakeColor(100,100,100),1)
Swap()
img = getimage(0,0,100,100)
sync()
endfunction img
function createTriangle()
createSprite(600,0)
SetSpriteSize(600,120,120)
SetSpriteColor(600,0,0,0,255)
DrawSprite(600)
ClearScreen()
Render()
x=50:xx=50 //draw filled triangle
for y = 0 to 50
DrawLine(x,y,xx,y,255,255,255)
dec x:inc xx
next y
Swap()
Render()
img = getimage(0,0,100,60)
SetImageTransparentColor( img,0,0,0 )
sync()
DeleteSprite(600)
endfunction img
function createTextImage (myString as string,imgNum as integer)
CreateSprite(bg,0)
SetSpriteSize(bg,150,150)
SetSpriteColor(bg,0,0,0,255)
clearscreen()
CreateText(100,myString)
SetTextSize(100,50)
SetTextPosition(100,0,0)
//drawSprite(100)
//if myString <>
Render():If GetImageExists(imgNum) then DeleteImage(imgNum)
GetImage(imgNum,0,0,50,50):ClearScreen()
SetImageTransparentColor( imgNum,0,0,0 )
DrawSprite(bg)
ClearScreen()
DeleteText(100):deleteSprite(bg)
endfunction
function invertText(myString as string)
resultString as string
for num =len(myString) to 1 step -1
resultString=resultString+Mid(myString,num,1)
next num
endfunction resultString
function setupBase(img as integer)
multiplier=0
for num =21 to 30
if GetSpriteExists(num) then DeleteSprite(num)
CreateSprite(num,img)
//SetSpriteSize(num,75,75)
SetSpriteColor(num,255,255,255,255)
SetSpriteTransparency(num,1)
SetSpriteShape( num,3 )
SetSpritePositionByOffset(num,(multiplier*100)+60,747)
SetSpritePhysicsOn(num,1)
SetSpriteGroup(num,2)
inc multiplier
next num
endfunction
function hit(hit as integer,multiplier as integer, img as integer)
DeleteParticles(hit+multiplier)
CreateParticles(hit+multiplier,100,100)
SetParticlesImage(hit+multiplier,img)
SetParticlesSize(hit+multiplier,16)
SetParticlesFrequency(hit+multiplier,25)
SetParticlesLife(hit+multiplier,2.5)
SetParticlesVelocityRange(hit+multiplier,1,10)
SetParticlesMax(hit+multiplier,25)
SetParticlesPosition(hit+multiplier,GetSpriteXByOffset(hit),GetSpriteYByOffset(hit))
AddParticlesColorKeyFrame(hit+multiplier,0,GetSpriteColorRed(hit),GetSpriteColorGreen(hit),GetSpriteColorBlue(hit),255)
if multiplier = 100
AddParticlesScaleKeyFrame( hit+multiplier,0,2 )
balls[hit].y =-150
balls[hit].x=random(100,GetDeviceWidth()-100)
SetSpriteColor( hit, Random(1,255),Random(1,255), Random(1,255), 255 )
SetSpriteVisible(hit,1)
SetSpritePositionByOffset(hit,balls[hit].x,balls[hit].y)
else
AddParticlesScaleKeyFrame( hit+multiplier,0,1 )
SetSpriteVisible(hit,0)
SetSpriteActive(hit,0)
DeleteSprite(hit)
endif
endfunction
function setupballs (img as integer)
for num =1 to 20
balls[num].id=num
if GetSpriteExists(num) then DeleteSprite(num)
CreateSprite(num,img)
SetSpriteColor(num, Random(1,255),Random(1,255), Random(1,255), 255 )
SetSpritePositionByOffset(num,random(100,xMax-100),-random(100,yMax/3))
SetSpriteShapeCircle(num,0,0,25)
SetSpritePhysicsOn(num,2)
SetSpritePhysicsRestitution(num,.1 )
SetSpriteGroup(num,1)
next num
endfunction
function intro(strlen as integer)
resetTimer()
delay#=Timer()
repeat
//if delay# > .05
for num = 1 to strlen
xWave=Sin(spr[num].PointX)*(spr[num].wavewidth/2)+spr[num].centreX
yWave=sin(xWave*spr[num].frequency#)*(spr[num].amplitude)+spr[num].yposition
SetSpritePosition(spr[num].id,xWave,yWave)
if spr[num].PointX >-90
spr[num].PointX = spr[num].PointX - spr[num].speedX#
if spr[num].amplitude<250 and flag=1
spr[num].amplitude=spr[num].amplitude+2
if spr[num].amplitude>=250 then flag=0
endif
if spr[num].amplitude >0 and flag=0
spr[num].amplitude=spr[num].amplitude-2
if spr[num].amplitude<=20 then flag=1
endif
else
spr[num].PointX = 90
endif
ang#=ang#+.05
SetSpriteAngle( 31, ang# ) :rem centre rotator
SetSpriteAngle( 32, -ang# ):rem top left
SetSpriteAngle( 33, -ang# ):rem top right
SetSpriteAngle( 34, -ang# ):rem bottom Left
SetSpriteAngle( 35, -ang# ):rem bottom right
next num
sync()
until Timer()-delay#>8
endfunction
function deleteTextSprites(strlen as integer)
for num = 1 to strlen
deleteSprite(num+100)
next num
endfunction
function placeRotators()
//rotating shape 1 (centre)
createSprite(31,0)
SetSpriteSize(31,250,10)
SetSpriteColor(31,255,255,255,255)
SetSpritePositionByOffset(31,xMax/2,yMax/2)
SetSpritePhysicsOn(31,1)
SetSpriteGroup(31,3)
//rotating shape 2 (top left)
createSprite(32,0)
SetSpriteSize(32,100,10)
SetSpriteColor(32,255,255,255,255)
SetSpritePositionByOffset(32,xMax/4,yMax/4)
SetSpritePhysicsOn(32,1)
SetSpriteGroup(32,3)
//rotating shape (top right)
createSprite(33,0)
SetSpriteSize(33,100,10)
SetSpriteColor(33,255,255,255,255)
SetSpritePositionByOffset(33,(xMax/4)*3,yMax/4)
SetSpritePhysicsOn(33,1)
SetSpriteGroup(33,3)
//rotating shape (bottom left)
createSprite(34,0)
SetSpriteSize(34,100,10)
SetSpriteColor(34,255,255,255,255)
SetSpritePositionByOffset(34,xMax/4,(yMax/4)*3)
SetSpritePhysicsOn(34,1)
SetSpriteGroup(34,3)
//rotating shape (top right)
createSprite(35,0)
SetSpriteSize(35,100,10)
SetSpriteColor(35,255,255,255,255)
SetSpritePositionByOffset(35,(xMax/4)*3,(yMax/4)*3)
SetSpritePhysicsOn(35,1)
SetSpriteGroup(35,3)
endfunction
function createCurtain(direction as integer)
ClearScreen()
Render()
if direction = 1 :rem left curtain
DrawBox( 0,0,xMax-6,yMax, MakeColor(0,0,0),MakeColor(0,0,0), MakeColor(0,0,0),MakeColor(0,0,0),1 )
DrawBox( xMax-5,0,xMax,yMax, MakeColor(255,255,255),MakeColor(255,255,255), MakeColor(255,255,255),MakeColor(255,255,255),1 )
endif
if direction = 2 :rem Right curtain
DrawBox( 0,0,5,yMax, MakeColor(255,255,255),MakeColor(255,255,255), MakeColor(255,255,255),MakeColor(255,255,255),1 )
DrawBox( 6,0,xMax,yMax, MakeColor(0,0,0),MakeColor(0,0,0), MakeColor(0,0,0),MakeColor(0,0,0),1 )
endif
Swap()
img = getimage(0,0,xMax,yMax)
sync()
endfunction img
function backgroundText(myString as string)
DeleteText(999)
CreateText(999,myString)
SetTextSize(999,150)
SetTextPosition(999,xMax/2-230,yMax/2-100)
Render()
img=GetImage(xMax/2-230,yMax/2-100,(xMax/2-230)+500,(yMax/2-100)+100)
DeleteText(999)
DeleteSprite(999)
CreateSprite(999,img)
SetSpritePosition(999,xMax/2-230,yMax/2-100)
SetSpriteDepth(999,10)
ClearScreen()
//DrawSprite(1000)
endfunction
function theEnd()
x=0:xx=xMax
w# as float:w#=0
moveIn=1:flag=0
do
//DrawSprite (Bg)
SetSpritePositionByOffset(800,x,0)
SetSpritePositionByOffset(801,xx,0)
if GetSpriteCollision(800,801) = 0 and moveIn=1
inc x:dec xx
SetSpriteAngle( 31, ang# ) :rem centre rotator
SetSpriteAngle( 32, -ang# ):rem top left
SetSpriteAngle( 33, -ang# ):rem top right
SetSpriteAngle( 34, -ang# ):rem bottom Left
SetSpriteAngle( 35, -ang# ):rem bottom right
ang#=ang#+.5
else
moveIn=0
flag=1
endif
if flag=1
for num = 1 to 35
DeleteSprite(num)
next num
EnableClearColor(1)
for y=1 to 100
SetSpriteVisible(y+1000,1)
next
flag=3
endif
if moveIn=0 and x>0
dec x:inc xx
endif
if flag=3
DoWave(w#)
w#=w#+360.0/20.0
if w#>360.0 then w#=w#-360.0
if xx>=xMax then end
endif
Sync()
loop
FreeWave()
endFunction
function MakeWave()
for y=1 to 100
//Render()
GetImage(y+1000, (xMax-500)/2,((yMax-120)/2)+y,xMax, 1.0 )
createsprite(y+1000,y+1000)
setspritesize(y+1000,xMax,1.5)
setspriteposition(y+1000,(xMax-500)/2,y+(yMax/2))
setspritedepth(y+1000,10)
SetSpriteVisible(y+1000,0)
next
sync()
endfunction
function DoWave(w#)
for y=1 to 100
//r=random(1,255):g=random(1,255):b=random(1,255)
setspriteposition(y+1000,cos(w#)+((xMax-500)/2),(y+((yMax-100)/2))+sin(w#)*1.0)
//SetSpriteColor(y+1000,r,g,b,255)
w#=w#+360.0/60.0
next
endfunction
function FreeWave()
for y=1 to 100
deletesprite(y+1000)
deleteimage(y+1000)
next
endfunction
Its not all that retro as allot of the past ones used text and allot of sine waves etc to produce there effect
fubar