- 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/
猫f1.txt阿曼维沙尔阿杰贾伊维杰拉胡尔曼尼什肖比特批评塔夫林现在输出应该符合上面给定的条件 最佳答案 您可以在文件读取循环中设置一个计数器并打印它, 计数=0 读取行时做 让我们数一数++ if
我正在尝试查找文件 1 和文件 2 中的共同行。如果公共(public)行存在,我想写入文件 2 中的行,否则打印文件 1 中的非公共(public)行。fin1 和 fin2 是这里的文件句柄。它读
我有这个 SQL 脚本: CREATE TABLE `table_1` ( `IDTable_1` int(11) NOT NULL, PRIMARY KEY (`IDTable_1`) );
我有 512 行要插入到数据库中。我想知道提交多个插入内容是否比提交一个大插入内容有任何优势。例如 1x 512 行插入 -- INSERT INTO mydb.mytable (id, phonen
如何从用户中选择user_id,SUB(row, row - 1),其中user_id=@userid我的表用户,id 为 1、3、4、10、11、23...(不是++) --id---------u
我曾尝试四处寻找解决此问题的最佳方法,但我找不到此类问题的任何先前示例。 我正在构建一个基于超本地化的互联网购物中心,该区域分为大约 3000 个区域。每个区域包含大约 300 个项目。它们是相似的项
preg_match('|phpVersion = (.*)\n|',$wampConfFileContents,$result); $phpVersion = str_replace('"','',
我正在尝试创建一个正则表达式,使用“搜索并替换全部”删除 200 个 txt 文件的第一行和最后 10 行 我尝试 (\s*^(\h*\S.*)){10} 删除包含的前 10 行空白,但效果不佳。 最
下面的代码从数据库中获取我需要的信息,但没有打印出所有信息。首先,我知道它从表中获取了所有正确的信息,因为我已经在 sql Developer 中尝试过查询。 public static void m
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我试图在两个表中插入记录,但出现异常。您能帮我解决这个问题吗? 首先我尝试了下面的代码。 await _testRepository.InsertAsync(test); await _xyzRepo
这个基本的 bootstrap CSS 显示 1 行 4 列: Text Text Text
如果我想从表中检索前 10 行,我将使用以下代码: SELECT * FROM Persons LIMIT 10 我想知道的是如何检索前 10 个结果之后的 10 个结果。 如果我在下面执行这段代码,
今天我开始使用 JexcelApi 并遇到了这个:当您尝试从特定位置获取元素时,不是像您通常期望的那样使用sheet.getCell(row,col),而是使用sheet.getCell(col,ro
我正在尝试在我的网站上开发一个用户个人资料系统,其中包含用户之前发布的 3 个帖子。我可以让它选择前 3 条记录,但它只会显示其中一条。我是不是因为凌晨 2 点就想编码而变得愚蠢? query($q)
我在互联网上寻找答案,但找不到任何答案。 (我可能问错了?)我有一个看起来像这样的表: 我一直在使用查询: SELECT title, date, SUM(money) FROM payments W
我有以下查询,我想从数据库中获取 100 个项目,但 host_id 多次出现在 urls 表中,我想每个 host_id 从该表中最多获取 10 个唯一行。 select * from urls j
我的数据库表中有超过 500 行具有特定日期。 查询特定日期的行。 select * from msgtable where cdate='18/07/2012' 这将返回 500 行。 如何逐行查询
我想使用 sed 从某一行开始打印 n 行、跳过 n 行、打印 n 行等,直到文本文件结束。例如在第 4 行声明,打印 5-9,跳过 10-14,打印 15-19 等 来自文件 1 2 3 4 5 6
我目前正在执行验证过程来检查用户的旧密码,但问题是我无法理解为什么我的查询返回零行,而预期它有 1 行。另一件事是,即使我不将密码文本转换为 md5,哈希密码仍然得到正确的答案,但我不知道为什么会发生
我是一名优秀的程序员,十分优秀!