PicoMiteVGA DEMO


Author Message
Volhout
Guru

Joined: 05/03/2018
Location: Netherlands
Posts: 5991
Posted: 08:20am 01 Jun 2026      

Version that runs on RP2040 VGA

Volhout - RP2040 work around for mode 3, color map, added framebuffer to avoid screen flicker, and lowered number of bubbles to better fit 320x240 mode 2 screen, smaller bubbles.

'SOAP BUBBLES original Javavi 2026

 if instr("2350",mm.device$) then
   MODE 3
   Dim c(15)=(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
   Colour Map c(),c()
 else
   mode 2
   dim c(15):For f%=1 To 15:Read c(f%):Next f%
 end if
 
 framebuffer create
 framebuffer write F

Type Bubble
 x As INTEGER
 y As INTEGER
 dx As INTEGER
 dy As INTEGER
 r As INTEGER
 c As INTEGER
 act As INTEGER
 pop As INTEGER
End Type
 
 Const maxBubbles = 5'20
 Dim b(maxBubbles) As Bubble
 
 For i=1 To maxBubbles
   InitBubble(i)
 Next
 
 Do
   For i=1 To maxBubbles
     Circle b(i).x, b(i).y, b(i).r,,,0,0
     If b(i).act=1 Then
       b(i).x=b(i).x+b(i).dx
       b(i).y=b(i).y+b(i).dy
       If b(i).x-b(i).r<0 Or b(i).x+b(i).r>MM.HRES Then
         b(i).dx=-b(i).dx
       EndIf
       If b(i).y-b(i).r<0 Or b(i).y+b(i).r>MM.VRES Then
         b(i).dy=-b(i).dy
       EndIf
       For j=i+1 To maxBubbles
         If b(j).act=1 Then
           dist!=Sqr((b(i).x-b(j).x)^2+(b(i).y-b(j).y)^2)
           minDist!=b(i).r+b(j).r
           If dist!<minDist! Then
             t=b(i).dx: b(i).dx=b(j).dx: b(j).dx=t
             t=b(i).dy: b(i).dy=b(j).dy: b(j).dy=t
             If Int(Rnd*10)=0 Then
               b(i).act=2
               b(i).pop=5
             EndIf
           EndIf
         EndIf
       Next j
       
       If Int(Rnd*1000)=0 Then
         b(i).act=2
         b(i).pop=5
       EndIf
       Circle b(i).x, b(i).y, b(i).r,2,,b(i).c
       t=310-b(i).x\16
       Arc b(i).x, b(i).y, b(i).r-8,,t,50+t,b(i).c
       
     ElseIf b(i).act=2 Then
       For p=1 To 8
         angle!=p*0.785
         px=b(i).x+(b(i).r+(5-b(i).pop)*3)*Cos(angle!)
         py=b(i).y+(b(i).r+(5-b(i).pop)*3)*Sin(angle!)
         Pixel px,py,b(i).c
       Next p
       b(i).pop=b(i).pop-1
       If b(i).pop <=0 Then
         t=b(i).r*10: Play Tone t,t,20
         Circle b(i).x, b(i).y, b(i).r+15,,,0,0
         InitBubble(i)
       EndIf
     EndIf
   Next i
   framebuffer copy F,N
 Loop While Inkey$=""
 
Sub InitBubble(i As INTEGER)
 b(i).r=Int(Rnd*40)+15
 b(i).x=Int(Rnd*(MM.HRES-2*b(i).r))+b(i).r
 b(i).y=Int(Rnd*(MM.VRES-2*b(i).r))+b(i).r
 b(i).dx=(Rnd*4)-2: If b(i).dx=0 Then b(i).dx=1
 b(i).dy=(Rnd*4)-2: If b(i).dy=0 Then b(i).dy=1
 b(i).c=c(Int(Rnd*14)+1)
 b(i).act=1
 b(i).pop=0
End Sub
 
 '--Colorscheme accordung to matherp
 Data RGB(BLUE),RGB(GREEN),RGB(CYAN),RGB(RED)
 Data RGB(MAGENTA),RGB(YELLOW),RGB(WHITE),RGB(MYRTLE)
 Data RGB(COBALT) ,RGB(MIDGREEN),RGB(CERULEAN),RGB(RUST)
 Data RGB(FUCHSIA),RGB(BROWN),RGB(LILAC)

Edited 2026-06-01 18:22 by Volhout