2d Physics motion game by fubarpk11th 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 |