使用小程序制作一个飞机大战小游戏

news2024/11/18 9:25:04

此文主要基于微信小程序制作一个飞机大战小游戏,上手即用,操作简单。

    • 一、创建小程序
    • 二、页面实现
    • 三、代码块

一、创建小程序

  1. 访问微信公众平台,点击账号注册。

在这里插入图片描述

  1. 选择小程序,并在表单填写所需的各项信息进行注册。

在这里插入图片描述
在这里插入图片描述

  1. 在开发管理选择开发设置,将AppID及AppSecret复制出来进行存储。

在这里插入图片描述

  1. 下载安装微信web开发者工具并创建一个新的项目,填入上图所复制的AppId。

在这里插入图片描述
在这里插入图片描述

二、页面实现

  1. 在创建好的index页面上,定义一个canvas标签,飞机大战小游戏主要功能都基于canvas画布来实现。

在这里插入图片描述

<view>
    <canvas canvas-id="plainId" class="canvas" bindtap="click" bindtouchmove="move"></canvas>
</view>
/*  这里定义画布高度的时候可以在app.js里面获取屏幕高度来达到自适应的效果  */
.canvas {
  width: 375px;
  height: 625px;
}
  1. 准备对应的图片素材。

在这里插入图片描述

  1. 在pages同级文件夹新建一个lib文件夹,用于存放一些外部JS。

在这里插入图片描述

  1. 在lib文件夹新建一个images.js文件,用于定义图片src以及宽高等元素。

在这里插入图片描述

const imageSrc = "../../images/";  //图片url前缀
var gameImg = {
    "bg": {
        "src": imageSrc + "bg.jpg",
        "width": 375,
        "height": 666
    },
    "loading1": {
        "src": imageSrc + "loading1.png",
        "width": 192,
        "height": 41
    },
    "loading2": {
        "src": imageSrc + "loading2.png",
        "width": 192,
        "height": 40
    },
    "loading3": {
        "src": imageSrc + "loading3.png",
        "width": 200,
        "height": 42
    },
    "logo": {
        "src": imageSrc + "logo.png",
        "width": 375,
        "height": 87
    },
    "bomb": {
        "src": imageSrc + "bomb.png",
        "width": 60,
        "height": 53
    },
    "cartridge": {
        "src": imageSrc + "cartridge.png",
        "width": 9,
        "height": 21
    },
    "cartridge_power": {
        "src": imageSrc + "cartridge_power.png",
        "width": 9,
        "height": 21
    },
    "die1": {
        "src": imageSrc + "die1.png",
        "width": 41,
        "height": 39
    },
    "die2": {
        "src": imageSrc + "die2.png",
        "width": 40,
        "height": 43
    },
    "me": {
        "src": imageSrc + "me.png",
        "width": 98,
        "height": 122
    },
    "me_2": {
        "src": imageSrc + "me_2.png",
        "width": 98,
        "height": 122
    },
    "me_die1": {
        "src": imageSrc + "me_die1.png",
        "width": 98,
        "height": 122
    },
    "me_die2": {
        "src": imageSrc + "me_die2.png",
        "width": 98,
        "height": 122
    },
    "me_die3": {
        "src": imageSrc + "me_die3.png",
        "width": 98,
        "height": 122
    },
    "me_die4": {
        "src": imageSrc + "me_die4.png",
        "width": 98,
        "height": 122
    },
    "plain1": {
        "src": imageSrc + "plain1.png",
        "width": 59,
        "height": 36
    },
    "plain1_die1": {
        "src": imageSrc + "plain1_die1.png",
        "width": 59,
        "height": 36
    },
    "plain1_die2": {
        "src": imageSrc + "plain1_die2.png",
        "width": 59,
        "height": 36
    },
    "plain1_die3": {
        "src": imageSrc + "plain1_die3.png",
        "width": 59,
        "height": 36
    }
}
module.exports = gameImg
  1. 继续在lib文件夹创建一个wxplain.js,用于定义游戏基本配置信息以及游戏界面所用的一些函数,同时在这个JS中需引用上一步所创建的images.js。

在这里插入图片描述

const flyimages = require( './images.js' );

//游戏配置
var config = {
    "gameSpeed": 8,  //游戏速度
    "cartridgeSpeed": 10  //子弹速度
};

