角色扮演游戏,如何滑动世界(场景)
RPG, how to slide the world (scene)
你有没有在GameBoy上玩过口袋妖怪或塞尔达?当然是的,我正在尝试用画布制作塞尔达。这是我工作的链接:白戏
如您所见,您可以移动。实际上,当您按下一个键时,您的位置是修饰(+1或-1等...),并且我会在任何移动中重写所有地图。所以我们的印象是你做小眨眼,这不是我想要的。
我想要的是我的角色幻灯片下的地图,有一个流畅的运动翻译你知道吗?
我尝试过,translate(),重写所有在任何像素上构成世界的图像,但它是滞后的。
您可以在此处查看流体位移的示例:示例。这就是我想要的。
这是我的代码,它可能会帮助您了解它的实际工作原理:
window.onload = function(){
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
ctx.setGlobalAlpha;
var xPerso = 60;
var yPerso = 59;
var xCamera = xPerso-Math.round(nbCaseLongueur/2);
var yCamera = yPerso-Math.round(nbCaseHauteur/2);
setTimeout(function(){
initialiserMap(0);
ctx.drawImage(perso1, 0, 0, 17, 23, (Math.round(nbCaseLongueur/2))*32, (Math.round(nbCaseHauteur/2))*32-16, 32, 48);
}, 250);
function deplacementOk(sens){
var retour = false;
switch(sens){
case 1: // HAUT
if(map[yPerso-1][xPerso] == " ")
return true;
break;
case 2: // BAS
var bloc = map[yPerso+1][xPerso];
if(bloc == " " || bloc == "7" || bloc == "8")
return true;
break;
case 3: // DROITE
var bloc = map[yPerso][xPerso+1];
if(bloc == " " || bloc == "7" || bloc == "8")
return true;
break;
case 4: // GAUCHE
var bloc = map[yPerso][xPerso-1];
if(bloc == " " || bloc == "7" || bloc == "8")
return true;
break;
}
return retour;
}
onkeydown= function(e){
//alert(e.keyCode);
switch(e.keyCode){
case 38: // HAUT
case 90: // Z
if(deplacementOk(1)){
yCamera--;
yPerso--;
initialiserMap(1);
ctx.drawImage(perso2, 0, 0, 17, 23, (Math.round(nbCaseLongueur/2))*32, (Math.round(nbCaseHauteur/2))*32-16, 32, 48);
if(infoAffiche == true){
document.getElementById('boiteAInfoYPerso').innerHTML = "Position Y = "+yPerso+"<br/>";
}
}
break;
case 40: // BAS
case 83: // S
if(deplacementOk(2)){
yCamera++;
yPerso++;
initialiserMap(2);
ctx.drawImage(perso1, 0, 0, 17, 23, (Math.round(nbCaseLongueur/2))*32, (Math.round(nbCaseHauteur/2))*32-16, 32, 48);
if(infoAffiche == true){
document.getElementById('boiteAInfoYPerso').innerHTML = "Position Y = "+yPerso+"<br/>";
}
}
break;
case 68: // D
case 39: // DROITE
if(deplacementOk(3)){
xCamera++;
xPerso++;
initialiserMap(3);
ctx.drawImage(perso4, 0, 0, 17, 23, (Math.round(nbCaseLongueur/2))*32, (Math.round(nbCaseHauteur/2))*32-16, 32, 48);
if(infoAffiche == true){
document.getElementById('boiteAInfoXPerso').innerHTML = "Position X = "+xPerso+"<br/>";
}
}
break;
case 37: // GAUCHE
case 81: // Q
if(deplacementOk(4)){
xCamera--;
xPerso--;
initialiserMap(4);
ctx.drawImage(perso3, 0, 0, 17, 23, (Math.round(nbCaseLongueur/2))*32, (Math.round(nbCaseHauteur/2))*32-16, 32, 48);
if(infoAffiche == true){
document.getElementById('boiteAInfoXPerso').innerHTML = "Position X = "+xPerso+"<br/>";
}
}
break;
}
}
function translationMap(a,b){
ctx.save();
ctx.translate(a,b);
ctx.drawImage(canvas, 0, 0);
ctx.restore();
}
function animate() {
ctx.save();
setTimeout(function() {
animate();
// get the current image
// get the xy where the image will be drawn
var img=imgs[imageIndex];
var imgX=(canvas.width/2-img.width/2)*animPctComplete;
var imgY=(canvas.height/2)-img.height/2;
// set the current opacity
ctx.globalAlpha=animPctComplete;
// draw the image
ctx.clearRect(0,0,canvas.width,canvas.height);
ctx.drawImage(img,imgX,imgY);
// increment the animationPctComplete for next frame
animPctComplete+=.01; //100/fps;
// if the current animation is complete
// reset the animation with the next image
if(animPctComplete>=1.00){
animPctComplete=0.00;
imageIndex++;
if(imageIndex>=imgs.length){imageIndex=0;}
}
}, 1000 / fps);
}
animate();
function initialiserMap(sens){
for(var cpt=0;cpt<nbCaseHauteur;cpt++){
for(var cpt2=0;cpt2<nbCaseLongueur;cpt2++){
switch(map[yCamera+cpt][xCamera+cpt2]){
case " ":
ctx.drawImage(herbe, 0, 0, 32, 32, cpt2*32, cpt*32, 32, 32);
break;
case "#":
ctx.drawImage(wall1, 0, 0, 32, 32, cpt2*32, cpt*32, 32, 32);
break;
case "1":
ctx.drawImage(arbre1, 0, 0, 32, 32, cpt2*32, cpt*32, 32, 32);
break;
case "2":
ctx.drawImage(arbre2, 0, 0, 32, 32, cpt2*32, cpt*32, 32, 32);
break;
case "3":
ctx.drawImage(arbre3, 0, 0, 32, 32, cpt2*32, cpt*32, 32, 32);
break;
case "4":
ctx.drawImage(arbre4, 0, 0, 32, 32, cpt2*32, cpt*32, 32, 32);
break;
case "5":
ctx.drawImage(arbre5, 0, 0, 32, 32, cpt2*32, cpt*32, 32, 32);
break;
case "6":
ctx.drawImage(arbre6, 0, 0, 32, 32, cpt2*32, cpt*32, 32, 32);
break;
case "7":
ctx.drawImage(arbre7, 0, 0, 32, 32, cpt2*32, cpt*32, 32, 32);
break;
case "8":
ctx.drawImage(arbre8, 0, 0, 32, 32, cpt2*32, cpt*32, 32, 32);
break;
}
}
}
}
}
希望我给了你你需要帮助我的东西,相信我,当我说你之前我试过问你,也希望我不犯错误或任何错误的事情堆栈溢出规则。
谢谢大家。
我不是画布的专业人士,但也许您可以尝试使用 2 个画布。第一个你画世界,第二个你画你的角色。
世界的画布可以比你的舞台更大更宽一点。当你想要移动你的角色时,你可以尝试移动整个世界的画布。
关于此技术的一些有趣链接以及一些对您有用的链接:
- 通过分层优化 HTML5 画布呈现
- 提高 HTML5 画布性能
祝你的项目好运! :-)
相关文章:
- 当带有渲染器的DOM元素不在屏幕顶部时,移动了场景的坐标
- 通过拖动可以更改三维模型对象在Three.js场景中的位置
- 在OpenNI中将Zigfu关节位置从真实世界转换为类似投影的位置
- 如何制作一个在现实世界中看起来像镜子的屏幕
- 内容脚本是在同一个孤立的世界中运行,还是在不同的孤立世界中运行
- 将相机添加到Three.js中的场景的原因
- 使用tween.js围绕世界轴旋转对象
- 如何将Three.js场景中的几何体导出为已修改的OBJ
- 从Three.js场景中删除许多对象的速度较慢
- 是否可以从独立于摄影机的three.js场景中的一个点应用雾
- 如何在three.js中实现不同相机/场景之间的交叉渐变
- 用鼠标在threejs场景中移动对象
- 在同一窗口中添加多个世界时钟
- 我可以用JavaScript判断访问者是否'的语言环境遵循美国风格或世界其他地区's风格
- 世界的时钟并没有滴答作响
- iOS设备上CraftyJS的场景大小
- 哪些场景可能会使Chart.js's画布元素的大小
- 角色扮演游戏,如何滑动世界(场景)
- 三.js获取具有给定世界方向坐标的场景矢量的对象相对局部方向
- 如何确定确切的元素类型/代码段,在现实世界的单选按钮的场景