1
1
Fork 0
mirror of https://github.com/boxgaming/qbjs.git synced 2024-09-20 04:24:45 +00:00
This commit is contained in:
William Barnes 2022-04-28 21:18:27 -04:00
commit 2c2b1f12da
5 changed files with 150 additions and 19 deletions

View file

@ -35,21 +35,20 @@ CodeMirror.defineMode("qbjs", function(conf, parserConf) {
// TODO: adjust for QB // TODO: adjust for QB
var atomWords = ['true', 'false', 'nothing', 'empty', 'null']; var atomWords = ['true', 'false', 'nothing', 'empty', 'null'];
var builtinFuncsWords = ['_alpha', '_alpha32', '_atan2', '_autodisplay', '_blue', '_blue32', '_continue', '_copyimage', '_cosh', '_d2r', '_delay', '_dest', '_dest', var builtinFuncsWords = ['_alpha', '_alpha32', '_atan2', '_autodisplay', '_blue', '_blue32', '_continue', '_copyimage', '_cosh', '_d2r', '_delay', '_dest',
'_display', '_fontwidth', '_freeimage', '_green', '_green32', '_height', '_instrrev', '_limit', '_keyclear', '_keydown', '_display', '_fontwidth', '_freeimage', '_fullscreen', '_green', '_green32', '_height', '_instrrev', '_limit', '_keyclear', '_keydown',
'_keyhit', '_loadimage', '_mousebutton', '_mouseinput', '_mousex', '_mousey', '_newimage', '_pi', '_printstring', '_printwidth', '_keyhit', '_loadimage', '_mousebutton', '_mouseinput', '_mousex', '_mousey', '_newimage', '_pi', '_printstring', '_printwidth',
'_putimage', '_r2d', '_red', '_red32', '_resize', '_resizewidth', '_resizeheight', '_rgb', '_rgba', '_rgb32', '_rgba32', '_round', '_putimage', '_r2d', '_red', '_red32', '_resize', '_resizewidth', '_resizeheight', '_rgb', '_rgba', '_rgb32', '_rgba32', '_round',
'_screenexists', '_sinh', '_sndclose', '_sndopen', '_sndplay', '_sndloop', '_sndpause', '_sndstop', '_sndvol', '_screenexists', '_sinh', '_sndclose', '_sndopen', '_sndplay', '_sndloop', '_sndpause', '_sndstop', '_sndvol',
'_title', '_trim', '_width', 'abs', 'asc', 'atn', 'chr', 'circle', 'cls', 'color', 'command', 'cos', 'cvi', 'cvl', 'draw', 'exp', '_title', '_trim', '_width', 'abs', 'asc', 'atn', 'beep', 'chr', 'circle', 'cls', 'color', 'command', 'cos', 'cvi', 'cvl', 'exp',
'fix', 'hex', 'input', 'inkey', 'instr', 'int', 'lbound', 'left', 'lcase', 'len', 'line', 'locate', 'log', 'ltrim', 'mid', 'mki', 'mkl', 'fix', 'hex', 'input', 'inkey', 'instr', 'int', 'lbound', 'left', 'lcase', 'len', 'line', 'locate', 'log', 'ltrim', 'mid', 'mki', 'mkl',
'oct', 'paint', 'point', 'preset', 'print', 'pset', 'right', 'rtrim', 'rnd', 'screen', 'shared', 'sgn', 'sin', 'sleep', 'space', 'sqr', 'str', 'swap', 'tan', 'oct', 'paint', 'point', 'preset', 'print', 'pset', 'right', 'rtrim', 'rnd', 'screen', 'shared', 'sgn', 'sin', 'sleep', 'space', 'sqr',
'timer', 'ubound', 'ucase', 'val', 'varptr', 'str', 'swap', 'tan', 'timer', 'ubound', 'ucase', 'val',
// QBJS-specific // QBJS-specific
'export', 'import'] 'export', 'from', 'import']
//'alert', 'confirm', 'domadd', 'domcontainer', 'domcreate', 'domevent','domget', 'domgetimage', 'domremove', 'export',
//'from', 'prompt', 'import', 'storageclear', 'storageget', 'storagekey', 'storagelength', 'storageset', 'storageremove'];
var builtinConsts = ['gx_true', 'gx_false', 'gxevent_init', 'gxevent_update', 'gxevent_drawbg', 'gxevent_drawmap', 'gxevent_drawscreen', var builtinConsts = ['_off', '_smooth', '_stretch', '_squarepixels',
'gx_true', 'gx_false', 'gxevent_init', 'gxevent_update', 'gxevent_drawbg', 'gxevent_drawmap', 'gxevent_drawscreen',
'gxevent_mouseinput', 'gxevent_paintbefore', 'gxevent_paintafter', 'gxevent_collision_tile', 'gxevent_collision_entity', 'gxevent_mouseinput', 'gxevent_paintbefore', 'gxevent_paintafter', 'gxevent_collision_tile', 'gxevent_collision_entity',
'gxevent_player_action', 'gxevent_animate_complete', 'gxanimate_loop', 'gxanimate_single', 'gxbg_stretch', 'gxevent_player_action', 'gxevent_animate_complete', 'gxanimate_loop', 'gxanimate_single', 'gxbg_stretch',
'gxbg_scroll', 'gxbg_wrap', 'gxkey_esc', 'gxkey_1', 'gxkey_2', 'gxkey_3', 'gxkey_4', 'gxkey_5', 'gxkey_6', 'gxkey_7', 'gxbg_scroll', 'gxbg_wrap', 'gxkey_esc', 'gxkey_1', 'gxkey_2', 'gxkey_3', 'gxkey_4', 'gxkey_5', 'gxkey_6', 'gxkey_7',

View file

@ -17,7 +17,7 @@ var GX = new function() {
_fonts[0] = { eid:0, charSpacing:0, lineSpacing: 0}; _fonts[0] = { eid:0, charSpacing:0, lineSpacing: 0};
_fonts[1] = { eid:0, charSpacing:0, lineSpacing: 0}; _fonts[1] = { eid:0, charSpacing:0, lineSpacing: 0};
var _font_charmap = new Array(2).fill(new Array(256).fill({x:0,y:0})); var _font_charmap = new Array(2).fill(new Array(256).fill({x:0,y:0}));
var _fullscreenFlag = false; //var _fullscreenFlag = false;
var __debug = { var __debug = {
enabled: false, enabled: false,
font: 1 // GX.FONT_DEFAULT font: 1 // GX.FONT_DEFAULT
@ -70,7 +70,7 @@ var GX = new function() {
_fontCreateDefault(GX.FONT_DEFAULT); _fontCreateDefault(GX.FONT_DEFAULT);
_fontCreateDefault(GX.FONT_DEFAULT_BLACK); _fontCreateDefault(GX.FONT_DEFAULT_BLACK);
_fullscreenFlag = false; //_fullscreenFlag = false;
__debug = { __debug = {
enabled: false, enabled: false,
font: 1 // GX.FONT_DEFAULT font: 1 // GX.FONT_DEFAULT
@ -160,6 +160,35 @@ var GX = new function() {
} }
}); });
document.addEventListener("fullscreenchange", function(event) {
if (document.fullscreenElement) {
_scene.prevScaleX = _scene.scaleX;
_scene.prevScaleY = _scene.scaleY;
var widthFactor = screen.width / _scene.width;
var heightFactor = screen.height / _scene.height;
var factor = Math.min(widthFactor, heightFactor);
var offsetX = 0;
var offsetY = 0;
if (widthFactor > heightFactor) {
offsetX = (screen.width - _scene.width * factor) / 2;
}
else {
offsetY = (screen.height - _scene.height * factor) / 2;
}
_scene.scaleX = factor;
_scene.scaleY = factor;
_scene.offsetX = offsetX;
_scene.offsetY = offsetY;
}
else {
_scene.scaleX = _scene.prevScaleX;
_scene.scaleY = _scene.prevScaleY;
_scene.offsetX = 0;
_scene.offsetY = 0;
}
});
/* /*
_canvas.addEventListener("keyup", function(event) { _canvas.addEventListener("keyup", function(event) {
if (_scene.active) { if (_scene.active) {
@ -188,6 +217,8 @@ var GX = new function() {
_scene.y = 0; _scene.y = 0;
_scene.scaleX = 1; _scene.scaleX = 1;
_scene.scaleY = 1; _scene.scaleY = 1;
_scene.offsetX = 0;
_scene.offsetY = 0;
_scene.frame = 0; _scene.frame = 0;
_scene.followMode = GX.SCENE_FOLLOW_NONE; _scene.followMode = GX.SCENE_FOLLOW_NONE;
_scene.followEntity = null; _scene.followEntity = null;
@ -1719,14 +1750,17 @@ var GX = new function() {
function _fullScreen(fullscreenFlag) { function _fullScreen(fullscreenFlag) {
if (fullscreenFlag != undefined) { if (fullscreenFlag != undefined) {
_fullscreenFlag = fullscreenFlag;
if (fullscreenFlag) { if (fullscreenFlag) {
document.getElementById("gx-container").requestFullscreen(); if (_canvas.requestFullscreen) {
_canvas.requestFullscreen();
}
} else { } else {
document.exitFullscreen(); if (document.exitFullscreen) {
document.exitFullscreen();
}
} }
} }
return _fullscreenFlag; return (window.innerHeight == screen.height);
} }
@ -1846,11 +1880,11 @@ var GX = new function() {
} }
function _mouseX() { function _mouseX() {
return Math.round(_mousePos.x / _scene.scaleX); return Math.round((_mousePos.x - _scene.offsetX) / _scene.scaleX);
} }
function _mouseY() { function _mouseY() {
return Math.round(_mousePos.y / _scene.scaleY); return Math.round((_mousePos.y - _scene.offsetY) / _scene.scaleY);
}; };
function _mouseButton(button) { function _mouseButton(button) {

38
qb.js
View file

@ -4,6 +4,9 @@ var QB = new function() {
this.PREVENT_NEWLINE = Symbol("PREVENT_NEWLINE"); this.PREVENT_NEWLINE = Symbol("PREVENT_NEWLINE");
this.LOCAL = Symbol("LOCAL"); this.LOCAL = Symbol("LOCAL");
this.SESSION = Symbol("SESSION"); this.SESSION = Symbol("SESSION");
this.STRETCH = Symbol("STRETCH");
this.SQUAREPIXELS = Symbol("SQUAREPIXELS");
this.OFF = Symbol("OFF");
var _strokeThickness = 2; var _strokeThickness = 2;
var _fgColor = null; var _fgColor = null;
@ -120,7 +123,7 @@ var QB = new function() {
// Access methods for std libraries // Access methods for std libraries
// -------------------------------------------- // --------------------------------------------
this.getImage = function(imageId) { this.getImage = function(imageId) {
return _images[imageId]; return _images[imageId].canvas;
}; };
// Extended QB64 Keywords // Extended QB64 Keywords
@ -201,6 +204,21 @@ var QB = new function() {
this.sub__FreeImage = function(imageId) { this.sub__FreeImage = function(imageId) {
_images[imageId] = undefined; _images[imageId] = undefined;
};
this.func__FullScreen = function() {
return GX.fullScreen();
};
this.sub__FullScreen = function(mode, smooth) {
if (mode == QB.OFF) {
GX.fullScreen(false);
}
else if (mode == QB.STRETCH || mode == QB.SQUAREPIXELS) {
// TODO: not making any distinction at present
GX.fullScreen(true);
}
// TODO: implement smooth option (maybe) - the canvas does smooth scaling by default
} }
this.func__Green = function(rgb, imageHandle) { this.func__Green = function(rgb, imageHandle) {
@ -549,6 +567,18 @@ var QB = new function() {
return Math.atan(value); return Math.atan(value);
}; };
this.sub_Beep = function() {
var context = new AudioContext();
var oscillator = context.createOscillator();
oscillator.type = "square";
oscillator.frequency.value = 780;
oscillator.connect(context.destination);
oscillator.start();
setTimeout(function () {
oscillator.stop();
}, 200);
};
this.func_Chr = function(charCode) { this.func_Chr = function(charCode) {
return String.fromCharCode(charCode); return String.fromCharCode(charCode);
}; };
@ -1146,10 +1176,14 @@ var QB = new function() {
x0 = screen.lastX + x0; x0 = screen.lastX + x0;
y0 = screen.lastY + y0; y0 = screen.lastY + y0;
} }
fillColor = _color(fillColor);
if (borderColor == undefined) { if (borderColor == undefined) {
borderColor = fillColor; borderColor = fillColor;
} }
else {
borderColor = _color(borderColor);
}
var pixelStack = [[Math.floor(x0), Math.floor(y0)]]; var pixelStack = [[Math.floor(x0), Math.floor(y0)]];

View file

@ -489,12 +489,43 @@ var ConvertSub = null;
js = (await func_CallMethod( m)) +"(" +(await func_ConvertCls( args)) +");"; js = (await func_CallMethod( m)) +"(" +(await func_ConvertCls( args)) +");";
} else if ( m.name == "_PutImage" ) { } else if ( m.name == "_PutImage" ) {
js = (await func_CallMethod( m)) +"(" +(await func_ConvertPutImage( args)) +");"; js = (await func_CallMethod( m)) +"(" +(await func_ConvertPutImage( args)) +");";
} else if ( m.name == "_FullScreen" ) {
js = (await func_CallMethod( m)) +"(" +(await func_ConvertFullScreen( args)) +");";
} else { } else {
js = (await func_CallMethod( m)) +"(" +(await func_ConvertMethodParams( args)) +");"; js = (await func_CallMethod( m)) +"(" +(await func_ConvertMethodParams( args)) +");";
} }
ConvertSub = js; ConvertSub = js;
return ConvertSub; return ConvertSub;
} }
async function func_ConvertFullScreen(args/*STRING*/) {
if (QB.halted()) { return; }
var ConvertFullScreen = null;
var parts = QB.initArray([{l:1,u:0}], ''); // STRING
var argc = 0; // INTEGER
var mode = ''; // STRING
mode = "QB.STRETCH";
var doSmooth = ''; // STRING
doSmooth = "false";
argc = (await func_ListSplit( args, parts));
if ( argc > 0) {
var arg = ''; // STRING
arg = (QB.func_UCase( QB.arrayValue(parts, [ 1]).value));
if ( arg == "_OFF" ) {
mode = "QB.OFF";
} else if ( arg == "_STRETCH" ) {
mode = "QB.STRETCH";
} else if ( arg == "_SQUAREPIXELS" ) {
mode = "QB.SQUAREPIXELS";
}
}
if ( argc > 1) {
if ((QB.func_UCase( QB.arrayValue(parts, [ 2]).value)) == "_SMOOTH" ) {
doSmooth = "true";
}
}
ConvertFullScreen = mode +", " + doSmooth;
return ConvertFullScreen;
}
async function func_ConvertLine(args/*STRING*/) { async function func_ConvertLine(args/*STRING*/) {
if (QB.halted()) { return; } if (QB.halted()) { return; }
var ConvertLine = null; var ConvertLine = null;
@ -2509,6 +2540,8 @@ if (QB.halted()) { return; }
await sub_AddQBMethod( "SUB", "_Display", False); await sub_AddQBMethod( "SUB", "_Display", False);
await sub_AddQBMethod( "FUNCTION", "_FontWidth", False); await sub_AddQBMethod( "FUNCTION", "_FontWidth", False);
await sub_AddQBMethod( "SUB", "_FreeImage", False); await sub_AddQBMethod( "SUB", "_FreeImage", False);
await sub_AddQBMethod( "SUB", "_FullScreen", False);
await sub_AddQBMethod( "FUNCTION", "_FullScreen", False);
await sub_AddQBMethod( "FUNCTION", "_Green", False); await sub_AddQBMethod( "FUNCTION", "_Green", False);
await sub_AddQBMethod( "FUNCTION", "_Green32", False); await sub_AddQBMethod( "FUNCTION", "_Green32", False);
await sub_AddQBMethod( "FUNCTION", "_Height", False); await sub_AddQBMethod( "FUNCTION", "_Height", False);
@ -2553,6 +2586,7 @@ if (QB.halted()) { return; }
await sub_AddQBMethod( "FUNCTION", "Abs", False); await sub_AddQBMethod( "FUNCTION", "Abs", False);
await sub_AddQBMethod( "FUNCTION", "Asc", False); await sub_AddQBMethod( "FUNCTION", "Asc", False);
await sub_AddQBMethod( "FUNCTION", "Atn", False); await sub_AddQBMethod( "FUNCTION", "Atn", False);
await sub_AddQBMethod( "SUB", "Beep", False);
await sub_AddQBMethod( "FUNCTION", "Chr$", False); await sub_AddQBMethod( "FUNCTION", "Chr$", False);
await sub_AddQBMethod( "SUB", "Circle", False); await sub_AddQBMethod( "SUB", "Circle", False);
await sub_AddQBMethod( "SUB", "Cls", False); await sub_AddQBMethod( "SUB", "Cls", False);

View file

@ -591,6 +591,8 @@ Function ConvertSub$ (m As Method, args As String)
ElseIf m.name = "_PutImage" Then ElseIf m.name = "_PutImage" Then
js = CallMethod(m) + "(" + ConvertPutImage(args) + ");" js = CallMethod(m) + "(" + ConvertPutImage(args) + ");"
ElseIf m.name = "_FullScreen" Then
js = CallMethod(m) + "(" + ConvertFullScreen(args) + ");"
Else Else
'js = CallMethod(m) + "(" + ConvertExpression(args) + ");" 'js = CallMethod(m) + "(" + ConvertExpression(args) + ");"
js = CallMethod(m) + "(" + ConvertMethodParams(args) + ");" js = CallMethod(m) + "(" + ConvertMethodParams(args) + ");"
@ -599,6 +601,31 @@ Function ConvertSub$ (m As Method, args As String)
ConvertSub = js ConvertSub = js
End Function End Function
Function ConvertFullScreen$ (args As String)
ReDim parts(0) As String
Dim argc As Integer
Dim mode As String: mode = "QB.STRETCH"
Dim doSmooth As String: doSmooth = "false"
argc = ListSplit(args, parts())
If argc > 0 Then
Dim arg As String
arg = UCase$(parts(1))
If arg = "_OFF" Then
mode = "QB.OFF"
ElseIf arg = "_STRETCH" Then
mode = "QB.STRETCH"
ElseIf arg = "_SQUAREPIXELS" Then
mode = "QB.SQUAREPIXELS"
End If
End If
If argc > 1 Then
If UCase$(parts(2)) = "_SMOOTH" Then doSmooth = "true"
End If
ConvertFullScreen = mode + ", " + doSmooth
End Function
Function ConvertLine$ (args As String) Function ConvertLine$ (args As String)
' TODO: This does not yet handle dash patterns ' TODO: This does not yet handle dash patterns
Dim firstParam As String Dim firstParam As String
@ -2667,6 +2694,8 @@ Sub InitQBMethods
AddQBMethod "SUB", "_Display", False AddQBMethod "SUB", "_Display", False
AddQBMethod "FUNCTION", "_FontWidth", False AddQBMethod "FUNCTION", "_FontWidth", False
AddQBMethod "SUB", "_FreeImage", False AddQBMethod "SUB", "_FreeImage", False
AddQBMethod "SUB", "_FullScreen", False
AddQBMethod "FUNCTION", "_FullScreen", False
AddQBMethod "FUNCTION", "_Green", False AddQBMethod "FUNCTION", "_Green", False
AddQBMethod "FUNCTION", "_Green32", False AddQBMethod "FUNCTION", "_Green32", False
AddQBMethod "FUNCTION", "_Height", False AddQBMethod "FUNCTION", "_Height", False
@ -2714,6 +2743,7 @@ Sub InitQBMethods
AddQBMethod "FUNCTION", "Abs", False AddQBMethod "FUNCTION", "Abs", False
AddQBMethod "FUNCTION", "Asc", False AddQBMethod "FUNCTION", "Asc", False
AddQBMethod "FUNCTION", "Atn", False AddQBMethod "FUNCTION", "Atn", False
AddQBMethod "SUB", "Beep", False
AddQBMethod "FUNCTION", "Chr$", False AddQBMethod "FUNCTION", "Chr$", False
AddQBMethod "SUB", "Circle", False AddQBMethod "SUB", "Circle", False
AddQBMethod "SUB", "Cls", False AddQBMethod "SUB", "Cls", False