Skip to content

Commit

Permalink
markdown css changes, Audio.play bugfix
Browse files Browse the repository at this point in the history
  • Loading branch information
xharris committed Apr 30, 2020
1 parent bd29e19 commit cc9deda
Show file tree
Hide file tree
Showing 7 changed files with 208 additions and 26 deletions.
6 changes: 4 additions & 2 deletions engines/love2d/docs/entity.md
Original file line number Diff line number Diff line change
Expand Up @@ -102,9 +102,11 @@ Player({custom_prop: 5})

`update(dt)`

`draw()`
`draw(default_draw_fn)`

> **NOTE**: if draw() is used, width and height variables need to be set manually.
> **NOTE**:
> * if draw() is overriden, width and height variables need to be set manually, unless `default_draw_fn()` is called.
> * Draw operations are positioned relative to the entity.
`predraw()`

Expand Down
137 changes: 131 additions & 6 deletions engines/love2d/index.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
// TODO: copy web_preload_image to relative path

const { spawn } = require("child_process");
const nwZIP = require("archiver"); // used for zipping

Expand Down Expand Up @@ -117,7 +119,8 @@ module.exports.settings = {
title: "if enabled, web container will be the size given below",
},
],
["web_game_size", "number", { inputs: 2, default: [800, 600] }],
["web_game_size", "number", { label: "canvas size", inputs: 2, default: [800, 600] }],
["web_preload_image", "text", { label: "preload image background (url)" }]
],
get script_path() {
return app.project_path;
Expand Down Expand Up @@ -317,15 +320,137 @@ module.exports.settings = {
<script src="blanke.js"></script>
<script type="text/javascript">
(function(){loadGame('${project_name}.data','my_game',${
!app.projSetting("export").web_autoplay || true
},${resolution[0]},${resolution[1]});})();
app.exportSetting("web_autoplay") == null ? true : app.exportSetting("web_autoplay")
},${resolution[0]},${resolution[1]},"${app.exportSetting("web_preload_image")}");})();
</script>
</body>
</html>`;
let web_stack = app.projSetting("export").web_stack;
let web_memory = app.projSetting("export").web_memory;
let web_stack = app.exportSetting("web_stack");
let web_memory = app.exportSetting("web_memory");
let extrajs = mem =>
`if(!game_loaded)var game_loaded={};if(!loadGame)var loadGame=function(data_file,div_id,play_on_focus,width,height){if(game_loaded[data_file.split('.').slice(0,-1).join('.')])return;let use_canvas_size=!(width||height);width=width||800;height=height||600;let el_parent,el_overlay,el_message,canvas,ctx;el_parent=document.getElementById(div_id);el_parent.setAttribute("style","width:"+width+"px;height:"+height+"px;background:#485358;position:relative;overflow:hidden;");el_overlay=document.createElement("div");el_overlay.setAttribute("style","z-index:2;position:absolute;top:0;left:0;right:0;bottom:0;cursor:pointer;box-shadow: inset 0 0 5em 1em #000;");let overlay_inner=function(t){return'<div style="text-align: center;position: absolute;top: 50%;left: 50%;transform: translate(-50%,-50%);font-size: 28px;font-family: Trebuchet MS;color: white;text-shadow: 0px 0px 1px black, 0px 0px 1px black, 0px 0px 1px black, 0px 0px 3px black;padding: 3px;user-select:none;">'+t+'</div>'};el_overlay.innerHTML=overlay_inner("Loading...");el_message=document.createElement("div");el_message.setAttribute("style","z-index:3;position:absolute;top:0;left:0;outline:none;color:white;font-size:12px;text-shadow: 0px 0px 1px black, 0px 0px 1px black, 0px 0px 1px black, 0px 0px 3px black;padding:3px;");canvas=document.createElement('canvas');canvas.setAttribute("style","z-index:1;position:absolute;left:0;right:0");canvas.tabIndex=1;canvas.addEventListener('keydown',e=>{e.preventDefault();return false;});canvas.width=width||800;canvas.height=height||600;canvas.oncontextmenu=function(e){e.preventDefault()};ctx=canvas.getContext('2d');el_parent.appendChild(canvas);el_parent.appendChild(el_message);el_parent.appendChild(el_overlay);let TXT={LOAD:'Loading Game',EXECUTE:'Done loading',DLERROR:'Error while loading game data.\\nCheck your internet connection.',NOWEBGL:'Your browser or graphics card does not seem to support <a href="http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation">WebGL</a>.<br>Find out how to get it <a href="http://get.webgl.org/">here</a>.',};let Msg=function(m){ctx.clearRect(0,0,canvas.width,canvas.height);ctx.fillStyle='#888';for(var i=0,a=m.split('\\n'),n=a.length;i!=n;i++)ctx.fillText(a[i],20,20);};let Fail=function(m){el_parent.removeChild(el_overlay);el_message.innerHTML=TXT.NOWEBGL+(m?m:'')};let DoExecute=function(){Msg(TXT.EXECUTE);Module.canvas=canvas.cloneNode(!1);Module.canvas.oncontextmenu=function(e){e.preventDefault()};Module.setWindowTitle=function(title){};Module.postRun=function(){if(!Module.noExitRuntime){Fail();return};canvas.parentNode.replaceChild(Module.canvas,canvas);Txt=Msg=ctx=canvas=null;setTimeout(function(){if(use_canvas_size){el_parent.style.width=Module.canvas.widthNative+"px";el_parent.style.height=Module.canvas.heightNative+"px"};if(play_on_focus){Browser.mainLoop.pause();el_overlay.innerHTML=overlay_inner("Click to play");el_overlay.onclick=function(){el_parent.removeChild(el_overlay);Module.canvas.focus();Browser.mainLoop.resume()}}else{el_parent.removeChild(el_overlay);Module.canvas.focus()}},1)};Browser.requestAnimationFrame=function(f){window.requestAnimationFrame(f)};setTimeout(function(){Module.run(['/p'])},50)};let DoLoad=function(){Msg(TXT.LOAD);window.onerror=function(e,u,l){Fail(e+'<br>('+u+':'+l+')')};Module={ALLOW_MEMORY_GROWTH:1,TOTAL_MEMORY:1024*1024*${mem},TOTAL_STACK:1024*1024*${web_stack},currentScriptUrl:'-',preInit:DoExecute};var s=document.createElement('script'),d=document.documentElement;s.src=data_file;s.async=!0;game_loaded[data_file]=!0;s.onerror=function(e){el_parent.removeChild(el_overlay);d.removeChild(s);Msg(TXT.DLERROR);canvas.disabled=!1;game_loaded[data_file]=!1};d.appendChild(s)};DoLoad()}`;
`if (!game_loaded) var game_loaded = {};
if (!loadGame) var loadGame = function(data_file, div_id, play_on_focus, width, height, preload_image) {
if (game_loaded[data_file.split('.').slice(0, -1).join('.')]) return;
let use_canvas_size = !(width || height);
width = width || 800;
height = height || 600;
let el_parent, el_overlay, el_message, canvas, ctx;
el_parent = document.getElementById(div_id);
el_parent.setAttribute("style", "width:" + width + "px;height:" + height + "px;background:#485358;position:relative;overflow:hidden;background-position:center;"+(preload_image && preload_image != "" ? "background-image:url("+preload_image+");" : ""));
el_overlay = document.createElement("div");
el_overlay.setAttribute("style", "z-index:2;position:absolute;top:0;left:0;right:0;bottom:0;cursor:pointer;box-shadow: inset 0 0 5em 1em #000;");
let overlay_inner = function(t) {
return '<div style="text-align: center;position: absolute;top: 50%;left: 50%;transform: translate(-50%,-50%);font-size: 28px;font-family: Trebuchet MS;color: white;text-shadow: 0px 0px 1px black, 0px 0px 1px black, 0px 0px 1px black, 0px 0px 3px black;padding: 3px;user-select:none;">' + t + '</div>'
};
el_overlay.innerHTML = overlay_inner("Loading...");
el_message = document.createElement("div");
el_message.setAttribute("style", "z-index:3;position:absolute;top:0;left:0;outline:none;color:white;font-size:12px;text-shadow: 0px 0px 1px black, 0px 0px 1px black, 0px 0px 1px black, 0px 0px 3px black;padding:3px;");
canvas = document.createElement('canvas');
canvas.setAttribute("style", "z-index:1;position:absolute;left:0;right:0");
canvas.tabIndex = 1;
canvas.addEventListener('keydown', e => {
e.preventDefault();
return false;
});
canvas.width = width || 800;
canvas.height = height || 600;
canvas.oncontextmenu = function(e) {
e.preventDefault()
};
ctx = canvas.getContext('2d');
el_parent.appendChild(canvas);
el_parent.appendChild(el_message);
el_parent.appendChild(el_overlay);
let TXT = {
LOAD: 'Loading Game',
EXECUTE: 'Done loading',
DLERROR: 'Error while loading game data.\\nCheck your internet connection.',
NOWEBGL: 'Your browser or graphics card does not seem to support <a href="http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation">WebGL</a>.<br>Find out how to get it <a href="http://get.webgl.org/">here</a>.',
};
let Msg = function(m) {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = '#888';
for (var i = 0, a = m.split('\\n'), n = a.length; i != n; i++) ctx.fillText(a[i], 20, 20);
};
let Fail = function(m) {
el_parent.removeChild(el_overlay);
el_message.innerHTML = TXT.NOWEBGL + (m ? m : '')
};
let DoExecute = function() {
Msg(TXT.EXECUTE);
Module.canvas = canvas.cloneNode(!1);
Module.canvas.oncontextmenu = function(e) {
e.preventDefault()
};
Module.setWindowTitle = function(title) {};
Module.pauseMainLoop();
Module.postRun = function() {
if (!Module.noExitRuntime) {
Fail();
return
};
canvas.parentNode.replaceChild(Module.canvas, canvas);
Txt = Msg = ctx = canvas = null;
if (play_on_focus) {
Browser.mainLoop.pause();
}
setTimeout(function() {
if (use_canvas_size) {
el_parent.style.width = Module.canvas.widthNative + "px";
el_parent.style.height = Module.canvas.heightNative + "px"
};
if (play_on_focus) {
Browser.mainLoop.pause();
el_overlay.innerHTML = overlay_inner("Click to play");
el_overlay.onclick = function() {
el_overlay.innerHTML = overlay_inner("Loading...")
setTimeout(() => {
el_parent.removeChild(el_overlay);
Module.canvas.focus();
Browser.mainLoop.resume()
})
}
} else {
el_parent.removeChild(el_overlay);
Module.canvas.focus()
}
})
};
Browser.requestAnimationFrame = function(f) {
window.requestAnimationFrame(f)
};
setTimeout(function() {
Module.run(['/p'])
}, 50)
};
let DoLoad = function() {
Msg(TXT.LOAD);
window.onerror = function(e, u, l) {
Fail(e + '<br>(' + u + ':' + l + ')')
};
Module = {
ALLOW_MEMORY_GROWTH: 1,
TOTAL_MEMORY: 1024 * 1024 * ${mem},
TOTAL_STACK: 1024 * 1024 * ${web_stack},
currentScriptUrl: '-',
preInit: DoExecute
};
var s = document.createElement('script'),
d = document.documentElement;
s.src = data_file;
s.async = !0;
game_loaded[data_file] = !0;
s.onerror = function(e) {
el_parent.removeChild(el_overlay);
d.removeChild(s);
Msg(TXT.DLERROR);
canvas.disabled = !1;
game_loaded[data_file] = !1
};
d.appendChild(s)
};
DoLoad()
}`;

nwFS.readFile(love_path, "base64", (err, game_data) => {
if (err) console.error(err);
Expand Down
36 changes: 30 additions & 6 deletions engines/love2d/lua/blanke/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -898,6 +898,7 @@ do
Window.toggleFullscreen()
end
Input.keyCheck()
Audio.update(dt)
end
}
end
Expand Down Expand Up @@ -1814,6 +1815,8 @@ do
local defaults = {}
local sources = {}
local new_sources = {}
local play_queue = {}
local first_update = true

local opt = function(name, overrides)
if not defaults[name] then Audio(name, {}) end
Expand All @@ -1831,6 +1834,15 @@ do
table.update(defaults[store_name], new_tbl)
end
end;

update = function(dt)
if #play_queue > 0 then
for _, src in ipairs(play_queue) do
love.audio.play(src)
end
play_queue = {}
end
end;

source = function(name, options)
local o = opt(name)
Expand All @@ -1853,20 +1865,22 @@ do
local t_props = {'position','attenuationDistances','cone','direction','velocity','filter','effect','volumeLimits'}
for _,n in ipairs(props) do
if o[n] then
src['set'..string.upper(string.sub(n,1,1))..string.sub(n,2)](src,o[n])
src['set'..n:capitalize()](src,o[n])
end
end
for _,n in ipairs(t_props) do
if o[n] then src['set'..string.upper(string.sub(n,1,1))..string.sub(n,2)](src,unpack(o[n])) end
if o[n] then src['set'..n:capitalize()](src,unpack(o[n])) end
end
end
return src
end;

play = function(...)
local src_list = {}
for _,name in ipairs({...}) do table.insert(src_list, Audio.source(name)) end
love.audio.play(unpack(src_list))
for _,name in ipairs({...}) do
table.insert(src_list, Audio.source(name))
-- adds to play_queue so audio doesn't play in Game.load (before the game actually starts)
table.insert(play_queue, Audio.source(name))
end
if #src_list == 1 then return src_list[1]
else return src_list end
end;
Expand All @@ -1891,6 +1905,16 @@ do
return false
end;
}

local audio_fns = {'volume','velocity','position','orientation','effect','dopp'}
for _, fn in ipairs(audio_fns) do
local fn_capital = fn:capitalize()
Audio[fn] = function(...)
local args = {...}
if #args > 0 then love.audio['set'..fn_capital](...)
else return love.audio['get'..fn_capital]() end
end
end
end

--EFFECT
Expand Down Expand Up @@ -3463,7 +3487,7 @@ do
pady = 0;
load = function()
if not Blanke.loaded then
--Game.load()
love.joystick.loadGamepadMappings('gamecontrollerdb.txt')
Blanke.loaded = true
end
end;
Expand Down
21 changes: 11 additions & 10 deletions projects/dodgem/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,14 @@
"game_size": 3,
"window_size": 3,
"quick_access": [
[
"credits.txt=?",
"credits.txt"
],
[
"Add a text file=new+?",
"Add a text file"
],
[
"main.lua=script+entity+?",
"main.lua"
Expand All @@ -17,14 +25,6 @@
[
"Clear history=?",
"Clear history"
],
[
"View assets=?",
"View assets"
],
[
"main.lua=script+?",
"main.lua"
]
],
"autoplay_preview": true,
Expand All @@ -33,14 +33,15 @@
"name": "dodgem",
"filter": "nearest",
"vsync": "off",
"web_memory": 0,
"web_memory": 128,
"web_stack": 2,
"web_game_size": [
800,
600
],
"resizable": false,
"scale": true
"scale": true,
"web_preload_image": "https://miro.medium.com/max/1200/1*mk1-6aYaf_Bes1E3Imhc0A.jpeg"
},
"enabled_plugins": {
"xhh-array": false,
Expand Down
4 changes: 4 additions & 0 deletions projects/dodgem/credits.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Image Credits

bluerobot.png - https://www.deviantart.com/johncolburn/art/Blue-Robot-Player-Sprite-323813997
bomber_barbara.ogg - Sonic Rush (2005)
24 changes: 22 additions & 2 deletions projects/dodgem/main.lua
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,11 @@ Input.set({
down = { "down", "s", "dpdown" }
})

Audio('bomber_barbara.ogg', {name='main', looping=true, volume=0.2, type='stream'})
Audio('bomber_barbara.ogg', {name='main', looping=true, volume=0.05, type='stream'})

Ball = Entity("Ball",{
hitbox=true,
reaction="cross",
animations={ "ball" },
align="center"
})
Expand All @@ -24,6 +25,9 @@ Player = Entity("Player",{
hitbox=true,
animations={ "bluerobot" },
align="center",
collision=function(self, other)

end,
update = function(self, dt)
local d = 100
self.hspeed = 0
Expand All @@ -38,12 +42,28 @@ Player = Entity("Player",{
end
})

Dot = Entity("Dot",{
z=100,
draw = function(self)
Draw{
{'color','green'},
{'circle','fill',0,0,3},
{'color'}
}
end
})

Game{
background_color = "white",
load = function()
local ball1 = Ball{x=Game.width/2, y=Game.height/2, anim_frame=3}
Player({x=ball1.x + 20, y=Game.height/2})
Player{x=ball1.x, y=Game.height/2}

Dot{x=Game.width/2, y=Game.height/2}
Dot{x=ball1.x, y=Game.height/2}
Audio.play('main')

Audio.volume(0.05)
end
}

Expand Down
6 changes: 6 additions & 0 deletions src/less/markdown.less
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,13 @@
}
pre {
margin: 0px;
padding-right: 10px;

> code {
width: 100%;
}
}

blockquote {
border-left: 2px solid @ide-accent;
padding-left: 6px;
Expand Down

0 comments on commit cc9deda

Please sign in to comment.