用canvas写一个h5小游戏

这篇文章我们来讲一讲用canvas画一个躲水果的小游戏。就是通过手指控制一个人物移动来躲避水果,若发生碰撞,则游戏结束。

我们定义一个game_control对象来处理初始化,事件绑定,游戏开始,游戏结果判定,游戏结束等判定。

在游戏中,我们需要一个人物以及三种水果的图片,我们做成了雪碧图。

接下来直接上代码吧~

首先我们定义一个ship对象,3个水果、一个人物都是基于这个对象的。

function ship(options){
				if (options) {
					var width=options.width,
						height=options.height;
					this.x=options.x;
					this.y=options.y;
					this.width=width;
					this.height=height;
					this.first_x=options.x;
					this.first_y=options.y;
					this.speedx=options.speedx;
					this.speedy=options.speedy;
					this.csspeedx=options.speedx;
					this.csspeedy=options.speedy;
					this.xDirection=options.xDirection||1;//x轴方向
					this.yDirection=options.yDirection||1;//y轴方向
					var canvasOffscreen = document.createElement(‘canvas‘);
					canvasOffscreen.width =width;
					canvasOffscreen.height =height;
					canvasOffscreen.getContext(‘2d‘).drawImage(options.image, options.sourcex, options.sourcey, options.sourcewidth, options.sourceheight, 0, 0, width, height);
					this.canvasOffscreen=canvasOffscreen;
					this.init();
				}
			}

			ship.prototype={
				init:function(){

				},
				reset:function(){

				},
				draw:function(ctx){
					//let canvasOffscreen=this.canvasOffscreen;
					ctx.drawImage(this.canvasOffscreen, this.x, this.y);
				},
				move:function(modifier){
					this.x+=this.xDirection*this.speedx * modifier;
					this.y+=this.yDirection*this.speedy * modifier;
					if(this.x>winwidth-this.width){
						this.x=winwidth-this.width;
						this.xDirection=-1;
					}else if(this.x<0){
						this.x=0;
						this.xDirection=1
					}
					if(this.y>winheight-this.height){
						this.y=winheight-this.height;
						this.yDirection=-1;
					}else if(this.y<0){
						this.y=0;
						this.yDirection=1;
					}
				}
			}

  当我们用canvas绘制人物和水果时,可以采用离屏绘制的方法,就是先将每个水果,人物绘制一遍,然后每次重绘的时候,再用canvas将这个已绘制的绘制出来就可以了,这样效率会比每次都直接绘制图片要高

var canvasOffscreen = document.createElement(‘canvas‘);
					canvasOffscreen.width =width;
					canvasOffscreen.height =height;
					canvasOffscreen.getContext(‘2d‘).drawImage(options.image, options.sourcex, options.sourcey, options.sourcewidth, options.sourceheight, 0, 0, width, height);

ctx.drawImage(this.canvasOffscreen, this.x, this.y);

  接下来说一下game_control 初始化init方法吧

init:function(){
					var canvas=document.getElementById(‘game-canvas‘),
						self=this,
						ctx=canvas.getContext(‘2d‘);
					self.ctx=ctx;
					canvas.width=winwidth;
					canvas.height=winheight;
					let img=new Image();
					img.onload=function(){
						var zjb=new hero({
							image:img,
							x:gettruesize(250),
							y:gettruesize(56),
							width:gettruesize(50),
							height:gettruesize(50),
							sourcewidth:104,
							sourceheight:104,
							sourcex:0,
							sourcey:0
						});
						for(var i=0;i<3;i++){
							var x=60,y=110;
							if(i==1){x=38,y=330;}
							if(i==2){x=218,y=338;}
							var monster=new ship({
												image:img,
												x:gettruesize(x),
												y:gettruesize(y),
												width:gettruesize(50),
												height:gettruesize(50),
												sourcewidth:104,
												sourceheight:104,
												speedx:gettruesize(getrandom(60,100)),
												speedy:gettruesize(getrandom(60,100)),
												sourcex:104*(i+1),
												sourcey:0
											});
							self.monsters.push(monster);
						}
						self.objs=zjb;
						self.draw();
						self.bindmove(canvas,zjb);
					}
					img.src="all.png";
				}

  主要作用是当 雪碧图载入完成后,定义出一个人物对象以及3个水果对象,并通过draw方法将他们用canvas绘制出来,同时给人物对象进行手指事件的绑定(bindmove方法)

