From 60dd590bca7e7be8956dc5d85da30d6682fa1e7e Mon Sep 17 00:00:00 2001 From: pancelor Date: Tue, 7 Feb 2023 17:03:46 -0800 Subject: [PATCH] wip merge pseudo-3d effect from broken-sign-games --- src/js/compiler.js | 14 ++---- src/js/graphics.js | 112 ++++++++++++++++++++++++++------------------- src/js/parser.js | 12 +---- 3 files changed, 73 insertions(+), 65 deletions(-) diff --git a/src/js/compiler.js b/src/js/compiler.js index 35eeb6dda..25932a92c 100644 --- a/src/js/compiler.js +++ b/src/js/compiler.js @@ -29,7 +29,7 @@ function generateSpriteMatrix(dat) { var result = []; for (var i = 0; i < dat.length; i++) { var row = []; - for (var j = 0; j < dat.length; j++) { + for (var j = 0; j < dat[i].length; j++) { var ch = dat[i].charAt(j); if (ch == '.') { row.push(-1); @@ -180,14 +180,10 @@ function generateExtraMembers(state) { o.spritematrix[i] = zeros; } } else { - if ( o.spritematrix.length!==state.sprite_size) { - logWarning("Sprite graphics must be " + state.sprite_size + " wide and " + state.sprite_size + " high exactly.",o.lineNumber); - } else { - for(var i = 0; i < state.sprite_size; i++) { - if(o.spritematrix[i].length!==state.sprite_size) { - logWarning("Sprite graphics must be " + state.sprite_size + " wide and " + state.sprite_size + " high exactly.",o.lineNumber); - break; - } + for(var i = 0; i < state.sprite_size; i++) { + if(o.spritematrix[i].length!==state.sprite_size) { + logWarning("Sprite graphics must be " + state.sprite_size + " wide.",o.lineNumber); + break; } } o.spritematrix = generateSpriteMatrix(o.spritematrix); diff --git a/src/js/graphics.js b/src/js/graphics.js index 01e797c11..d015609c0 100644 --- a/src/js/graphics.js +++ b/src/js/graphics.js @@ -1,4 +1,4 @@ -function createSprite(name,spritegrid, colors, padding) { +function createSprite(name,spritegrid, colors, padding, override_cellwidth, override_cellheight) { if (colors === undefined) { colors = [state.bgcolor, state.fgcolor]; } @@ -6,25 +6,34 @@ function createSprite(name,spritegrid, colors, padding) { var sprite = makeSpriteCanvas(name); var spritectx = sprite.getContext('2d'); - renderSprite(spritectx, spritegrid, colors, padding, 0, 0); + if (override_cellheight !== undefined) { + sprite.height=override_cellheight + } + renderSprite(spritectx, spritegrid, colors, padding, 0, 0, override_cellwidth, override_cellheight); return sprite; } -function renderSprite(spritectx, spritegrid, colors, padding, x, y) { +// render a sprite (spritegrid, colors) to a drawing context (spritectx,padding,x,y) +// the image will be scaled up based on cellwidth and cellheight +function renderSprite(spritectx, spritegrid, colors, padding, x, y, override_cellwidth, override_cellheight) { if (colors === undefined) { colors = ['#00000000', state.fgcolor]; } - var offsetX = x * cellwidth; - var offsetY = y * cellheight; + override_cellheight=override_cellheight || cellheight + override_cellwidth=override_cellwidth || cellwidth + + var offsetX = x * override_cellwidth; + var offsetY = y * override_cellheight; - spritectx.clearRect(offsetX, offsetY, cellwidth, cellheight); + spritectx.clearRect(offsetX, offsetY, override_cellwidth, override_cellheight); var w = spritegrid[0].length; var h = spritegrid.length; - var cw = ~~(cellwidth / (w + (padding|0))); - var ch = ~~(cellheight / (h + (padding|0))); + var cw = ~~(override_cellwidth / (w + (padding|0))); + var ch = ~~(override_cellheight / (h + (padding|0))); + var pixh=ch; if ("scanline" in state.metadata) { pixh=Math.ceil(ch/2); @@ -120,13 +129,41 @@ function regenSpriteImages() { continue; } - if (canOpenEditor) { - spriteimages[i] = createSprite(i.toString(),sprites[i].dat, sprites[i].colors); + if (sprites[i].dat.length === state.sprite_size) { + // normal sprite + if (canOpenEditor) { + spriteimages[i] = createSprite(i.toString(),sprites[i].dat, sprites[i].colors); + } + + var spriteX = (i % spritesheetSize)|0; + var spriteY = (i / spritesheetSize)|0; + renderSprite(spritesheetContext, sprites[i].dat, sprites[i].colors, 0, spriteX, spriteY); + sprites[i].canvas=spritesheetCanvas + sprites[i].sx=spriteX * cellwidth + sprites[i].sy=spriteY * cellheight + sprites[i].sw=cellwidth + sprites[i].sh=cellheight + sprites[i].oy=0 + // console.log("normal",i) + } else { + // tall sprite + + var name=i.toString() + var tallheight = cellheight * sprites[i].dat.length / state.sprite_size + + // the only place the overide params are used: + var canv=createSprite(name,sprites[i].dat, sprites[i].colors,0,cellwidth,tallheight); + // assert(precanv==canv) + spriteimages[i] = canv + sprites[i].canvas=canv + sprites[i].sx=0 + sprites[i].sy=0 + sprites[i].sw=cellwidth + sprites[i].sh=tallheight + sprites[i].oy=cellheight - canv.height + // console.log("tall",name,canv.width,canv.height); } - - var spriteX = (i % spritesheetSize)|0; - var spriteY = (i / spritesheetSize)|0; - renderSprite(spritesheetContext, sprites[i].dat, sprites[i].colors, 0, spriteX, spriteY); + // console.log(" ",sprites[i].sx,sprites[i].sy,sprites[i].sw,sprites[i].sh,sprites[i].oy) } if (canOpenEditor) { @@ -147,16 +184,12 @@ var editorGlyphMovements=[]; var canvasdict={}; function makeSpriteCanvas(name) { - var canvas; - if (name in canvasdict) { - canvas = canvasdict[name]; - } else { - canvas = document.createElement('canvas'); - canvasdict[name]=canvas; + if (!(name in canvasdict)) { + canvasdict[name]=document.createElement('canvas'); + canvasdict[name].width = cellwidth; + canvasdict[name].height = cellheight; } - canvas.width = cellwidth; - canvas.height = cellheight; - return canvas; + return canvasdict[name]; } @@ -495,16 +528,14 @@ function redraw() { for (var k = 0; k < state.objectCount; k++) { if (posMask.get(k) != 0) { - var spriteX = (k % spritesheetSize)|0; - var spriteY = (k / spritesheetSize)|0; - var x = xoffset + (i-mini-cameraOffset.x) * cellwidth; var y = yoffset + (j-minj-cameraOffset.y) * cellheight; + var sprite = sprites[k]; ctx.drawImage( - spritesheetCanvas, - spriteX * cellwidth, spriteY * cellheight, cellwidth, cellheight, - Math.floor(x), Math.floor(y), cellwidth, cellheight); + sprite.canvas, + sprite.sx,sprite.sy,sprite.sw,sprite.sh, + Math.floor(x), Math.floor(y)+sprite.oy, sprite.sw,sprite.sh); } } } @@ -546,12 +577,6 @@ function redraw() { var posMask = curlevel.getCellInto(posIndex,_o12); if (posMask.get(k) != 0) { - var spriteX = (k % spritesheetSize)|0; - var spriteY = (k / spritesheetSize)|0; - - - //console.log(posIndex + " " + layerID); - var x = xoffset + (i-mini-cameraOffset.x) * cellwidth; var y = yoffset + (j-minj-cameraOffset.y) * cellheight; @@ -567,11 +592,11 @@ function redraw() { ctx.globalAlpha = 1-tween; } } - + var sprite = sprites[k]; ctx.drawImage( - spritesheetCanvas, - spriteX * cellwidth, spriteY * cellheight, cellwidth, cellheight, - Math.floor(x), Math.floor(y), cellwidth, cellheight); + sprite.canvas, + sprite.sx,sprite.sy,sprite.sw,sprite.sh, + Math.floor(x), Math.floor(y)+sprite.oy, sprite.sw,sprite.sh); ctx.globalAlpha = 1; } } @@ -839,13 +864,8 @@ function canvasResize() { cellwidth = canvas.width / screenwidth; cellheight = canvas.height / screenheight; - var w = 5; - var h = 5; - - if (sprites.length >= 2) { - var w = sprites[1].dat.length; - var h = sprites[1].dat.length;//sprites[1].dat[0].length; - } + var w = state.sprite_size || 5; + var h = state.sprite_size || 5; if (textMode) { w=5 + 1; diff --git a/src/js/parser.js b/src/js/parser.js index f63059fc3..396eb917f 100644 --- a/src/js/parser.js +++ b/src/js/parser.js @@ -331,12 +331,7 @@ var codeMirrorFn = function() { return nstate; }, blankLine: function(state) { - if (state.section === 'levels') { - if (state.levels[state.levels.length - 1].length > 0) - { - state.levels.push([]); - } - } + blankLineHandle(state) }, token: function(stream, state) { var mixedCase = stream.string; @@ -666,14 +661,11 @@ var codeMirrorFn = function() { spritematrix[spritematrix.length - 1] += ch; if (spritematrix[spritematrix.length-1].length>state.sprite_size){ - logError('Sprites must be ' + state.sprite_size + ' wide and ' + state.sprite_size + ' high.', state.lineNumber); + logError('Sprites must be ' + state.sprite_size + ' wide.', state.lineNumber); stream.match(reg_notcommentstart, true); return null; } o.spritematrix = state.objects_spritematrix; - if (spritematrix.length === state.sprite_size && spritematrix[spritematrix.length - 1].length == state.sprite_size) { - state.objects_section = 0; - } if (ch!=='.') { var n = parseInt(ch);