小游戏绘制己方飞机 - 响应触屏移动事件

好了,背景图片也搞好了,背景音乐也有了,还缺一个己方的飞机

这次,我们就不使用官方的图片了,我们使用下面这张图片

  1. 图片地址为: https://www.twle.cn/static/i/minigame/plane.png
  2. 图片大小为 512x128
  3. 每个飞机大小为 128x128

为什么使用这样的飞机呢?

因为节省加载资源,我们称这样的图片为 雪碧图

下载这张图片,并保存到 images 目录

废话不多说,我们先绘制第一辆飞机

打飞机游戏,飞机初始位置为底部居中位置

game.js

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

var screenWidth = c.width;
var screenHeight = c.height;

function reset() {

    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();
}

plane.onload = function(){
    reset();
    ctx.drawImage(this,0,0,128,128,(screenWidth-128)/2,screenHeight-128,128,128)
    draw_copy();
}

plane.src="images/plane.png"

运行效果如下

移动飞机

己方的飞机肯定要跟着自己的手指移动对吧,我们给添加手指移动的事件

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

var screenWidth = c.width;
var screenHeight = c.height;

function reset() {

    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();
}

// 触摸移动事件
wx.onTouchMove(function (e) {

    var x = e.touches[0].clientX
    var y = e.touches[0].clientY
    reset();
    ctx.drawImage(plane, 0, 0, 128, 128,  x - 64, y - 64, 128, 128);
    draw_copy();
})



plane.onload = function () {
    reset();
    ctx.drawImage(this, 0, 0, 128, 128, (screenWidth - 128) / 2, screenHeight - 128, 128, 128);
    draw_copy();
}

plane.src="images/plane.png"

运行演示如下

限制点击区域

当然,上面那种事有瑕疵的,我们必须判定按下手指时的位置,如果在飞机之外,就不要跟随手指了,不然可以说实现瞬移 (瞬间移动,躲避子弹)

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

var screenWidth = c.width;
var screenHeight = c.height;

// 上一次飞机的位置
var lasted = {x:0,y:0};
// 触摸区域是否在飞机内部
var in_plane = false;

function reset() {

    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();
}

wx.onTouchStart(function(e){
    var x = e.touches[0].clientX;
    var y = e.touches[0].clientY;

    if ( plane_hit(x,y) ) {
        in_plane = true;
    }
});


wx.onTouchEnd(function(e){
    if ( in_plane )
    {
        lasted.x = e.touches[0].clientX;
        lasted.y = e.touches[0].clientY;
        in_plane = false;
    }
});

// 触摸移动事件
wx.onTouchMove(function (e) {

    if ( in_plane ) {
        var x = e.touches[0].clientX;
        var y = e.touches[0].clientY;
        reset();
        ctx.drawImage(plane, 0, 0, 128, 128,  x - 64, y - 64, 128, 128);
        draw_copy();
    }
})

function plane_hit(x, y)
{
    return  x > (lasted.x - 64) && 
            x < (lasted.x + 64) &&
            y > (lasted.y - 64) &&
            y < (lasted.y + 64) ;
}

plane.onload = function () {
    reset();
    lasted.x = (screenWidth - 128) / 2;
    lasted.y = screenHeight - 128;
    ctx.drawImage(this, 0, 0, 128, 128, lasted.x , lasted.y , 128, 128);
    draw_copy();
}

plane.src="images/plane.png"

运行演示如下

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

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

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