function flyGame( opts ) {
    var c_width = this.c_width = opts.width;
    var c_height = this.c_height = opts.height;  //画布的高和宽
    var cxt = this.cxt = opts.ctx;
    var id = this.id = opts.id;
    this.cxt.setFontSize( 30 );
    this.cxt.setFillStyle( "#333" );

    //等待时间
    var loadingTime = 0;

    //等待动画刷新事件
    var refresh = function() {
        drawBg();
        drawLogo();
        load();
        loadingTime++;
        wx.drawCanvas( {
            canvasId: id,
            actions: cxt.getActions()
        })
    }

    //设置背景
    function drawBg() {
        var bg_img = flyimages[ "bg" ];
        var bg_img_width = bg_img.width;
        var bg_img_height = bg_img.height;
        cxt.drawImage( bg_img.src, 0, 0, bg_img_width, bg_img_height );
    }

    //构造logo
    function drawLogo() {
        var logo_img = flyimages[ "logo" ];
        var logo_width = logo_img.width;
        var logo_height = logo_img.height;

        var y = 100;
        cxt.drawImage( logo_img.src, 0, y, logo_width, logo_height );
    }

    //等待动画
    function load() {
        if( loadingTime == 600 ) {
            loadingTime = 0;
            clearInterval( loadingClock );
            game.start();
        }

        //loadingTime每隔200换一张图, 实现等待动画
        var pic = flyimages[ "loading" + ( parseInt( loadingTime / 200 ) + 1 ) + "" ];
        var pic_width = pic.width;
        var pic_height = pic.height;

        var x = ( c_width - pic_width ) / 3;
        cxt.drawImage( pic.src, x, 220, pic_width, pic_height );
    }

    //开始动画
    var loadingClock = setInterval( refresh, 1 );
}
  1. 回到index.js中,调用上一步所创建的wxplain.js并实现canvas的bindtouchmove函数。

在这里插入图片描述

const WxFly = require('../../lib/wxplain.js');

Page({
    data: {
        modalHidden: "modal_hide",
        score: '0'
    },
    onLoad: function (options) {
        // 页面初始化 options为页面跳转所带来的参数
    },
    onReady: function () {
        // 页面渲染完成
    },
    startGame: function () {
        const fly = this.fly;
        this.setData({ score: 0, modalHidden: "modal_hide" });
        fly.startGame();
    },
    move: function (event) {
        const fly = this.fly;
        var x = event.touches[0].x;
        var y = event.touches[0].y;
        fly.touchmove(x, y);
    },
    click: function () {
        const fly = this.fly;
        fly.touchclick();
    },
    onShow: function () {
        const fly = this.fly = new WxFly(
            {
                ctx: wx.createContext(),
                id: 'plainId',
                height: 625,
                width: 375,
            });
        fly.on('over', packet => {
            this.setData({ score: packet.score, modalHidden: "" });
        });
    },
    onHide: function () {
        // 页面隐藏
    },
    onUnload: function () {
        // 页面关闭
    }
})
  1. 当飞机击落敌机时需要根据给用户计算分值并显示在界面上。

在这里插入图片描述

startGame: function () {
    const fly = this.fly;
    this.setData({ score: 0, modalHidden: "modal_hide" });
    fly.startGame();
},
  1. 当飞机撞机时,需要给到用户一个重新开始的入口。

在这里插入图片描述

<view id="modal" class="modal {{modalHidden}}">
     <view class="header">飞机大战分数</view>
     <view class="content" id="content">{{score}}</view>
     <view class="footer">
         <button bindtap="startGame">继 续</button>
     </view>
 </view>
startGame: function () {
   const fly = this.fly;
   this.setData({ score: 0, modalHidden: "modal_hide" });
   fly.startGame();
},
  1. 上述步骤完成后,保存代码进行编译,就可以开始飞机大战游戏了。

三、代码块

<view>
    <canvas canvas-id="plainId" class="canvas" bindtap="click" bindtouchmove="move"></canvas>
    <view id="modal" class="modal {{modalHidden}}">
        <view class="header">飞机大战分数</view>
        <view class="content" id="content">{{score}}</view>
        <view class="footer">
            <button bindtap="startGame">继 续</button>
        </view>
    </view>
</view>
.modal {
    width: 360px;
    height: 300px;
    top: 100px;
    left: 55%;
    margin-left: -200px;
    border: #666 solid 2px;
    border-radius: 8px;
    position: absolute;
    font-size: 20px;
    background-color: #dddddd;
    z-index: 1002;
}

