小游戏中绘制图片 - 绘制游戏背景

HTML Canvas 如果要绘制一张图片,可以使用 drawImage() 方法,例如我们在屏幕左上角绘制如下图片

图片地址为: https://www.twle.cn/static/i/meimei_160x160.png

可以使用下面的方法

var c   = document.getElementById("canvas");
var ctx = c.getContext("2d");
var img = document.createElement("img");

img.onload = function() {
    ctx.drawImage(this, 50, 50);
}
img.src = "https://www.twle.cn/static/i/meimei_160x160.png";

微信小游戏中也使用 drawImage() 方法来绘制图片,但它获取图片数据的方法却有差别

小游戏绘制图片

在微信中绘制图片,必须使用 wx.createImage() 来创建一个图片对象,然后再设置图片对象的 onload 事件和 src 属性

wx.createImage() 语法

Image wx.createImage()

创建一个图片对象

返回值

Image 图片对象

微信中的图像地址 src 可以是一张本地图片,也可以是一张网络图片

所以在微信中绘制图片的一般方法为

var c = wx.createCanvas();
var ctx = c.getContext('2d');
var img = wx.createImage();
img.onload = function() {
    ctx.drawImage(this, 50, 50);
}
img.src = "https://www.twle.cn/static/i/meimei_160x160.png";

表面上看起来,wx.createImage() 就是 new Image() 的封装,对吧

姑且就算是吧,等下你就会发现,差别真是大多了去....

范例

我们先绘制一张网络图片

game.js

var c = wx.createCanvas();
var ctx = c.getContext('2d');
var img = wx.createImage();
img.onload = function () {
  ctx.drawImage(this, 50, 50);
}
img.src = "https://www.twle.cn/static/i/meimei_160x160.png";

在模拟器中显示如下

很正常对吧,但是

千万不要相信模拟器 !

千万不要相信模拟器 !

千万不要相信模拟器 !

iOS 手机上输出正常,但是 Android 手机里显示如下

这是我手机的 bug 还是....

后来我们各种调试,为了解决这个办法,取巧了一下

既然最上面的画布会覆盖其它画布,那么将最上面的画布先绘制一个全屏的矩形就好了

game.js

function reset(ctx) {

  ctx.save();
  ctx.fillStyle = "#fff";
  ctx.fillRect(0, 0, c.width, c.height);
  ctx.textAlign = "center" // 居中对齐
  ctx.textBaseline = "middle" //垂直居中绘制
  ctx.fillStyle = "#aaa";
  ctx.font = "16px Arial" // 字体大小 16 像素
  ctx.fillText("简单教程,简单编程", c.width / 2, (c.height - 36))
  ctx.fillText(" © 2015-2018 www.twle.cn", c.width / 2, (c.height - 18));
  ctx.restore();
}

var c = wx.createCanvas();
var ctx = c.getContext('2d');
reset(ctx);

var img = wx.createImage();
img.onload = function () {
  ctx.save();
  reset(ctx);
  ctx.drawImage(img, 50, 50);
}
img.src = "https://www.twle.cn/static/i/meimei_160x160.png";

在微信手机里显示如下

绘制游戏背景图片

游戏中的背景图片一般都是可以重复的,比如 打飞机 小游戏里的背景

我们先创建一个 images 目录,把 打飞机 小游戏里的图片复制过来

或者点击 https://www.twle.cn/static/i/minigame/bg.jpg 保存到 images 目录

然后我们就可以写代码将它放置在屏幕的左上角

game.js

function reset(ctx) {

  ctx.save();
  ctx.fillStyle = "#fff";
  ctx.fillRect(0, 0, c.width, c.height);
  ctx.textAlign = "center" // 居中对齐
  ctx.textBaseline = "middle" //垂直居中绘制
  ctx.fillStyle = "#aaa";
  ctx.font = "16px Arial" // 字体大小 16 像素
  ctx.fillText("简单教程,简单编程", c.width / 2, (c.height - 36))
  ctx.fillText(" © 2015-2018 www.twle.cn", c.width / 2, (c.height - 18));
  ctx.restore();
}

var c = wx.createCanvas();
var ctx = c.getContext('2d');
reset(ctx);

var img = wx.createImage();
img.onload = function () {
  ctx.save();
  reset(ctx);
  ctx.drawImage(img,0,0);
}
img.src = "images/bg.jpg";

在微信手机里显示如下

好像图片没有显示完整,右边的没了,底部还漏出了一大块

这其实就是所有背景图片的应有的样子,怎么说呢,就是

背景图片的高宽要尽可能的足够小,宽度要等于高度,然后可以重复(平铺)

我们先看看这张图片

  1. 图片的大小是 512x512,也就是当屏幕竖着放的时候,宽度方面比屏幕框,高度方面比屏幕更高
  2. 水平方向没法无缝链接,但垂直方向可以

我们要怎么绘制这种背景图片呢? 很简单

  1. 计算绘制图片的高宽,如果图片宽度大于屏幕高度,则压缩图片,让宽度相等
  2. 计算压缩后的图片高度,如果大于等于屏幕高度,那么什么都不做,如果小于屏幕高度,那么在剩余的部分,再绘制一张图片

代码演示如下

var screenHeight = ctx.canvas.height;
var screenWidth  = ctx.canvas.width;

var w = screenWidth > img.width ? img.width : screenWidth;
var h = img.height * (w / img.width);

var x = 0;
var y = 0;

while (y < screenHeight) {
    x = 0;
    while (x < screenWidth) {
        ctx.drawImage(img, x, y, w, h);
        x+= w;
    }
    y += h;
}

范例

我们来绘制下 打飞机 小游戏的背景

game.js

function reset(ctx) {

  ctx.save();
  ctx.fillStyle = "#fff";
  ctx.fillRect(0, 0, c.width, c.height);
  ctx.restore();
}

function draw_copy() {
  ctx.save();
  ctx.textAlign = "center" // 居中对齐
  ctx.textBaseline = "middle" //垂直居中绘制
  ctx.fillStyle = "#aaa";
  ctx.font = "16px Arial" // 字体大小 16 像素
  ctx.fillText("简单教程,简单编程", c.width / 2, (c.height - 36))
  ctx.fillText(" © 2015-2018 www.twle.cn", c.width / 2, (c.height - 18));
  ctx.restore(); 
}

function draw_bg( img,ctx) {
  var screenHeight = ctx.canvas.height;
  var screenWidth = ctx.canvas.width;

  var w = screenWidth > img.width ? img.width : screenWidth;
  var h = img.height * (w / img.width);

  var x = 0;
  var y = 0;

  while (y < screenHeight) {
    x = 0;
    while (x < screenWidth) {
      ctx.drawImage(img, x, y, w, h);
      x+= w;
    }
    y += h;
  }
}

var c = wx.createCanvas();
var ctx = c.getContext('2d');
reset(ctx);

var img = wx.createImage();
img.onload = function () {
  ctx.save();
  reset(ctx);
  draw_bg(img,ctx);
  draw_copy();
  ctx.restore();
}
img.src = "images/bg.jpg";

在模拟器中输出如下

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.