接下来讲讲bindmove方法

bindmove:function(canvas,hero){
					let self=this;
					canvas.addEventListener(‘touchstart‘, function(e) {
						var event = e||window.event,
							csx = event.touches[0].clientX,
							csy = event.touches[0].clientY,
							nanshengcsx = hero.x,
							nanshengcsy = hero.y;
						if (csx <= hero.x + hero.width && csx >= hero.x && csy <= hero.y + hero.height && csy >= hero.y) {
							if (!self.startstate) {
								self.start();
			                    timer = setInterval(function(){
			                    	self.draw();
			                    }, 1);
							}
							document.addEventListener(‘touchmove‘, move,false);
							function move(e){
								e.preventDefault();
								var event = e||window.event,
									nowx = event.touches[0].clientX,
									nowy = event.touches[0].clientY;
								hero.x = nanshengcsx + nowx - csx;
								hero.y = nanshengcsy + nowy - csy;
								if(hero.x<0){
									hero.x=0;
								}else if(hero.x+hero.width>winwidth){
									hero.x=winwidth-hero.width;
								}
								if(hero.y<0){
									hero.y=0;
								}else if(hero.y+hero.height>winheight){
									hero.y=winheight-hero.height;
								}
							}
							function moveend(e){
								document.removeEventListener(‘touchend‘,moveend);
								document.removeEventListener(‘touchmove‘,move);
							}
							document.addEventListener(‘touchend‘, moveend ,false);
						}
					},false);
				}

  这个方法用来判断手指触碰屏幕时是否在 人物这个位置,如果是,则游戏开始(触发start方法),并注册移动事件,跟随手指移动而移动。

start方法中定义一个循环,让canvas 一帧一帧的画。

start:function(){
					var self=this;
					this.startstate=true;
					this.then=Date.now();
					this.starttime=this.then;
					document.getElementById(‘tips‘).style.display="none";
					timer = setInterval(function(){
                    	self.draw();
                    }, 1);
				}

  最后还要一个check方法,来判断人物与水果间有没有发生触碰,若有则游戏结束。

check:function(){
					var last=this.then-this.starttime;

					var monsters=this.monsters;
					var nansheng=this.objs;
					if (this.monsterSum != Math.floor(last / 5000)){//如果时间经过5秒就增加一个怪兽实例
						this.monsterSum ++;
						for(var i=0;i<monsters.length;i++){
							monsters[i].speedx+=60;
							monsters[i].speedy+=60;
						}
					}
					for(var i=0;i<monsters.length;i++){
						var monster1=monsters[i];
						if ((monster1.x - nansheng.width) <= nansheng.x && nansheng.x <= (monster1.x + monster1.width) && (monster1.y - nansheng.height) <= nansheng.y && nansheng.y <= (monster1.y + monster1.height)) {
							this.end();
						}
					}
				}

  这样一个简单的小游戏就完成啦~

时间: 2024-10-13 01:48:02

用canvas写一个h5小游戏的相关文章

用Canvas写一个简单的游戏--别踩白块儿

第一次写博客也不知怎么写,反正就按照我自己的想法来吧!怎么说呢?还是不要扯那些多余的话了,直接上正题吧! 第一次用canvas写游戏,所以挑个简单实现点的来干:别踩白块儿,其他那些怎么操作的那些就不用再扯了,大家应该都懂,不懂的看到黑色的就点就是了,扯多了我打字手也累,大概.链接给你们:http://nowtd.cn/white/ 咱不是理论派,所以在这里不会扯多少理论. 首先看看html的结构吧 1 <header class="container"> 2 <art

从0开始制作一个h5小游戏:开篇

我这个人,想法很多,但是实现很少. 虽然大部分的想法都有去开始实践,从我的blog啦,代码库啦都可以看得出来,但是最终基本都没能坚持下来. 理由有很多: 没人监督,自制力不够啦:没有相熟的美术啦:公司项目排期紧啦. 但是,特么的,一个能够晚上打游戏打到2,3点的人为毛做点正事有这么多借口呢. 所以最终还是自己的自制力不够,然后还有就是需求混乱的原因. 所以在做这个之前,先明确一下自己要做什么,应该从哪里切入比较好. 然后今天中午胡思乱想的时候,想到自己近期做事情也不是很顺利,应该是切入点不对.

