- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 HTML5 Canvas 元素上绘制随机网格,我已经能够很好地实现网格,但我无法在网格上随机生成图 block 。他们最终只是一遍又一遍地重复同一行或交错重复。我已在此处包含了当前代码的结果图像:https://drive.google.com/open?id=1xK37qhP3TeDeAG32oPxeG7dMq6kcsxm3
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>New Isometric Game Test With Canvas</title>
<link rel="stylesheet" href="css/style.css" />
<script src="js/jquery-2.1.1.js"></script>
<script>
var IsometricMap = new Object();
IsometricMap.tiles = [
// "images/dirt.png",
"images/dirtHigh.png", // 0
"images/grass.png", // 1
"images/water.png", // 2
"images/waterBeachCornerEast.png", // 3
"images/waterBeachCornerNorth.png", // 4
"images/waterBeachCornerSouth.png", // 5
"images/waterBeachCornerWest.png", // 6
"images/waterBeachEast.png", // 7
"images/waterBeachNorth.png", // 8
"images/waterBeachSouth.png", // 9
"images/waterBeachWest.png", // 10
"images/waterCornerEast.png", // 11
"images/waterCornerNorth.png", // 12
"images/waterCornerSouth.png", // 13
"images/waterCornerWest.png", // 14
"images/waterEast.png", // 15
"images/waterNorth.png", // 16
"images/waterSouth.png", // 17
"images/waterWest.png", // 18
"images/bridgeEast.png", // 19
"images/bridgeNorth.png", // 20
"images/crossroad.png", // 21
// "images/hillCornerEast.png",
// "images/hillCornerNW.png",
// "images/hillCornerSE.png",
// "images/hillCornerWest.png",
// "images/hillEast.png",
// "images/hillNorth.png",
// "images/hillRoadEast.png",
// "images/hillRoadNorth.png",
// "images/hillRoadSouth.png",
// "images/hillRoadWest.png",
// "images/hillSouth.png",
// "images/hillWest.png",
"images/lot.png", // 22
"images/lotCornerEast.png", // 23
"images/lotCornerNorth.png", // 24
"images/lotCornerSouth.png", // 25
"images/lotCornerWest.png", // 26
"images/lotEast.png", // 27
"images/lotExitEast.png", // 28
"images/lotExitNorth.png", // 29
"images/lotExitSouth.png", // 30
"images/lotExitWest.png", // 31
"images/lotNorth.png", // 32
"images/lotPark.png", // 33
"images/lotSouth.png", // 34
"images/lotWest.png", // 35
"images/roadCornerES.png", // 36
"images/roadCornerNE.png", // 37
"images/roadCornerNW.png", // 38
"images/roadCornerWS.png", // 39
"images/roadEast.png", // 40
"images/roadEndEast.png", // 41
"images/roadEndNorth.png", // 42
"images/roadEndSouth.png", // 43
"images/roadEndWest.png", // 44
"images/roadNorth.png", // 45
"images/roadTEast.png", // 46
"images/roadTNorth.png", // 47
"images/roadTSouth.png", // 48
"images/roadTWest.png"]; // 49
var blockcount = (Math.floor(Math.random() * 5) + 1) * 2;
var bigblockcount = blockcount * blockcount;
var columngen = new Array();
IsometricMap.map = new Array();
var i=0;
while(i < (bigblockcount)) {
var numberoftiles = IsometricMap.tiles.length;
var terrainrandoms = (Math.floor(Math.random() * numberoftiles) + 0);
columngen.push(terrainrandoms);
i++;
}
x=0;
while (x < blockcount) {
var chunk = columngen.slice(x, x+blockcount);
var randomchunk = chunk[Math.floor(Math.random() * chunk.length)];
IsometricMap.map.push(chunk);
x++;
}
alert("Line 1 = " + IsometricMap.map[0] + " Line 2 = " + IsometricMap.map[1] + " Line 3 = " + IsometricMap.map[2] + " Blockcount = " + blockcount);
// A simple isometric tile renderer
var Isometric = {
tileColumnOffset: 100, // pixels
tileRowOffset: 50, // pixels
originX: 0, // offset from left
originY: 0, // offset from top
Xtiles: 0, // Number of tiles in X-dimension
Ytiles: 0, // Number of tiles in Y-dimension
selectedTileX: -1,
selectedTileY: -1,
context: undefined,
canvas: undefined,
tileImages: undefined,
showCoordinates: false,
load: function() {
this.tileImages = new Array();
var loadedImages = 0;
var totalImages = IsometricMap.tiles.length;
// Load all the images before we run the app
var self = this;
for(var i = 0; i < IsometricMap.tiles.length; i++) {
this.tileImages[i] = new Image();
this.tileImages[i].onload = function() {
if(++loadedImages >= totalImages) {
self.run();
}
};
this.tileImages[i].src = IsometricMap.tiles[i];
}
},
run: function() {
this.canvas = $('#isocanvas');
this.context = this.canvas[0].getContext("2d");
this.Xtiles = IsometricMap.map.length;
this.Ytiles = IsometricMap.map[0].length;
var self = this;
$(window).on('resize', function(){
self.updateCanvasSize();
self.redrawTiles();
});
$(window).on('mousemove', function(e) {
e.pageX = e.pageX - self.tileColumnOffset / 2 - self.originX;
e.pageY = e.pageY - self.tileRowOffset / 2 - self.originY;
tileX = Math.round(e.pageX / self.tileColumnOffset - e.pageY / self.tileRowOffset);
tileY = Math.round(e.pageX / self.tileColumnOffset + e.pageY / self.tileRowOffset);
self.selectedTileX = tileX;
self.selectedTileY = tileY;
self.redrawTiles();
// console.log(self.selectedTileX + ", " + self.selectedTileY);
});
$(window).on('click', function() {
self.showCoordinates = !self.showCoordinates;
self.redrawTiles();
});
this.updateCanvasSize();
this.redrawTiles();
},
updateCanvasSize: function() {
var width = $(window).width();
var height = $(window).height();
this.context.canvas.width = width;
this.context.canvas.height = height;
this.originX = width / 2 - this.Xtiles * this.tileColumnOffset / 2;
this.originY = height / 2;
},
redrawTiles: function() {
this.context.canvas.width = this.context.canvas.width;
for(var Xi = (this.Xtiles - 1); Xi >= 0; Xi--) {
for(var Yi = 0; Yi < this.Ytiles; Yi++) {
this.drawTile(Xi, Yi);
}
}
this.drawDiamond(this.selectedTileX, this.selectedTileY, 'yellow');
if(this.showCoordinates && this.isCursorOnMap()) {
this.context.fillStyle = 'yellow';
var idx = IsometricMap.map[this.selectedTileX][this.selectedTileY];
this.context.font = '14pt Arial';
this.context.fillText(IsometricMap.tiles[idx].replace("/assets/tiles/",""), 20, 30);
}
},
isCursorOnMap: function() {
return (this.selectedTileX >= 0 && this.selectedTileX < this.Xtiles &&
this.selectedTileY >= 0 && this.selectedTileY < this.Ytiles);
},
drawTile: function(Xi, Yi) {
var offX = Xi * this.tileColumnOffset / 2 + Yi * this.tileColumnOffset / 2 + this.originX;
var offY = Yi * this.tileRowOffset / 2 - Xi * this.tileRowOffset / 2 + this.originY;
var imageIndex = IsometricMap.map[Xi][Yi];
this.context.drawImage(this.tileImages[imageIndex], offX, offY);
if(this.showCoordinates) {
this.context.fillStyle = 'orange';
this.context.fillText(Xi + ", " + Yi, offX + this.tileColumnOffset/2 - 9, offY + this.tileRowOffset/2 + 3);
}
},
drawDiamond: function(Xi, Yi, color) {
var offX = Xi * this.tileColumnOffset / 2 + Yi * this.tileColumnOffset / 2 + this.originX;
var offY = Yi * this.tileRowOffset / 2 - Xi * this.tileRowOffset / 2 + this.originY;
this.drawLine(offX, offY + this.tileRowOffset / 2, offX + this.tileColumnOffset / 2, offY, color);
this.drawLine(offX + this.tileColumnOffset / 2, offY, offX + this.tileColumnOffset, offY + this.tileRowOffset / 2, color);
this.drawLine(offX + this.tileColumnOffset, offY + this.tileRowOffset / 2, offX + this.tileColumnOffset / 2, offY + this.tileRowOffset, color);
this.drawLine(offX + this.tileColumnOffset / 2, offY + this.tileRowOffset, offX, offY + this.tileRowOffset / 2, color);
},
drawLine: function(x1, y1, x2, y2, color) {
color = typeof color !== 'undefined' ? color : 'white';
this.context.strokeStyle = color;
this.context.beginPath();
this.context.lineWidth = 1;
this.context.moveTo(x1, y1);
this.context.lineTo(x2, y2);
this.context.stroke();
},
};
</script>
<script>$(function() { Isometric.load() });</script>
</head>
<body>
<canvas id="isocanvas" width="1000" height="1000">
Your browser doesn't include support for the canvas tag.
</canvas>
</body>
</html>
var IsometricMap = new Object();
IsometricMap.tiles = [
// "images/dirt.png",
"images/dirtHigh.png", // 0
"images/grass.png", // 1
"images/water.png", // 2
"images/waterBeachCornerEast.png", // 3
"images/waterBeachCornerNorth.png", // 4
"images/waterBeachCornerSouth.png", // 5
"images/waterBeachCornerWest.png", // 6
"images/waterBeachEast.png", // 7
"images/waterBeachNorth.png", // 8
"images/waterBeachSouth.png", // 9
"images/waterBeachWest.png", // 10
"images/waterCornerEast.png", // 11
"images/waterCornerNorth.png", // 12
"images/waterCornerSouth.png", // 13
"images/waterCornerWest.png", // 14
"images/waterEast.png", // 15
"images/waterNorth.png", // 16
"images/waterSouth.png", // 17
"images/waterWest.png", // 18
"images/bridgeEast.png", // 19
"images/bridgeNorth.png", // 20
"images/crossroad.png", // 21
// "images/hillCornerEast.png",
// "images/hillCornerNW.png",
// "images/hillCornerSE.png",
// "images/hillCornerWest.png",
// "images/hillEast.png",
// "images/hillNorth.png",
// "images/hillRoadEast.png",
// "images/hillRoadNorth.png",
// "images/hillRoadSouth.png",
// "images/hillRoadWest.png",
// "images/hillSouth.png",
// "images/hillWest.png",
"images/lot.png", // 22
"images/lotCornerEast.png", // 23
"images/lotCornerNorth.png", // 24
"images/lotCornerSouth.png", // 25
"images/lotCornerWest.png", // 26
"images/lotEast.png", // 27
"images/lotExitEast.png", // 28
"images/lotExitNorth.png", // 29
"images/lotExitSouth.png", // 30
"images/lotExitWest.png", // 31
"images/lotNorth.png", // 32
"images/lotPark.png", // 33
"images/lotSouth.png", // 34
"images/lotWest.png", // 35
"images/roadCornerES.png", // 36
"images/roadCornerNE.png", // 37
"images/roadCornerNW.png", // 38
"images/roadCornerWS.png", // 39
"images/roadEast.png", // 40
"images/roadEndEast.png", // 41
"images/roadEndNorth.png", // 42
"images/roadEndSouth.png", // 43
"images/roadEndWest.png", // 44
"images/roadNorth.png", // 45
"images/roadTEast.png", // 46
"images/roadTNorth.png", // 47
"images/roadTSouth.png", // 48
"images/roadTWest.png"]; // 49
var blockcount = (Math.floor(Math.random() * 5) + 1) * 2;
var bigblockcount = blockcount * blockcount;
var columngen = new Array();
IsometricMap.map = new Array();
var i=0;
while(i < (bigblockcount)) {
var numberoftiles = IsometricMap.tiles.length;
var terrainrandoms = (Math.floor(Math.random() * numberoftiles) + 0);
columngen.push(terrainrandoms);
i++;
}
x=0;
while (x < blockcount) {
var chunk = columngen.slice(x, x+blockcount);
var randomchunk = chunk[Math.floor(Math.random() * chunk.length)];
IsometricMap.map.push(chunk);
x++;
}
alert("Line 1 = " + IsometricMap.map[0] + " Line 2 = " + IsometricMap.map[1] + " Line 3 = " + IsometricMap.map[2] + " Blockcount = " + blockcount);
// A simple isometric tile renderer
var Isometric = {
tileColumnOffset: 100, // pixels
tileRowOffset: 50, // pixels
originX: 0, // offset from left
originY: 0, // offset from top
Xtiles: 0, // Number of tiles in X-dimension
Ytiles: 0, // Number of tiles in Y-dimension
selectedTileX: -1,
selectedTileY: -1,
context: undefined,
canvas: undefined,
tileImages: undefined,
showCoordinates: false,
load: function() {
this.tileImages = new Array();
var loadedImages = 0;
var totalImages = IsometricMap.tiles.length;
// Load all the images before we run the app
var self = this;
for(var i = 0; i < IsometricMap.tiles.length; i++) {
this.tileImages[i] = new Image();
this.tileImages[i].onload = function() {
if(++loadedImages >= totalImages) {
self.run();
}
};
this.tileImages[i].src = IsometricMap.tiles[i];
}
},
run: function() {
this.canvas = $('#isocanvas');
this.context = this.canvas[0].getContext("2d");
this.Xtiles = IsometricMap.map.length;
this.Ytiles = IsometricMap.map[0].length;
var self = this;
$(window).on('resize', function(){
self.updateCanvasSize();
self.redrawTiles();
});
$(window).on('mousemove', function(e) {
e.pageX = e.pageX - self.tileColumnOffset / 2 - self.originX;
e.pageY = e.pageY - self.tileRowOffset / 2 - self.originY;
tileX = Math.round(e.pageX / self.tileColumnOffset - e.pageY / self.tileRowOffset);
tileY = Math.round(e.pageX / self.tileColumnOffset + e.pageY / self.tileRowOffset);
self.selectedTileX = tileX;
self.selectedTileY = tileY;
self.redrawTiles();
// console.log(self.selectedTileX + ", " + self.selectedTileY);
});
$(window).on('click', function() {
self.showCoordinates = !self.showCoordinates;
self.redrawTiles();
});
this.updateCanvasSize();
this.redrawTiles();
},
updateCanvasSize: function() {
var width = $(window).width();
var height = $(window).height();
this.context.canvas.width = width;
this.context.canvas.height = height;
this.originX = width / 2 - this.Xtiles * this.tileColumnOffset / 2;
this.originY = height / 2;
},
redrawTiles: function() {
this.context.canvas.width = this.context.canvas.width;
for(var Xi = (this.Xtiles - 1); Xi >= 0; Xi--) {
for(var Yi = 0; Yi < this.Ytiles; Yi++) {
this.drawTile(Xi, Yi);
}
}
this.drawDiamond(this.selectedTileX, this.selectedTileY, 'yellow');
if(this.showCoordinates && this.isCursorOnMap()) {
this.context.fillStyle = 'yellow';
var idx = IsometricMap.map[this.selectedTileX][this.selectedTileY];
this.context.font = '14pt Arial';
this.context.fillText(IsometricMap.tiles[idx].replace("/assets/tiles/",""), 20, 30);
}
},
isCursorOnMap: function() {
return (this.selectedTileX >= 0 && this.selectedTileX < this.Xtiles &&
this.selectedTileY >= 0 && this.selectedTileY < this.Ytiles);
},
drawTile: function(Xi, Yi) {
var offX = Xi * this.tileColumnOffset / 2 + Yi * this.tileColumnOffset / 2 + this.originX;
var offY = Yi * this.tileRowOffset / 2 - Xi * this.tileRowOffset / 2 + this.originY;
var imageIndex = IsometricMap.map[Xi][Yi];
this.context.drawImage(this.tileImages[imageIndex], offX, offY);
if(this.showCoordinates) {
this.context.fillStyle = 'orange';
this.context.fillText(Xi + ", " + Yi, offX + this.tileColumnOffset/2 - 9, offY + this.tileRowOffset/2 + 3);
}
},
drawDiamond: function(Xi, Yi, color) {
var offX = Xi * this.tileColumnOffset / 2 + Yi * this.tileColumnOffset / 2 + this.originX;
var offY = Yi * this.tileRowOffset / 2 - Xi * this.tileRowOffset / 2 + this.originY;
this.drawLine(offX, offY + this.tileRowOffset / 2, offX + this.tileColumnOffset / 2, offY, color);
this.drawLine(offX + this.tileColumnOffset / 2, offY, offX + this.tileColumnOffset, offY + this.tileRowOffset / 2, color);
this.drawLine(offX + this.tileColumnOffset, offY + this.tileRowOffset / 2, offX + this.tileColumnOffset / 2, offY + this.tileRowOffset, color);
this.drawLine(offX + this.tileColumnOffset / 2, offY + this.tileRowOffset, offX, offY + this.tileRowOffset / 2, color);
},
drawLine: function(x1, y1, x2, y2, color) {
color = typeof color !== 'undefined' ? color : 'white';
this.context.strokeStyle = color;
this.context.beginPath();
this.context.lineWidth = 1;
this.context.moveTo(x1, y1);
this.context.lineTo(x2, y2);
this.context.stroke();
},
};
我想要真正随机的图 block 。这与我需要嵌套这些数组之一有关系吗?请帮忙。提前致谢。
最佳答案
我认为你把事情想得太复杂了。这是获取随机索引网格的简单方法。
<小时/>一维数组
const width=5, depth=5, ntiles=10;
let map = Array(width*depth).fill().map(_=>Math.floor(Math.random()*ntiles))
console.log(map)
二维数组
const width=5, depth=5, ntiles=10;
let generate_row = _=> Array(depth).fill().map(_=>Math.floor(Math.random()*ntiles))
let map = Array(width).fill().map(generate_row)
console.log(map)
关于javascript - 如何在网格上为 HTML5 Canvas 创建随机行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56554073/
前言: 有时候,一个数据库有多个帐号,包括数据库管理员,开发人员,运维支撑人员等,可能有很多帐号都有比较大的权限,例如DDL操作权限(创建,修改,删除存储过程,创建,修改,删除表等),账户多了,管理
所以我用 Create React App 创建并设置了一个大型 React 应用程序。最近我们开始使用 Storybook 来处理和创建组件。它很棒。但是,当我们尝试运行或构建应用程序时,我们不断遇
遵循我正在创建的控件的代码片段。这个控件用在不同的地方,变量也不同。 我正在尝试编写指令来清理代码,但在 {{}} 附近插入值时出现解析错误。 刚接触 Angular ,无法确定我错过了什么。请帮忙。
我正在尝试创建一个 image/jpeg jax-rs 提供程序类,它为我的基于 post rest 的 Web 服务创建一个图像。我无法制定请求来测试以下内容,最简单的测试方法是什么? @POST
我一直在 Windows 10 的模拟器中练习 c。后来我改用dev C++ IDE。当我在 C 中使用 FILE 时。创建的文件的名称为 test.txt ,而我给出了其他名称。请帮助解决它。 下面
当我们创建自定义 View 时,我们将 View 文件的所有者设置为自定义类,并使用 initWithFrame 或 initWithCode 对其进行实例化。 当我们创建 customUITable
我正在尝试为函数 * Producer 创建一个线程,但用于创建线程的行显示错误。我为这句话加了星标,但我无法弄清楚它出了什么问题...... #include #include #include
今天在做项目时,遇到了需要创建JavaScript对象的情况。所以Bing了一篇老外写的关于3种创建JavaScript对象的文章,看后跟着打了一遍代码。感觉方法挺好的,在这里与大家分享一下。 &
我正在阅读将查询字符串传递给 Amazon 的 S3 以进行身份验证的文档,但似乎无法理解 StringToSign 的创建和使用方式。我正在寻找一个具体示例来说明 (1) 如何构造 String
前言:我对 C# 中任务的底层实现不太了解,只了解它们的用法。为我在下面屠宰的任何东西道歉: 对于“我怎样才能开始一项任务但不等待它?”这个问题,我找不到一个好的答案。在 C# 中。更具体地说,即使任
我有一个由一些复杂的表达式生成的 ILookup。假设这是按姓氏查找人。 (在我们简单的世界模型中,姓氏在家庭中是唯一的) ILookup families; 现在我有两个对如何构建感兴趣的查询。 首
我试图创建一个 MSI,其中包含 和 exe。在 WIX 中使用了捆绑选项。这样做时出错。有人可以帮我解决这个问题。下面是代码: 错误 error LGH
在 Yii 中,Create 和 Update 通常使用相同的形式。因此,如果我在创建期间有电子邮件、密码、...other_fields...等字段,但我不想在更新期间专门显示电子邮件和密码字段,但
上周我一直在努力创建一个给定一行和一列的 QModelIndex。 或者,我会满足于在已经存在的 QModelIndex 中更改 row() 的值。 任何帮助,将不胜感激。 编辑: QModelInd
出于某种原因,这不起作用: const char * str_reset_command = "\r\nReset"; const char * str_config_command = "\r\nC
现在,我有以下由 original.df %.% group_by(Category) %.% tally() %.% arrange(desc(n)) 创建的 data.frame。 DF 5),
在今天之前,我使用/etc/vim/vimrc来配置我的vim设置。今天,我想到了创建.vimrc文件。所以,我用 touch .vimrc cat /etc/vim/vimrc > .vimrc 所
我可以创建一个 MKAnnotation,还是只读的?我有坐标,但我发现使用 setCooperative 手动创建 MKAnnotation 并不容易。 想法? 最佳答案 MKAnnotation
在以下代码中,第一个日志语句按预期显示小数,但第二个日志语句记录 NULL。我做错了什么? NSDictionary *entry = [[NSDictionary alloc] initWithOb
我正在使用与此类似的代码动态添加到数组; $arrayF[$f+1][$y][$x+1] = $value+1; 但是我在错误报告中收到了这个: undefined offset :1 问题:尝试创
我是一名优秀的程序员,十分优秀!