嘿,用过像素画板没有哦,相信喜欢绘画的小朋友会对它感兴趣呢,用来绘制像素画非常好看,有没有发现,它是可以用来绘制游戏地图的,是不是很好奇,来一起看看吧。
游戏地图
有个案例,绘制的游戏地图在以下两个游戏中都有用到,可以看一看这两篇文章
创建项目
这里用HBuilderX开发工具来创建一个uniapp项目,
例如项目名填写uniapp_map_edit
,依次选择如下图
初始页面
页面文件在项目里/pages/index/index.vue
,打开文件修改布局,
要在
<script>...</script>
标签中去写页面跳转javascript
逻辑代码,很简单,自己能做出来,这里就不讲
画板页面
然后打开,同样是在<template>
标签中修改,写好布局,显示页面如下图
- 复选框
checkbox-group
,checkbox
是控制是否显示绘制网格线的; - 7个迷你按钮
button size="mini"
,从中选择一个像素来绘制,每个像素点表示不同的颜色; - 像素点可以表示数字,例如
0,1,2,3,4...e,f
; - 游戏地图是用字节数字来表示的,占用内存少;
初始化数据
const app = getApp()
export default {
data() {
return {
isShowGrids: true, //是否显示网格
//所有按钮数据:文本,数值,颜色
buttons: [{
text: '0',
value: '0',
color: 'transparent'
},
//...
{
text: '6',
value: '6',
color: '#909399'
},
],
currentKey: '1' //定义选择的按钮,如不同的画笔按钮
};
},
/** 页面加载完毕会执行到这里 */
onReady() {
let {
map, //地图数据
cols //列数
} = app.getMapData() //获取初始页面保存好的数据
this.cols = cols
//执行加载初始化方法
this.load(map)
},
methods:{
//...
onTouchStart(e){...},
onTouchMove(e){...},
onTouchEnd(e){...},
}
}
初始化画布
load(map) {
const {
cols
} = this
uni.createSelectorQuery().select('#' + canvasId).fields({
size: true
}, res => {
//定义画布数据
this.canvasData = {
canvas: {
width: res.width,
height: res.height
},
ctx: uni.createCanvasContext(canvasId)
};
//调用初始化画布方法
this.initCanvas(map, cols || 24)
}).exec()
},
同样的,调用的initCanvas(map, cols)
方法也是在methods
里面写,代码如下
initCanvas(map, cols) {
const {
ctx,
canvas
} = this.canvasData
//计算出每个单元格大小
const size = Math.floor(canvas.width / cols)
//计算出铺满网格的行数
const rows = Math.floor(canvas.height / size)
//...
const grids = []
//...
// 绘制网格,r是行数,c是列数
for (let r = 0, i = 0; r < rows; r++) {
for (let c = 0; c < cols; c++, i++) {
let g = {
x: c * size + paddingLeft, //位置x paddingLeft是左边距
y: r * size + paddingTop,
//...
v: '0' //像素初始数据
}
//...
grids.push(g)
}
}
//将计算出的数据放到canvasData数据中,下次会读取到
Object.assign(this.canvasData, {
grids, //这是网格的数据
size,
//...
rows
})
//调用重新绘制方法
this.redraw()
},
触摸操作
看之前的代码,有如下三个方法,分别是触摸开始,移动,结束事件调用的方法,就在这方法中实现
export default {
//...
methods:{
//...
onTouchStart(e){...},
onTouchMove(e){...},
onTouchEnd(e){...},
}
}
onTouchStart(e) {
let touch1 = e.touches[0]
//调用此方法,根据第一个触摸点查找网格中单元格的索引
let index = this.findGridIndex(touch1);
//如果没有在网格内,就返回
if (index < 0) return;
//...这是第二个触摸点,如果有的话,就实现触摸拖动像素点,来达到准确绘制
let touch2 = e.touches[1]
//...省略了
//如果是点击,直接调用触摸移动方法即可,避免重复写
this.onTouchMove(e)
},
onTouchMove(e) {
//如果是同时存在两个触摸点,就是拖动操作
let isMove = e.touches.length > 1
let touch = isMove ? e.touches[1] : e.touches[0];
const {
grids
} = this.canvasData;
const {
currentKey
} = this;
if (isMove && this.selectGrids.grid) {
//...处理拖动操作的
}
let index = this.findGridIndex(touch);
if (index < 0) return;
let grid = grids[index];
//...
//更新指定的像素信息
Object.assign(grid, {
v: currentKey,
color: this.findCurrentColor(currentKey) //将数值转换为按钮对应的颜色方法
});
//调用重绘方法
this.redraw();
},
onTouchEnd(e) {
if (!e || e.touches.length > 0) return
//...触摸多点触摸操作的
},
绘制逻辑
redraw() {
const {
canvas,
ctx,
grids,
size,
rows,
cols
} = this.canvasData
const {
isShowGrids
} = this
//擦画板
ctx.clearRect(0, 0, canvas.width, canvas.height)
//设置画笔颜色
ctx.strokeStyle = '#000000'
ctx.fillStyle = '#ffffff'
//画背景色,如果想背景透明,就注释掉这一行
ctx.fillRect(0, 0, canvas.width, canvas.height)
//定义单元格的一半大小
let r = size / 2;
for (let r = 0; r < rows; r++) {
for (let c = 0; c < cols; c++) {
let g = grids[r * cols + c]
ctx.beginPath()
if (g.v != '0') {
//画颜色的
ctx.fillStyle = g.color
ctx.fillRect(g.x, g.y, size, size)
} else if (isShowGrids) {
//画网格的
ctx.strokeRect(g.x, g.y, size, size)
}
}
}
//最后调用这个方法就绘制出来了
ctx.draw(true)
},
看上面的方法是不是很简单,容易理解呢
运行项目
讲到这里,像素画板的小程序项目基本上就算做好了,可以编译运行,接下来看看效果
像素画
这是像素画,笔者画得好看吗 (^o^);
对画画感兴趣的话,就自己想象画出来也好看的
如果调整的像素太细的话,或者网格列数过多,这是不好控制的,
这样,就要用两个手指触摸操作,项目里实现多点触摸操作逻辑是有点复杂的,
实现操作就是用一个手指按住画板,另一个手指去拖动,就会发现按住的像素点拖出来了,继续拖动到指定的位置即可,这就准确绘制了
迷宫地图
从上图中可以看到画出来导出的一串数字,点击复制地图数据按钮,然后粘贴到自己编写的小游戏程序中当新关卡地图用,
还可以绘制出2d像素人,像素地图,瓦片地图等,能想到的你都能用得上吧
// 迷宫地图数据
const mapData1 = {
map:' 111111111111111111111111101100010001000000000001000101101010101110101111111010101101010100000101000000010101101010111111101011111110101101010000000100010000000001101011101110101111111111101101000101000101000000000101101110101011101111111110101100010001010100010000000101111011111010111010111111101100010100010001010000000001101110101110101011101111111100000101000101000101000001111011101111101110101111101100010100000100000100000001101110111111111111101111101100000100000001000101000001111110101111101110111011111100000101000001010000010001101111101011111011111010101100000001010000010001000101111111111010101110101111101100000000010101000100000001101111101110101111101111101100000100000100000101000001111111111111111110111111111'
cols: 27
}
想要项目源码在点这里查看下载,或者直接点这里搜索:像素画板,在本博客站内请放心下载,感谢支持!
原文地址:https://blog.csdn.net/zs1028/article/details/134723783
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_35926.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!