【python学习】使用python写一个2048小游戏

个人博客:jerwang.cn 没有参考其他代码,效果图: 话不多少,源代码: https://github.com/jerustc/Python/blob/master/2048.py

原生JS实现的h5小游戏-植物大战僵尸

代码地址如下:http://www.demodashi.com/demo/12755.html 项目介绍 本项目是利用原生js实现的h5小游戏-植物大战僵尸,主要结合了一下自己对于h5小游戏的理解,结合面向对象的编程思想进行开发,在实现时使用了部分es6语法,对于es6语法不太熟悉的小伙伴可以先查阅相关资料了解一下. 如有需要,可根据自己的需求修改源码样式.源码配置属性代码,实现个性化定制. 以下为文件目录结构示意图,核心代码在js文件夹下的四个common.js.main.js.game.js

一个js小游戏----总结

花了大概一天左右的功夫实现了一个js小游戏的基本功能,类似于“雷电”那样的小游戏,实现了随即怪物发生器,碰撞检测,运动等等都实现了,下一个功能是子弹轨迹,还有其他一些扩展功能,没有用库,也没有用webGl之类的,单纯的逻辑+对DOM的操作,算是一次试手吧,之所以没有继续去完善,是因为想要整合一下,各个模块要更清晰,大体的设计是按MVC来的,但是对控制器那一块还不满意,设计过程中比较得意的是碰撞检测吧,因为我用了一个数组来维护怪物的生灭,怪物产生则数组push,怪物消失则用splice来从数组中删

已被多次定制!!“模拟微信答题&quot;的H5小游戏

今天推荐一款“模拟微信”答题的H5小游戏,这个也是涛舅舅这边客户定制的最多的一款游戏,曾经为现代汽车.万达.和<三妹>电视剧都作过定制! 以下是<三妹>定制的版本,推荐给大家! 扫一扫直接体验游戏 非vip会员:只接受定制,不出售源码,请联系涛舅舅报价 vip会员:可以购买源码,价格咨询涛舅舅

突发奇想想学习做一个HTML5小游戏

前言: 最近一期文化馆轮到我分享了,分享了两个,一个是关于童年教科书的回忆,一个是关于免费电子书的.最后我觉得应该会不敌web,只能说是自己在这中间回忆了一下那个只是会学习的年代,那个充满梦想的年代.有人说如果一个人开始回忆童年的时候,那么他开始变老了,不知道是不是这样一个原因,我突然想起了很多以前的老朋友,开始想起了一些童年时期的玩伴.也就想做这样一款简单的游戏,也只是单纯的想回忆一下童年. 计划: 游戏其实很简单,我们把它叫着裤裆棋,又叫什么狗卵坨还是什么的,有些记忆模糊了,反正大致是这样子

如何在CentOS上安装一个2048小游戏

如何在centos上安装一个2048小游戏 最近在学习CentOS系统,就琢磨着玩点什么,然后我看到有人在玩2048小游戏,所有我就在想,为啥不装一个2048小游戏搞一下嘞,于是乎,我就开始工作啦 由于我个人的编程能力不强,所以我就在网上找到了一个C语言版的2048游戏小程序,我把它放到我的百度网盘上,可以供大家下载(链接:http://pan.baidu.com/s/1jIutb3g 密码:mu9z),然后我们把这个程序给复制到CentOS系统下,在进行下一步的工作.我们可以在CentOS上安

利用Python制作一个连连看小游戏,边学边玩!

导语 今天我们将制作一个连连看小游戏,让我们愉快地开始吧~ 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 先睹为快 在cmd窗口运行"Game15.py"文件即可. 效果如下: 原理简介 游戏规则: 玩家通过鼠标交换相邻的拼图,若交换后水平/竖直方向存在连续三个相同的拼图,则这些拼图消失,玩家得分,同时生成新的拼图以补充消失的部分,否则,交换失败,玩家不