Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - dbox

Pages: [1] 2 3 ... 6
1
Programs / Re: QBJS - Import code from external .bas files
« on: April 15, 2022, 07:31:34 pm »
@CharlieJV, thanks for the feedback.  Security is always a good thing to keep in mind.  This feature is modeled to some degree after the standard way JavaScript allows supporting libraries to be included ( https://www.w3schools.com/tags/att_script_src.asp).  Like JS these libraries can be loaded from a relative path or from an external location. Even though the modern browser is sandboxed to a large degree to prevent malicious activity discretion is always required of the developer.

In addition, I’m also working on an Export feature for this release which will allow you to export the compiled JavaScript and supporting html files as a zip.  The compiled version will incorporate content from any included libraries. This can then be run standalone or is ready to be uploaded to a sharing site like itch.io. This is also available on the qbjs-dev site, where the most current dev build is deployed.

2
Programs / QBJS - Import code from external .bas files
« on: April 15, 2022, 04:43:54 pm »
Hi All,

I wanted to share the latest feature I've been working on for QBJS to solicit some input from the community.  I've implemented the ability to include "modules" from external source files into your program.  This concept is similar to include from c/c++ and import from javascript.  The idea here is to make it easy to create reusable libraries that can be shared between projects.  Here's an example:

Code: QB64: [Select]
  1. Import MyLib From "https://raw.githubusercontent.com/boxgaming/qbjs/main/samples/include/test.bas"
  2. Import Maths From "https://raw.githubusercontent.com/boxgaming/qbjs/main/samples/include/maths.bas"
  3.  
  4. MyLib.DoStuff          ' Call exported sub
  5. Print MyLib.GetThings  ' Call exported function
  6.  
  7. Print Maths.Factorial(10)
  8. Print Maths.Plus1(11)
  9.  

Try it on QBJS-Dev

Any imports must be the first statements in your program.  In this example we've imported functionality from two different external source files.  Any methods exported from those libraries can be accessed in your program by prefixing them with the alias specified after the import statement.

Only the content specified for export will be available in the calling program.  This lets us have "private" shared variables and helper functions in our included modules.

Here's what the library files look like:

test.bas
Code: QB64: [Select]
  1. Export GetStuff As GetThings
  2. Export DoStuff
  3.  
  4. Dim foo
  5. foo = "somthing"
  6.  
  7. Function GetStuff
  8.     GetStuff = "got the stuff"
  9.  
  10. Sub DoStuff
  11.     Print "do the stuff"
  12.  

maths.bas
Code: QB64: [Select]
  1. Export increment As Plus1
  2. Export factorial AS Factorial
  3.  
  4. Function increment (num)
  5.     increment = num + 1
  6.  
  7. Function factorial (num)
  8.     Dim res
  9.     $If Javascript Then
  10.         if (num === 0 || num === 1) {
  11.             num = 1;
  12.         }
  13.         else {
  14.             for (var i = num - 1; i >= 1; i--) {
  15.                 num *= i;
  16.             }
  17.        }
  18.     $End If
  19.     factorial = num
  20.  

Export statements must appear at the top of your module code.  If you want to have a different name for the exported method from it's internal name you can use the "As Alias" syntax as shown above.

Import Entire Programs
Another benefit of this feature is that you can import entire programs from an external source file to make it easier to share large programs. Here are a couple of examples:

QBJS Paint
Code: QB64: [Select]
  1. Import QBJSPaint From "https://raw.githubusercontent.com/boxgaming/qbjs/main/samples/apps/paint.bas"
  2.  
Try it on QBJS-Dev


Terry Ritchie's Excellent Flappy Bird Clone
Ported from QB64
Code: QB64: [Select]
  1. Import FlappyBird From "https://raw.githubusercontent.com/boxgaming/qbjs/main/samples/games/trfbird.bas"
  2.  
Try it on QBJS-Dev

I'd be very interested to hear your thoughts.

3
Programs / Re: Finger Painting in QBJS
« on: April 10, 2022, 10:05:56 pm »
Thanks @johnno56!

4
Programs / Finger Painting in QBJS
« on: April 09, 2022, 06:18:56 pm »
Hi All,

One of the features I'm working on for the next QBJS is support for touch events and more dynamic scaling/sizing when viewing QBJS programs on mobile.  I'd be very curious to hear your experience with the following example.  I've adapted a drawing program I shared earlier.  With this version you should be able to draw now with your finger on your mobile (or otherwise touch-enabled) device.

Click here to try it out!

I'd be very curious to know your experience and what kind of device you tried it on.  Were you able to draw with the various tools and change colors?  Did the scaling look appropriate for your device?

If you want to see the code you can click here.   (This is still in development so some of the syntax may change slightly.)

5
Programs / Re: QBJS - QBasic for the Web
« on: April 06, 2022, 09:51:30 am »
Recent fun discovery with QBJS... you can use data URLs to embed the content of images, sounds and other assets into the program itself.  Think of it as a web-native BIN-to-BAS.  Here's an example showing both loading an image from an external URL and from a data URL:

Code: QB64: [Select]
  1. Screen _NewImage(800, 600)
  2. Dim screenshot
  3. screenshot = _LoadImage("https://wiki.qb64.org/wiki/images/8/87/IDE_Mainscreen.png")
  4. _PutImage (1, 1), screenshot
  5.  
  6. Dim logo
  7. logo = _LoadImage("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAACWCAYAAAA8AXHiAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGRDdGMTE3NDA3MjA2ODExODA4MzkyRDgxRTZDNzNERiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo3N0Y2QjRFNjUxQjgxMUU5QkRCQUEwQjNGQjY2MzA5MyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo3N0Y2QjRFNTUxQjgxMUU5QkRCQUEwQjNGQjY2MzA5MyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDc4MDExNzQwNzIwNjgxMTgwODM4RkI5NjAyMDgwMDciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RkQ3RjExNzQwNzIwNjgxMTgwODM5MkQ4MUU2QzczREYiLz4gPC9yZGY6RGVzY3Jp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")
  8. _PutImage (300, 150), logo

View in QBJS

6
Programs / Re: QBJS - QBasic for the Web
« on: April 03, 2022, 04:21:34 pm »
By the way @bplus, the lastest version has that Cls fix, so your original game code is working as intended now:

View in QBJS
Play Game

Hey @bplus, your falling circle game is even more epic with sound:  Play Game

Code: QB64: [Select]
  1. Dim buzz, music, lose
  2. music = _SndOpen("https://opengameart.org/sites/default/files/newbattle.wav")
  3. buzz = _SndOpen("https://opengameart.org/sites/default/files/buzz_0.ogg")
  4. lose = _SndOpen("https://opengameart.org/sites/default/files/lose%20music%201%20-%201_0.wav")
  5. _SndLoop music
  6. Dim As Long HX, HY, i, hits, score, Stars, nEnemies, Height
  7. HX = 320: HY = 400: nStars = 1000: nEnemies = 50: Height = 480
  8. Dim EX(nEnemies), EY(nEnemies), EC(nEnemies) As _Unsigned Long ' enemy stuff
  9. Screen _NewImage(640, Height, 32)
  10. Stars = _NewImage(640, Height, 32)
  11. For i = 1 To nStars
  12.     PSet (Int(Rnd * 640), Int(Rnd * 480)), _RGB32(55 + Rnd * 200, 55 + Rnd * 200, 55 + Rnd * 200)
  13. _PutImage , 0, Stars
  14. For i = 1 To nEnemies
  15.     EX(i) = Int(Rnd * 600 + 20): EY(i) = -2 * Height * Rnd + Height: EC(i) = _RGB32(55 + Rnd * 200, 55 + Rnd * 200, 55 + Rnd * 200)
  16.     Cls
  17.     _PutImage , Stars, 0
  18.     Print "Hits:"; hits, "Score:"; score
  19.     Line (HX - 10, HY - 10)-Step(20, 20), _RGB32(255, 255, 0), BF
  20.     For i = 1 To nEnemies ' the enemies
  21.         Circle (EX(i), EY(i)), 10, EC(i)
  22.         If Sqr((EX(i) - HX) ^ 2 + (EY(i) - HY) ^ 2) < 20 Then 'collision
  23.             _SndPause music
  24.             _SndPlay buzz
  25.             _Delay .5
  26.             hits = hits + 1
  27.             EX(i) = Int(Rnd * 600 + 20): EY(i) = -Height * Rnd ' move that bad boy!
  28.             If hits = 10 Then
  29.                 Print "Too many hits, goodbye!"
  30.                 _SndPlay lose
  31.                 FadeOut
  32.                 End
  33.             End If
  34.             _SndLoop music
  35.         End If
  36.         EY(i) = EY(i) + Int(Rnd * 5)
  37.         If EY(i) > 470 Then EX(i) = Int(Rnd * 600 + 20): EY(i) = -Height * Rnd: score = score + 1
  38.     Next
  39.     If _KeyDown(20480) Then HY = HY + 3
  40.     If _KeyDown(18432) Then HY = HY - 3
  41.     If _KeyDown(19200) Then HX = HX - 3
  42.     If _KeyDown(19712) Then HX = HX + 3
  43.     If HX < 10 Then HX = 10
  44.     If HX > 630 Then HX = 630
  45.     If HY < 10 Then HY = 10
  46.     If HY > 470 Then HY = 470
  47.     _Display
  48.     _Limit 100
  49. _SndStop music
  50.                            
  51. Sub FadeOut
  52.     _Delay 2
  53.     Dim i
  54.     For i = 1 to 100
  55.         Line (0, 0)-(_Width, _Height), _RGBA(1, 1, 1, 5), BF
  56.         _Limit 30
  57.     Next i
  58.     Locate 16, 35
  59.     Print "Game Over"
  60.  

7
Programs / Re: Easter Egg Decorating
« on: April 01, 2022, 11:37:24 pm »
Yeah here are some cherry picked Textured Eggs:

B+ Textured Egg Slideshow

8
Programs / Re: Easter Egg Decorating
« on: April 01, 2022, 01:05:51 pm »
DBox, I ran it  on QB64, I don't have QBJS.

Oh, I see.  Yes, I'm afraid that example won't run in QB64 since it uses web controls.  QBJS is just a web page, you don't actually have to have anything installed you can view and run the code by just Clicking this link

9
Programs / Re: Easter Egg Decorating
« on: April 01, 2022, 12:40:14 pm »
That's neat Steve but there's no egg anywhere on the screen. The Matrix letters just fall everywhere.

Vince that's really cool! I started to attempt something like that yesterday but I think I had a problem with the square root of a negative number and I just wasn't figuring out the math good enough.
DBox, I get an Illegal String Conversion error on Line 42.
Code: QB64: [Select]
  1.  Dim c: c = DomCreate("div")
  2.  


Hey @SierraKen, is there more to that program?  I don't see any errors when I run just that line in a new QBJS window.

10
Programs / Re: Easter Egg Decorating
« on: April 01, 2022, 12:38:01 pm »
They haven't gotten to decorating yet and STx is already voting!

Who cares about colors it's all about the math! LOL

Updated with maths AND colors: View in QBJS

11
Programs / Re: Easter Egg Decorating
« on: April 01, 2022, 09:30:10 am »
When in Rome...

Here is a QBJS mod based on @vince's creation - Egg Designer 2000.

View on QBJS

Code: QB64: [Select]
  1. _Title "Egg Designer 2000"
  2. Dim Shared s, L, B, w, D, sw, sh, xx, x, a, y, aa
  3. Dim Shared ctlS, ctlL, ctlB, ctlW, ctlD
  4.  
  5. sw = 800
  6. sh = 600
  7. Screen _NewImage(sw, sh, 32)
  8.  
  9. InitControls
  10. DrawEgg
  11.  
  12. Sub DrawEgg
  13.     Cls
  14.     s = ctlS.value
  15.     L = ctlL.value / 10
  16.     B = ctlB.value / 10
  17.     w = ctlW.value / 10
  18.     D = ctlD.value / 10
  19.    
  20.     For xx = -0.5 * L * s To 0.5 * L * s
  21.         x = xx / s
  22.         a = (L * L - 4 * x * x) / (L * L + 8 * w * x + 4 * w * w)
  23.         y = 0.5 * B * Sqr(a)
  24.         'you can stop here for p(x) = x
  25.  
  26.         a = Sqr(5.5 * L * L + 11 * L * w + 4 * w * w)
  27.         a = a * (Sqr(3) * B * L - 2 * D * Sqr(L * L + 2 * w * L + 4 * w * w))
  28.         a = a / (Sqr(3) * B * L * (Sqr(5.5 * L * L + 11 * L * w + 4 * w * w) - 2 * Sqr(L * L + 2 * w * L + 4 * w * w)))
  29.  
  30.         aa = L * (L * L + 8 * w * x + 4 * w * w)
  31.         aa = aa / (2 * (L - 2 * w) * x * x + (L * L + 8 * L * w - 4 * w * w) * x + 2 * L * w * w + L * L * w + L * L * L)
  32.         aa = 1 - aa
  33.  
  34.         y = y * (1 - a * aa)
  35.  
  36.         Line (sw / 2 + xx, sh / 2 - s * y)-(sw / 2 + xx, sh / 2 + s * y)
  37.     Next
  38.  
  39. Sub InitControls
  40.     Dim c: c = DomCreate("div")
  41.     c.style.padding = "20px"
  42.    
  43.     DomCreate "span", c, "s: "
  44.     Dim e: e = DomCreate("input", c)
  45.     e.type = "range"
  46.     e.style.width = "125px"
  47.     e.style.verticalAlign = "middle"
  48.     e.min = 1
  49.     e.max = 100
  50.     e.step = 1
  51.     e.value = 80
  52.     ctlS = e
  53.        
  54.     e = DomCreate("span", c, "L: ")
  55.     e.style.marginLeft = "20px"
  56.     e = DomCreate("input", c)
  57.     e.type = "range"
  58.     e.style.verticalAlign = "middle"
  59.     e.style.width = "125px"  
  60.     e.min = 1
  61.     e.max = 100
  62.     e.value = 54
  63.     ctlL = e
  64.  
  65.     e = DomCreate("span", c, "B: ")
  66.     e.style.marginLeft = "20px"
  67.     e = DomCreate("input", c)
  68.     e.type = "range"
  69.     e.style.verticalAlign = "middle"
  70.     e.style.width = "125px"  
  71.     e.min = 1
  72.     e.max = 100
  73.     e.value = 41
  74.     ctlB = e
  75.            
  76.     e = DomCreate("span", c, "w: ")
  77.     e.style.marginLeft = "20px"
  78.     e = DomCreate("input", c)
  79.     e.type = "range"
  80.     e.style.verticalAlign = "middle"
  81.     e.style.width = "125px"  
  82.     e.min = 1
  83.     e.max = 20
  84.     e.value = 4
  85.     ctlW = e
  86.  
  87.     e = DomCreate("span", c, "D: ")
  88.     e.style.marginLeft = "20px"
  89.     e = DomCreate("input", c)
  90.     e.type = "range"
  91.     e.style.verticalAlign = "middle"
  92.     e.style.width = "125px"  
  93.     e.min = 1
  94.     e.max = 100
  95.     e.value = 32
  96.     ctlD = e
  97.                        
  98.     DomEvent ctlS, "input", sub_DrawEgg
  99.     DomEvent ctlL, "input", sub_DrawEgg
  100.     DomEvent ctlB, "input", sub_DrawEgg
  101.     DomEvent ctlW, "input", sub_DrawEgg
  102.     DomEvent ctlD, "input", sub_DrawEgg
  103.  

12
Programs / Re: QBJS - QBasic for the Web
« on: March 31, 2022, 10:55:07 am »
By the way @bplus, the lastest version has that Cls fix, so your original game code is working as intended now:

View in QBJS
Play Game

13
Programs / Re: QBJS - QBasic for the Web
« on: March 31, 2022, 09:58:06 am »
@bplus - Just remove the mode=play parameter from the URL.

Here it is in default IDE mode:  Eggs o' Dozens

14
Programs / Re: QBJS - QBasic for the Web
« on: March 31, 2022, 09:06:52 am »
One other thing I forgot to mention about the latest release... there are two new options for sharing your program in QBJS: Play and Auto.

 
share-modes.png


Here are a couple of Easter egg related examples:

The Play option is good for games where you want to have a play button to start the game: Play Eggs o Dozens!

The Auto option is useful when you just want the program to automatically start playing: Eggs o Dozens

15
Programs / Re: QBJS - QBasic for the Web
« on: March 31, 2022, 08:03:29 am »
@bplus - Yes, loading images and sounds are now supported.  In my most recent post there are examples of loading images and sounds from URLs: (Zoom Tool, Sound Keywords).

If you run QBJS on your local machine (by downloading and extracting the qbjs.zip) you can load files from the local filesystem:
Code: QB64: [Select]
  1. Dim img
  2. img = _LoadImage("play.png")
  3. _PutImage (100, 100), img

To load files that are outside of your QBJS folder you can use the file URL format: "file://C:/mypath/myfile.png"

Pages: [1] 2 3 ... 6