TGC Codebase Backup



2d Physics motion game by fubarpk

11th Apr 2018 6:58
Summary

Demonstrates the use of physics in a fun game without media



Description

Demonstrates the use of physics in a fun game without media



Code
                                    ` This code was downloaded from The Game Creators
                                    ` It is reproduced here with full permission
                                    ` http://www.thegamecreators.com
                                    
                                    rem Bubble Madness
#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
 
SetWindowTitle( "Bubble Madness" )
SetWindowSize( 1024, 768, 0 )
setVirtualResolution(1024,768)
SetOrientationAllowed( 0, 0, 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)
 
global dim balls[20] as ball
SetClearColor(0,0,0)
img=createEllipse()
setupballs(img)
text$=invertText("FUBARPK presents Bubble Madness"):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
myString$="Bubble Madness"
CreateText(1,myString$)
SetTextSize(1,50)
SetTextPosition(1,300,0)
myHigh$="High :"+str(high)
CreateText(2,myHigh$)
SetTextSize(2,40)
SetTextPosition(2,800,0)
myScore$="Score:"+str(score)
CreateText(3,myScore$)
SetTextSize(3,40)
SetTextPosition(3,800,40)
 
/*bg=500
createsprite(Bg,0)
setspritesize(Bg,800 ,600)
SetSpriteColor(Bg,0,0,0,65)
EnableClearColor(0)   
*/
//ResetTimer()
//time#=timer()
flag=1
intro(strlen)
deleteTextSprites(strlen)
getReady()
img2=createTriangle() 
setupBase(img2)
sync()
exitBtn=1
AddVirtualButton(exitBtn,40,30,60) //make a button
SetVirtualButtonText( exitBtn, "Exit" ) //set number to image 
SetVirtualButtonColor( exitBtn,200,200,200)  //random colour 
//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()
repeat
    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)
        SetTextString( 3,myScore$) 
        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>9
        bonus=gravity*100
        score=score+bonus: myScore$="Score:"+str(score)
        SetTextString(3 ,myScore$) 
        if score>high then high=score
        SetTextString( 3,myScore$) :bonus=0:counter=0:ResetTimer()
        myHigh$="High :"+str(high):SetTextString( 2,myHigh$)
        gameOver():setupballs(img):setupBase(img2)
        score=0:gravity=4:SetPhysicsGravity(0,gravity)
        getReady():myScore$="Score:0":SetTextString(3 ,myScore$)
        ResetTimer() 
    endif
    Sync()
until GetVirtualButtonPressed(exitBtn)=1
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 getReady()
    myString$="Get Ready"
    if GetTextExists(100) then DeleteText(100)
    CreateText(100,myString$)
    SetTextSize(100,50)
    SetTextColor(100,0,200,0,255)
    SetTextPosition(100,375,300)
endfunction
 
function gameOver()
    myString$="GameOver"
    if GetTextExists(100) then DeleteText(100)
    CreateText(100,myString$)
    SetTextSize(100,50)
    SetTextColor(100,200,0,0,255)
    SetTextPosition(100,375,300)
    Sleep(20)
    repeat 
        sync()
    until GetPointerPressed() = 1
    DeleteText(100)
endfunction
 
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)
exitBtn=1   
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