PS I see we don't do files yet.
PS I see we don't do files yet.
This is cool! Looks like you’ve done a great job. I’m going to play with it some more later today.
- Dav
Do you mean an Open/Save dialog for your programs saved on your local hard drive or OPEN "file.txt" FOR BINARY etc? For the former, I just use notepad plus copy/paste as quick and easy intermediate.
Ultimately, you can probably do something with the QB64 IDE or any other editor and have a script generate a base64 URL, open a browser and instant run when you press F5. But yeah, it can't lock you into a comfortable playpen like JB but then again there's a whole universe waiting outside!
Hey @bplus nice example! Yes, Subs and Functions are supported and at present all variables must be declared.
Goto and gosub are not supported at present. There will be some complexity to do that as there is not a parallel in javascript.
@dbox
More info, shouldn't Mid$( ) be color coded same as InStr?
It's a very neat project on a couple of levels!
I like the part of the console that shows the JavaScript conversion. It would be fun to make a small qb app, and then use the JS code on a server. I have made a few dozen JS snippets for various websites, but I do so at such an infrequent rate, I find myself constantly in need of refreshing my language skills. That's very time consuming. It would be much more intuitive to program in QB and convert. Thanks for this. It's a very neat project on a couple of levels!
Pete
qb2js.exe qb2js.bas > qb2js.js
@dbox
I almost have this guy roughed out but _delay is not working
Sleep is messing with Keypresses need a _KeyClear
I tried my own version of sleep and that worked perfect in QB64 keeping inkey$ clear for next letter but QBJS ignored code. So I am just trying _delay to give user time to read what happened before next round starts.
https://v6p9d9t4.ssl.hwcdn.net/html/5279712/index.html?qbcode=BOAQAHvAN8AKgkRJTdAZAAoXAKeoqmhqSKipyQDEAGU8JGT1J4BrvX7QVRPmANV/mKmJ6GgqiLuQBZhedrgNLi5u74BUByQkEkpypd+EpJyI3AKngBzqAYOgCt17aAOnpc0Mr2uQC1+rKy2AJCIaemJ6ldgL5ASkjoWv85k1Dw9iQxYBOIoKSSnKiqwahpyKsKhmRj386O3dc5evgfr8ARWQlNVTat3cAdo7R4sO6CrTu2sA3zLCr3M8MABel2HGdsigqCT3N2gCUCkoyfp9fIB9d+o/eeqAaokIqct+vmkcP8XlAhAF16wFBAdEABqbZcVdbdgamqIqg7PyAaSAf02mT63kAD6u2cYSanojLrLaBnlFQ0lSQ0xFevQDPXcbjl77g6eKWR+y6nvunuY7+59bZr2j71+/1r2s8+o51fcs7iIepdVa/OF86kziuad/vll7bv9/cAAxgkVORGFwADqfyx7vySbA5ev3nc6Rgz7Ss1qgbQXP1u95alLv23f866+47/n2+h/HjfEZt+4rdxsziXF++5akvvuWtR77557OuvYfez3YAHdXfsA72wCjqiIiKmIKy1d1xIBtsMXYUcSrvT4=
https://v6p9d9t4.ssl.hwcdn.net/html/5279712/index.html?qbcode=BOAQAHvAM8A6QDCjgGNAMEAXlQ8JESU1gDJYBRagCmAAr4SMnqWwDTjdqCqJ/NfUd38+wklOVM0CUk5E2gFX6vuQacirCpRJh316doBq+ERQUklOVNwEFad6G9AD1zxiKiSmoqkyC8ueDppUAWo2/cwGpDz8AVtvm6AHUFJRnk+zegD55n3wzhqiQipy4AHEB0QtrmLgAW3zSWN9tYAAz/31TQ4ANASKnIjX3q6o9GTaFWjM6xNe5z637P/N19R6rDNSXtnfdy0jCWK3SVzS43A=
Bubble Sorting
10 ^ 3 = 0,81 s
10 ^ 4 = 78 s
10 ^ 5 = ? 780 seconds ?
10 ^ 6 = ??? 8100 seconds ??? 1,5 hours
Hey @bplus. That was the intent of this page that I referenced in the first post:
QBasic Language Support (https://github.com/boxgaming/qbjs/wiki/QBasic-Language-Support)
However, there are several things that have been discovered since I posted that need to be added to this page. Perhaps to make it easier to reference I can put a bulleted list at the top, similar to what you've created here with links to the detail to make it easier to scan through. I'll also update the keyword reference page for the issues that have been discovered that are related to a specific keyword.
The epicycles code runs so awesome on this, on par with native:
https://v6p9d9t4.ssl.hwcdn.net/html/5279712/index.html?qbcode=BOAQAHvAMsAwmAOsAcc9AMfANb0EiJKbgFBc+xkludGVnZXLoBhkAowgArU8AWckAKcgCfEZEYW5pbGluwAM7gMnYVyZWxpZWbqAFUCRk9STAeEOpAqie7pKiA8vPN7LsAtXZnAOQUlGaBJKcqXZhKSciLQCp72cTAJNT0RYAbvuE4aokIqdqAByy163O11LdP9E6Zga7eavqABpHnRu0tKDbpiz63vjtm9quOwBpjkAClpyRbtjV5sAOM/gFoJFTkRaf5Q05FWFT98tcb08B0dWYEzNScD2rgNLq7yqVmuAFLxAanWlDRnb2H+2IdcjkF18Te9bqEfCs/IM9E0cEhpim70KltU2tGqd/oULap9adPCxBpiSnIsz25QsA3dSoTCT6k/AFLOlGj6s6qRd+8AGNKlmyu7Qp46Xm+ZYSPvkrfHbfqRB63p6gv+jGP67AX+OEpI6FStov1/NcV6iVYewdg7XYBi2GrfAmdqsIVbpngBMgsyjZPG3J+tT4/b8UOX7fqpCCF3z515ik+Y26inOf18Pn7vzVfp+vZF35qpFc99B59yzVJiyDTPUVVGLXm83zOfzfo9pRfYBw2HDYcbxCIiKmIKyjmAF3vJ05O31
https://v6p9d9t4.ssl.hwcdn.net/html/5429488/index.html?qbcode=
Here's another little tidbit for you. I put together a simple POC to work out some ideas around allowing the QBJS canvas to interact with other elements on the page. In this example you can create html elements, add them to a page and even assign events to your QB Subs:Code: QB64: [Select]
DomInit DomAdd "div", "button-panel" DomAdd "button", "circle-button", "Draw Circle", "button-panel" DomAdd "button", "rect-button", "Draw Rectangle", "button-panel" DomAdd "input", "myinput", "", "button-panel" DomAdd "button", "text-button", "Draw Text", "button-panel" DomAdd "button", "clear-button", "Clear Screen", "button-panel" Dim panel panel = DomGet("button-panel") panel.style.border = "1px solid green" panel.style.backgroundColor = "#333" panel.style.padding = "6px" Dim btn btn = DomGet("circle-button") btn.onclick = sub_OnBtnCircleClick btn = DomGet("rect-button") btn.onclick = sub_OnBtnRectClick btn = DomGet("text-button") btn.onclick = sub_OnBtnTextClick btn = DomGet("clear-button") btn.onclick = sub_OnBtnClearClick btn.style.marginLeft = "15px" Dim myinput myinput = DomGet("myinput") myinput.style.marginLeft = "15px" Sub OnBtnCircleClick Sub OnBtnRectClick Sub OnBtnTextClick Sub OnBtnClearClick ' ------------------------------------------------------------------ ' HTML DOM API Methods ' ------------------------------------------------------------------ $If Javascript var e = document.createElement(etype); e.id = eid; e.className = "qbjs"; e.innerHTML = content; } parentId = "gx-container"; } document.getElementById(parentId).appendChild(e); $If Javascript Sub DomInit $If Javascript var elements = document.getElementsByClassName("qbjs"); elements[i].remove(); }
View in QBJS (https://v6p9d9t4.ssl.hwcdn.net/html/5429488/index.html?qbcode=ZEb21Jbml0AFCoje2oLIyQCAARYTI0u0CRFnqKxOro6N7dgC2iODC3MrZ8rl3gCsbS5MbYyr/ZsNEcmF34iobS5MbYyn9Vf3XAegG5MrG6ZD0P0QpMrG6MLcztjKf/zIq8sI0tzg6uk5mM2vLS3ODq6TkCIiIs/7NkfHoOoboyvDpnwezQNUZXh0ofmzvem9lEY2xlYXLDezCIbYysLl84qmxuTKyt1D94RFgSI0tpyumUA9GhURvbUdldNYBR1k+AAputIBduEc3R5bGWf2isTe5MjK5EM+sAxtguDwkCObe2NLI4RGdyZWVu8yYXjzEsTCxtbO5N7q3MmIRDb2xvckp9sAj4AGZ9vepEG6+M4MLIyNLczlx2oBsv9UkNQTE6NxTlNne2/vNn1KnOnjN7cxtjSxtYkUhObqxUAF9GSntyE6NyG0uTG2QhWVDbGlja7VElWp6xr9LIoUI8n52GSntyE6Nykysbohrg2xpY2vvCJ//ajW997yUEqQH7klPbkJ0blRleHRD6dqODzuiknN2yPc4durUlPbkJ0bkNsZWFyUCIbY0sbXcJ9MYpLawuTO0tyYyszocK6egBq9uY8HXZ02PP13ZOQynpFOlRonNd1EEpurEJrLoB/yX6CUm5kMIAqPrmgGDmz4BYZs87A8QDjypxI/fHYAVvg9rXAHPSvHgbepqAaPDQt4AkVuZH27oO6fQ9VMNsCguaSjJLc6MrOyuTkAPBJ74DzXawB37JCA0eq1lw6nS+gQvKs3cID7cetl5aetuEg7Qs2fC69VPTbk5KcdYHI/9VPQaY0tzLKPIs8IqY/JTOQ992WcFUZuamVbfJ3CSQELk3ffcek3+9VH4KSzW8yAI7MLY6st5QDwqAPpvgkRFFgao0Mrd1VVJOfnrZIirfqr/Vk5Kg5NLc6Kbo5NLdNQGfbj4uzuvj5ejhsY2o8Ix9n/Rs/yz8SZiZ4hlf5YEhtjnYvDu2WAT61rW58IQn0AABFERVVmZ3d3d83u7/////8AkkkkpJJJdum3QaQqJqZbwJET02OYSCoJNthk1ldGhvZHPt7JJJJJNtttt7bbbbbbbf//////////gABnCW39KiMro8uDLc9agVTdHJpbmdedwTK0sl5YLC5z1uWUGY29udGVudLL2DxsEO4MLkytzokskiyJ+f4wCTkWEJSmF2YXNjcmlwdHqu3BaWaQbQ7I3sbq2src6bfySzsroitjK2src6ZgNCeUlkQ0k46Z4D3G0VyZXR1cm5uAHcHwH16ppBOzC5RpAZYlmIsgSxuTKwujKitjK2p4JlbnRnTWMleqa0TVBaWSLZZdvVLoRhIY2xhc3NOYW1liyYgNxYmpzQmeqzOTzuZoBCWWRDq3MjKzNLcysi9lL1VUSjwJDS3NzK5JCompkWweG9Vkb1WEmH5lqCenstcqgHxoM05oZ9F5wZV/43l0aALO8VREMbe3OjC0tzK5JPf8f7Uj/d4XvettiZCwSWFwcGVuZENoaWw3AMkrXIHh7wmQwI5kf//ClHRnVuY3Rpb27F8pZsLt8kf68XdhK//958UCwF/auWJq/wZJrcFJRqVYF1////V7ZCla51rX+yOjx2VsZW1lbnRzy6uEEd8lzQnlDbGFzc05hUALay2m4p2LK/yWEzN7l3KTs8BpKi50I7VagjQgrYytzO6NDzSaptZglf/+kUgAtv9uwV0uFwrkytre7Mttlzr/vnT42wFOOfc=)
Assuming this approach is useful I may look at building in the DOM API methods as new QBJS Keywords.
Man, this is just so amazing. Galleon intended to bring QB64 into the web with a javascript core one day™️, you just went ahead and did it yourself. The integration blows my mind, with parameters going back and forth between basic code and javascript. You are on fire, man. 🔥
@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 (https://github.com/boxgaming/qbjs/releases/download/v0.3.0-beta/qbjs.zip)) you can load files from the local filesystem:Code: QB64: [Select]
Dim img
To load files that are outside of your QBJS folder you can use the file URL format: "file://C:/mypath/myfile.png"
By the way @bplus, the lastest version has that Cls fix, so your original game code is working as intended now:
View in QBJS (https://v6p9d9t4.ssl.hwcdn.net/html/5512918/index.html?qbcode=JEaW0BACgufDTG9uZ2CkLEAWOCkLOsA01A2hpdHP5Ec2NvcmVwIpujC5OduO3IrcytrSyudsKkMrSztDooAVLgA9yAMxAMkAMLgHXTXkAaFlPzFblN0YXJzw6AGLua7mfEA1Kd+/SMA4ND2gFFWLQCiAACm+kFFWa9Kv3QKKh782u1qAvnjqrc5tLO3MrJAWQBPYCMrcytrzJiObo6szMN4VTY3JlZW7iujpzK7pLaws7K1UA2DYyDdOq62XXcYtYT0Mw11lJYCRm9ylF+YxQKo37qH+GGoKbK6b3YSS3OkxAlJuZOSAVZZ4fXb3te87L14y62/BKSOhYMh+YrGAV3y73DvsvlLWVlJDvOVHC4NnS9STDDTmV4dEvHR1B1dEltYWdl6xXCbDbPTxt26pf7NEuOva2v78uqztFRe2UFKb9gAWo7dzLi0uCXSgmvx4F9ZglLv5M+6ZbWvhyat8026HXp1cbuqkFhkFEb3/6OEhtjnL/fM9d4vdP8QIoOTS3OnWAESGGkNLo5wwJ0RJoB3iDYKAEU2NvcmUBteCX/7UNMaW5l5BMA0VNiOw4tSM2Iam6MrhN9NwqT8VWdCcGtfBrX7k+mgoSM3/a9fRmbXqbO2YJ0aGXdBmVuZW1pZXOf//lYqG0uTG2MvN7u5ZuCFywNnS2xDcFv//WgUlmyMJTcXIRMFcG2xIa4AvddjIOl4dPPBjL1LOwDztPcw1RoZW7ZVAhjb2xsaXNpb26v///7UfERGVsYXnRgC6Ff///2PD0vHo1/wDt3hpmxN0LnjEJ1I1jde8tOF/AuVLhZQ21vdmVgg3RoYXRYQmJhZHACYm95lYBDUADuXMzcoc+6J3tsEqN7evQbawtzyk+d+Mzt7eyMTyy7LsASI6W4JFbmSgB/a2tAD+zhhunaywmcerFr7FQCeXNY5YUA+TvzAN4ZR+c301fvKVqREJn8bssHfON1mytV3l7eM+qbqBlKBfs98GS2V5RG93bt//rZT+0szHrwVJlAgPMLeeISzOjtYILxMXVaYQHuvc9V8A5l/+3Mv3jLZ2aYR3vv89d61/DHbudrxCTOkwqKSoknkNffJPTDI1qRdvXyO6PETr6walVFkvmJheq/2Dm4OxYIv9ncnrNxf3DzTRkRpc3BsYXm4ee+ETGltaXRX/9+JDTG9vcEYEVW50aWx7p9eR2rTLxFNsZWVwuwg=)
Play Game (https://v6p9d9t4.ssl.hwcdn.net/html/5512918/index.html?mode=play&qbcode=JEaW0BACgufDTG9uZ2CkLEAWOCkLOsA01A2hpdHP5Ec2NvcmVwIpujC5OduO3IrcytrSyudsKkMrSztDooAVLgA9yAMxAMkAMLgHXTXkAaFlPzFblN0YXJzw6AGLua7mfEA1Kd+/SMA4ND2gFFWLQCiAACm+kFFWa9Kv3QKKh782u1qAvnjqrc5tLO3MrJAWQBPYCMrcytrzJiObo6szMN4VTY3JlZW7iujpzK7pLaws7K1UA2DYyDdOq62XXcYtYT0Mw11lJYCRm9ylF+YxQKo37qH+GGoKbK6b3YSS3OkxAlJuZOSAVZZ4fXb3te87L14y62/BKSOhYMh+YrGAV3y73DvsvlLWVlJDvOVHC4NnS9STDDTmV4dEvHR1B1dEltYWdl6xXCbDbPTxt26pf7NEuOva2v78uqztFRe2UFKb9gAWo7dzLi0uCXSgmvx4F9ZglLv5M+6ZbWvhyat8026HXp1cbuqkFhkFEb3/6OEhtjnL/fM9d4vdP8QIoOTS3OnWAESGGkNLo5wwJ0RJoB3iDYKAEU2NvcmUBteCX/7UNMaW5l5BMA0VNiOw4tSM2Iam6MrhN9NwqT8VWdCcGtfBrX7k+mgoSM3/a9fRmbXqbO2YJ0aGXdBmVuZW1pZXOf//lYqG0uTG2MvN7u5ZuCFywNnS2xDcFv//WgUlmyMJTcXIRMFcG2xIa4AvddjIOl4dPPBjL1LOwDztPcw1RoZW7ZVAhjb2xsaXNpb26v///7UfERGVsYXnRgC6Ff///2PD0vHo1/wDt3hpmxN0LnjEJ1I1jde8tOF/AuVLhZQ21vdmVgg3RoYXRYQmJhZHACYm95lYBDUADuXMzcoc+6J3tsEqN7evQbawtzyk+d+Mzt7eyMTyy7LsASI6W4JFbmSgB/a2tAD+zhhunaywmcerFr7FQCeXNY5YUA+TvzAN4ZR+c301fvKVqREJn8bssHfON1mytV3l7eM+qbqBlKBfs98GS2V5RG93bt//rZT+0szHrwVJlAgPMLeeISzOjtYILxMXVaYQHuvc9V8A5l/+3Mv3jLZ2aYR3vv89d61/DHbudrxCTOkwqKSoknkNffJPTDI1qRdvXyO6PETr6walVFkvmJheq/2Dm4OxYIv9ncnrNxf3DzTRkRpc3BsYXm4ee+ETGltaXRX/9+JDTG9vcEYEVW50aWx7p9eR2rTLxFNsZWVwuwg=)