javascript - 使用 Javascript 创建一个非常大的可滚动(通过按住鼠标右键)Canvas
问题描述
我已经为此苦苦挣扎了很长时间(6个月以上)。我的问题有一些部分答案,但我无法将可用的答案位放在一起,以便能够用它做任何有用的事情。对于所有有抱负的简单画布游戏新开发者来说,这段代码将是一个了不起的工具,并且肯定会极大地造福于社区。
- 我需要创建一个非常大的可滚动画布(通过按住鼠标右键滚动),类似于:https ://www.desmos.com/calculator ,比如说 50k px x 50k px,这个(大小)应该可以修改代码。
-当我们滚动时,背景会移动,当然所有项目都需要随着滚动而移动。
- 代码中必须有一些滚动率的度量,这应该是可修改的。
- 渲染结构需要保持在我的代码笔中 - 在屏幕上生成简单的构造函数对象,然后使用请求动画帧进行渲染。 https://codepen.io/alexhermanuk/pen/bGGXLZG
var squares = [];
var Square = function(x,y,w,h,color){
this.x = x;
this.y = y;
this.w = w;
this.h = h;
this.color = color;
}
Square.prototype.update = function(){
this.draw();
}
Square.prototype.draw = function(){
context.save();
context.beginPath();
context.fillStyle = this.color;
context.fillRect(this.x,this.y,this.w,this.h)
context.closePath();
context.restore();
}
for(var i=0; i<10; i++){
squares.push(new Square(width*Math.random(),height*Math.random(),100,100,"red"));
}
function animateEverything(){
context.clearRect(0,0,width,height);
context.save()
squares.forEach(Square => {Square.update(squares)})
requestAnimationFrame(animateEverything);
}
animateEverything();
}
- 画布/可滚动区域需要全屏无溢出
- 画布背景将包含 4 个几乎相同的方形图像(2 个主图像和 2 个镜像),当我们左右滚动时,这些图像被渲染/复制为背景,并将创建无限的背景图像(在我们的例子中是只是波涛汹涌的海洋)。所以,这些必须像某种瓦片地图一样在逻辑上呈现......没有简单的方法来提供示例图像,所以请带上你的。
我感谢您的努力,并提前感谢所有人。
解决方案
干得好。它通过“右键单击”拖动滚动。
我不确定你所说的滚动率是什么意思。您想要显示或控制滚动速率吗?无论如何,为了安全起见,我都做了。scrollRate
控件的滚动速度很快,默认为 1。scrollMeter
是一个粗略地表示画布滚动速度的数字。它印在画布的左上角。
关于平铺,我做了一个 BackgoundTile 类。您可以创建 4 个不同的瓷砖x, y
,并x_gap, y_gap
拥有您想要的。但是,如果您关心性能,而不是制作 4 个平铺对象,只需使用一个组合图像即可。如果可能,使用图像编辑器将 4 个正方形组合成一个大正方形。平铺几乎总是一项性能繁重的工作,一些优化还有很长的路要走。
我还添加了一个窗口/画布调整大小处理程序,因此纵横比不会失控。当您放大窗口/画布时,这也可以防止画布变为低分辨率。
我animateEverything
原样离开,但我建议为渲染添加更多控制,而不是无限期地递归调用它。
我希望你喜欢这个演示。
推荐阅读
- php - 类型提示返回类型时:self和ClassName之间的区别
- asp.net-mvc - 如何在 dotNet Core 中获取 Route 属性的值
- python - 使用 SQLAlchemy 基于所有权或组成员身份的声明性关系表示
- amazon-dynamodb - 如何使用 DocumentClient.get 在 Amazons DynamoDB 中按非主键属性查询表
- python - 是否可以使用 Python 中的一个 .append 语句将多个单独的元素添加到列表中?
- google-analytics - 跟踪 Google Analytics 增强型电子商务的结帐步骤
- postgresql - 为什么 psql 在尝试使用 pgbouncer 连接时要求输入密码
- facebook-messenger - 在 javascript 中打开带有来自 url 的欢迎消息的 fb messenger
- twitter-bootstrap - Bootstrap 4表单列在一行中的另一列下方排列
- angular - Angular 5 应用程序适用于 prod 构建,但不适用于 dev 构建