javascript-我的Web应用程序的画布绘图
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript-我的Web应用程序的画布绘图,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3381字,纯文字阅读大概需要5分钟。
内容图文
我刚开始在我的网络游戏项目中使用Canvas,但遇到了问题.
我正在使用以下代码来渲染游戏:
function render(f){
if(charoffset.x == null) charoffset.x = charpos.x*tilescale;
if(charoffset.y == null) charoffset.y = charpos.y*tilescale;
if(!tiles) tiles = [];
if(f){
log("Welcome.","gold");
}
var canPassthrough = function (){
if ((def.passable(this.type))&&(typeof this.type !== 'undefined')){
return true;
}
else {
return false;
}
};
if(!f) lighting.update();
canvas.getContext("2d").clearRect(0,0,sq,sq);
for (var i = 0; i < map[charlvl].length; i++){
if(!tiles[i]) tiles[i] = [];
for (var j = 0; j < map[charlvl][i].length; j++){
if(!tiles[i][j]) tiles[i][j] = placetile(i,j);
drawtile(tiles[i][j]);
placeitem(i,j);
}
}
ui.overlay.text("casting shadows...");
//shadowcaster(20);
var tex = document.createElement("img");
tex.src = "../img/charplaceholder.png";
var hero = canvas.getContext("2d");
hero.globalAlpha = 1.0;
if(charoffset.x>=map_scroll.x&&charoffset.y*tilescale>=map_scroll.y){
var pos = {
x: charoffset.x - map_scroll.x - tilescale,
y: charoffset.y - map_scroll.y - tilescale
};
hero.drawImage(tex,pos.x,pos.y,tilescale,tilescale);
}
function placetile(x,y){
var obj = {};
obj.type = map[charlvl][x][y].id;
obj.canPassthrough = canPassthrough;
obj.state = {explored: false, lit: false};
obj.coords = {x:x,y:y};
obj.offset = {x:x*tilescale,y:y*tilescale};
return obj;
}
function drawtile(t){
if(t.offset.x>=map_scroll.x&&t.offset.y>=map_scroll.y){
var pos = {
x: t.offset.x - map_scroll.x - tilescale,
y: t.offset.y - map_scroll.y - tilescale
};
if(!t.state.explored&&!t.state.lit){
return false;
}
else if(t.state.lit&&t.state.explored){
var tex = document.createElement("img");
var tile = canvas.getContext("2d");
tex.src = def.css.tile(t.type);
tile.globalAlpha = 1.0;
tile.drawImage(tex,pos.x,pos.y,tilescale,tilescale);
return true;
}
else if(t.state.explored&&!t.state.lit){
var tex = document.createElement("img");
var tile = canvas.getContext("2d");
tex.src = def.css.tile(t.type);
tile.globalAlpha = 0.25;
tile.drawImage(tex,pos.x,pos.y,tilescale,tilescale);
return true;
}
}
}
function placeitem(x,y){
return;
if (loot[charlvl][x][y]){
for(var i=0;i<loot[charlvl][x][y].length;i++){
var tile = document.createElement("div");
var tileid = loot[charlvl][x][y][i].type;
tile.className = def.css.item(tileid);
tile.coords = {x:x,y:y};
document.getElementById("x" + x + "y" + y).appendChild(tile);
}
}
}
if(f){
camera.center(charpos.x,charpos.y);
ui.overlay.text("loading the dungeon...");
ui.overlay.hide();
}
}
函数render()被各种事件触发,例如角色移动,地图拖动,灯光更新等.
结果如下:
我想在墙壁上添加嵌入式阴影,以便更清楚地看到那些是墙壁.我尝试使用画布上下文阴影进行实验,并使用了以下方法:
它应该为其绘制一个透明的矩形和一个阴影,尺寸分别为100、100和20、20,但这将阴影应用于每个绘制的图块.
我觉得我在用错绘画.谁能解释如何有效
用帆布达到想要的效果?
解决方法:
不要使用2D API阴影选项,它们的速度非常慢(这是对它们的严重程度的轻描淡写).您最好将阴影创建为图块集的一部分,并使用ctx.globalAlpha设置为小于1和/或使用多种复合模式之一来渲染它们.例如ctx.globalCompositeOperation =“ multiply”;或叠加,颜色加深,强光和柔光.您甚至可以结合使用以获得非常好的阴影效果.
将阴影创建为图块集的一部分将产生更加逼真的效果,因为阴影API仅适用于从漂浮在平面上方的平面对象投射的阴影,而不适用于从屏幕突出的3D对象(z方向可能有倾斜的边)方向.
如果您不希望将阴影创建为图块集的一部分,请考虑通过阴影API选项使用屏幕外画布在onload时创建阴影图块集.然后使用Alpha和Composite选项将其从渲染到画布
内容总结
以上是互联网集市为您收集整理的javascript-我的Web应用程序的画布绘图全部内容,希望文章能够帮你解决javascript-我的Web应用程序的画布绘图所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。