.modal_hide {
    display: none;
}

.header {
    height: 45px;
    line-height: 45px;
    font-weight: bold;
    text-align: center;
    border-bottom: #666 solid 2px; 
}

.content {
    height: 210px;
    line-height: 210px;
    font-weight: bold;
    text-align: center;
}

.footer {
    height: 45px;
    line-height: 45px;
    text-align: center;
    border-top: #666 solid 2px; 
}

.footer button {
    width: 120px;
    height: 42px;
    border: #666 solid 2px;
    border-radius: 15px;
    font-size: 15px;
    font-weight: bold;
    position: absolute;
    left: 50%;
    margin-left: -60px;
    color: #333;
    cursor: pointer;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/11532.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

rancher部署nginx服务

前言&#xff1a;目前主流的开发模式是前后端分离&#xff0c;前端也会单独打包进行部署&#xff0c;一般就是把前端打包好的文件放到nginx目录下&#xff0c;和nginx一起部署&#xff0c;最终通过nginx来访问。 通用的dockerfile文件&#xff0c;用来构建nginx镜像 FROM ngi…

如何从测试新手变成测试大牛

如何从测试新手变成测试大牛,作为一个刚入行的测试新手&#xff0c;如何让自己提升自身能力&#xff0c;变成一个无所不能的测试大牛&#xff0c;本文将从多个方面来告诉你努力的方向&#xff0c;希望能帮助到你。 一&#xff1a;扎实的测试理论知识 作为一个测试人&#xff0…

nvcc编译器之编译内幕(chapter 23)

目录 2. 编译阶段&#xff08;步骤&#xff09; 2.1 NVCC预定义宏 2.2 NVCC编译步骤 2.3 NVCC支持的文件后缀 2.4 支持的编译阶段 3. CUDA 编译内幕 2. 编译阶段&#xff08;步骤&#xff09; 2.1 NVCC预定义宏 __NVCC__ 在编译C/C/CUDA源文件时定义 __CUDACC__ 在编译…

[附源码]java毕业设计教师教学评价系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

java之你真正了解抽象类和接口嘛?

&#x1f387;&#x1f387;&#x1f387;作者&#xff1a; 小鱼不会骑车 &#x1f386;&#x1f386;&#x1f386;专栏&#xff1a; 《java练级之旅》 &#x1f393;&#x1f393;&#x1f393;个人简介&#xff1a; 一名专科大一在读的小比特&#xff0c;努力学习编程是我…

Nexus私服仓库Linux、Windows部署教程

Nexus 概述 Nexus 是 Sonatype 公司发布的一款仓库&#xff08;Repository&#xff09;管理软件&#xff0c;常用来搭建 Maven 私服&#xff0c;所以也有人将 Nexus 称为“Maven仓库管理器”。 主流的 Maven 仓库管理器主要有以下 3 种&#xff1a;Apache Archiva、JFrog Arti…

软考信息安全工程师案列分析

1.第一题 1.动态存储区&#xff0c;分配存储空间和释放存储空间 3.让argv[]中的第9个字符是十进制65即可。 4.缓冲区溢出漏洞&#xff0c;使用安全的strcpy函数&#xff0c;检测边界 第二题 第三题 1.保证M完整性 不能交换&#xff0c;先hash摘要可以减少加密的计算量。 2.实现…

STM8S系列基于STVD开发,自定义printf函数+TIM5精确延时函数模块化工程示例

STM8S系列基于STVD开发&#xff0c;自定义printf函数TIM5精确延时函数模块化工程示例&#x1f3ac;功能演示 ✨本例也是结合了网络上收集来的printf自定义内容&#xff0c;将其功能模块化&#xff0c;方便移植使用&#xff0c;灵活性很强。 &#x1f4da;相关篇内容《STM8S903…

leetcode:792. 匹配子序列的单词数【子序列二分优化模板 + 大的字符串不变的二分优化】

目录题目截图题目分析ac code总结题目截图 题目分析 简单的子序列判断需要on&#xff0c;那么最后最坏就是omn&#xff0c;25 * 10 ^ 7爆炸因此需要优化子序列判断注意到此时的大字符串是同一个记录每个字母出现的下标遍历word&#xff0c;找到下一个最近的字母出现的位置&…

C++【C++11】

文章目录一、统一的列表初始化1.用{}来初始化元素2.initializer_list二、自动类型推断3.auto4.decltype三、指针5.nullptr6.范围for四、STL中的一些新变化1.新增加的容器2.容器内部的变化一、统一的列表初始化 1.用{}来初始化元素 在C98中&#xff0c;标准允许使用花括号{}对…

搭建java部署环境以及部署Web项目到Linux

系列文章目录 Linux 环境搭建以及xshell远程连接_crazy_xieyi的博客-CSDN博客 Linux常用命令详解_crazy_xieyi的博客-CSDN博客 Linux权限_crazy_xieyi的博客-CSDN博客 文章目录 一、搭建java部署环境 1.yum 2.JDK 3.Maven 4.Tomcat 5.MySQL二、部署…

PacBio三代全长扩增子测序对珊瑚共生虫黄藻和细菌群落进行精确分类

研究背景 珊瑚与其共生微生物群落统称为珊瑚共生功能体&#xff0c;包含了光合甲藻以及与其保持长期互利共生关系的细菌、古菌、真菌、原生动物以及病毒等一系列微生物。这些与珊瑚相关的微生物在其宿主的适应性和生存中起着重要的作用。本研究利用PacBio全长16S rRNA和ITS测序…

【Spring】一文带你吃透Spring集成MyBatis

个人主页&#xff1a; 几分醉意的CSDN博客_传送门 文章目录&#x1f496;Spring集成MyBatis✨怎么使用mybatis✨集成的步骤✨创建数据库表✨pom加入依赖✨创建MyBatis使用代码✨创建Service类✨创建Spring配置文件✨测试集成MyBatis✨使用外部属性配置文件&#x1f496;投票传送…

HTML西安旅游网页设计作业成品 大学生旅游风景区网页设计作业模板下载 静态HTML旅游景点网页制作下载 DW网页设计代码

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…

Redis主从复制

安装redis 下载redis源码: wget http://download.redis.io/releases/redis-3.2.3.tar.gz 解压安装redis&#xff1a; tar zxf redis-3.2.3.tar.gz 解压完毕后开始安装&#xff0c;如下&#xff1a; cd redis-3.2.3/ make&&make install 然后再切换到utils目录下&…

【LeetCode每日一题:792.匹配子序列的单词数~~~时间超限的双指针+改进优化的存储元素位置的二分查找】

题目描述 给定字符串 s 和字符串数组 words, 返回 words[i] 中是s的子序列的单词个数 。 字符串的 子序列 是从原始字符串中生成的新字符串&#xff0c;可以从中删去一些字符(可以是none)&#xff0c;而不改变其余字符的相对顺序。 例如&#xff0c; “ace” 是 “abcde” 的…

进程的通信 - 剪切板

剪切板是系统维护管理的一块内存区域&#xff0c;本机的所有进程都可以访问。当一个进程复制数据时&#xff0c;先将数据放在该内存区&#xff0c;当另一个进程粘贴时&#xff0c;则是从该内存区块取出数据 剪切板操作&#xff1a; 其实在剪切板中也就那几个API在使用&#x…

CEF 桌面软件开发实战

作者介绍 刘晓伦liulun&#xff0c;资深桌面端开发工程师。目前在一家大型国有控股上市公司任职&#xff0c;主要负责桌面端产品的核心技术研发、重难点技术攻关&#xff0c;以及新技术的预研和技术储备工作&#xff0c;拥有十几年的软件开发经验&#xff0c;在 Electron 、 Qt…

湖南郴州知心世界岛主王瑞平将出新书《知心世界》谷传民为其顾问

最近几天&#xff0c;被谷传民起诉的大衣哥&#xff0c;终于又满血复活&#xff0c;他也通过网络给知心世界岛主王瑞平送去了祝福。 就在农民歌唱家大衣哥&#xff0c;给知心世界岛主王瑞平&#xff0c;送去真挚的祝福不久&#xff0c;著名导演谷传民那边也有了动作。 原来&…

AntDesignVue动态创建下拉菜单

最近项目需要&#xff0c;有需要动态创建下拉菜单的需求&#xff0c;特此记录一下。 vue版本&#xff1a;3.1.4 ant-design-vue版本&#xff1a;2.1.6 需求是下拉菜单项可以根据配置来控制是否显示&#xff0c;那么就需要用到 v-for 和 v-if 的结合。 v-for 和 v-if 是不能…