热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

html5游戏制作入门系列教程(二)

今天,我们继续html5游戏制作入门系列的系列文章。今天,我们将继续基础知识(也许甚至是高级技巧的基础)。我要告诉你如何具有

今天,我们继续html5游戏制作入门系列的系列文章。今天,我们将继续基础知识(也许甚至是高级技巧的基础)。我要告诉你如何具有渐变颜色填充对象,绘制文本,使用自定义的字体绘制文本,基本的动画,以及最重要的UI元素 – 按钮。

 

我们以前的文章中,你可以在这里阅读:html5游戏制作入门系列教程(一)。我们会用到以前的脚本,并将其功能加强。我要绘制文本,使用自定义字体,动画对象(方形)与渐变色填充,将利用“播放/暂停”按钮暂停动画。

 

这里有我们的演示和下载包:

在线演示 源码下载

 

好吧,下载所需文件,让我们开始编码!

 

步骤1: HTML

这里是我演示的HTML

 

index.html














 

步骤2:CSS

下面是CSS样式。

/* general styles */
*{margin:0;padding:0;
}
@font-face {font-family: "DS-Digital";src: url("Ds-digib.ttf");
}
body {background-color:#bababa;background-image: -webkit-radial-gradient(600px 300px, circle, #ffffff, #bababa 60%);background-image: -moz-radial-gradient(600px 300px, circle, #ffffff, #bababa 60%);background-image: -o-radial-gradient(600px 300px, circle, #ffffff, #bababa 60%);background-image: radial-gradient(600px 300px, circle, #ffffff, #bababa 60%);color:#fff;font:14px/1.3 Arial,sans-serif;min-height:1000px;
}
.container {width:100%;
}
.container > * {display:block;margin:50px auto;
}
footer {background-color:#212121;bottom:0;box-shadow: 0 -1px 2px #111111;display:block;height:70px;left:0;position:fixed;width:100%;z-index:100;
}
footer h2{font-size:22px;font-weight:normal;left:50%;margin-left:-400px;padding:22px 0;position:absolute;width:540px;
}
footer a.stuts,a.stuts:visited{border:none;text-decoration:none;color:#fcfcfc;font-size:14px;left:50%;line-height:31px;margin:23px 0 0 110px;position:absolute;top:0;
}
footer .stuts span {font-size:22px;font-weight:bold;margin-left:5px;
}
h3 {text-align:center;
}
#scene {background-image:url(01.jpg);position:relative;
}

 

注意@ font-face的这种使用方式,自定义字体文件(TTF)连接到我们的教程中(在画布上绘制)。

 

步骤3: JS

var canvas, ctx;
var circles = [];
var selectedCircle;
var hoveredCircle;
var button;
var moving = false;
var speed = 2.0;// -------------------------------------------------------------// objects :function Circle(x, y, radius){this.x = x;this.y = y;this.radius = radius;
}function Button(x, y, w, h, state, image) {this.x = x;this.y = y;this.w = w;this.h = h;this.state = state;this.imageShift = 0;this.image = image;
}
// -------------------------------------------------------------// draw functions :function clear() { // clear canvas functionctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
}function drawCircle(ctx, x, y, radius) { // draw circle functionctx.fillStyle = 'rgba(255, 35, 55, 1.0)';ctx.beginPath();ctx.arc(x, y, radius, 0, Math.PI*2, true);ctx.closePath();ctx.fill();ctx.lineWidth = 1;ctx.strokeStyle = 'rgba(0, 0, 0, 1.0)';ctx.stroke(); // draw border
}function drawScene() { // main drawScene functionclear(); // clear canvas// draw the title textctx.font = '42px DS-Digital';ctx.textAlign = 'center';ctx.fillStyle = '#ffffff';ctx.fillText('Welcome to lesson #2', ctx.canvas.width/2, 50);var bg_gradient = ctx.createLinearGradient(0, 200, 0, 400);bg_gradient.addColorStop(0.0, 'rgba(255, 0, 0, 0.8)');bg_gradient.addColorStop(0.5, 'rgba(0, 255, 0, 0.8)');bg_gradient.addColorStop(1.0, 'rgba(0, 0, 255, 0.8)');ctx.beginPath(); // custom shape beginctx.fillStyle = bg_gradient;ctx.moveTo(circles[0].x, circles[0].y);for (var i=0; i= 385) {speed = -speed;}// central object behaviorif (moving) {circles[0].x -= speed;circles[0].y -= speed;circles[1].x += speed;circles[1].y -= speed;circles[2].x += speed;circles[2].y += speed;circles[3].x -= speed;circles[3].y += speed;}drawCircle(ctx, circles[0].x, circles[0].y, (hoveredCircle == 0) ? 25 : 15);drawCircle(ctx, circles[1].x, circles[1].y, (hoveredCircle == 1) ? 25 : 15);drawCircle(ctx, circles[2].x, circles[2].y, (hoveredCircle == 2) ? 25 : 15);drawCircle(ctx, circles[3].x, circles[3].y, (hoveredCircle == 3) ? 25 : 15);// draw buttonctx.drawImage(button.image, 0, button.imageShift, button.w, button.h, button.x, button.y, button.w, button.h);// draw textctx.font = '30px DS-Digital';ctx.fillStyle = '#ffffff';ctx.fillText('Play/Pause', 135, 480);ctx.fillText(button.state, 135, 515);
}// -------------------------------------------------------------// initialization$(function(){canvas = document.getElementById('scene');ctx = canvas.getContext('2d');var circleRadius = 15;var width = canvas.width;var height = canvas.height;// lets add 4 circles manuallycircles.push(new Circle(width / 2 - 20, height / 2 - 20, circleRadius));circles.push(new Circle(width / 2 + 20, height / 2 - 20, circleRadius));circles.push(new Circle(width / 2 + 20, height / 2 + 20, circleRadius));circles.push(new Circle(width / 2 - 20, height / 2 + 20, circleRadius));// load the guide sprite imagebuttonImage = new Image();buttonImage.src = 'button.png';buttonImage.onload = function() {}button = new Button(50, 450, 180, 120, 'normal', buttonImage);// binding mousedown event (for dragging)$('#scene').mousedown(function(e) {var mouseX = e.layerX || 0;var mouseY = e.layerY || 0;for (var i=0; i button.x && mouseX button.y && mouseY button.x && mouseX button.y && mouseY });

 

下面是关于一些新功能代码的解释:
1)我们可以绘制文本(自定义字体)使用下面的代码,如下:

ctx.font = '42px DS-Digital';
ctx.textAlign = 'center';
ctx.fillStyle = '#ffffff';
ctx.fillText('Welcome to lesson #2', ctx.canvas.width/2, 50);

 

2)运用渐变色:

var bg_gradient = ctx.createLinearGradient(0, 200, 0, 400);
bg_gradient.addColorStop(0.0, 'rgba(255, 0, 0, 0.8)');
bg_gradient.addColorStop(0.5, 'rgba(0, 255, 0, 0.8)');
bg_gradient.addColorStop(1.0, 'rgba(0, 0, 255, 0.8)');
ctx.fillStyle = bg_gradient;

 

3)按钮 – 我用一个精灵图像,绘制按钮的三个状态,并添加悬停/事件的事件处理程序。下面是加载和绘制图像画布的方式:

buttonImage = new Image();
buttonImage.src = 'button.png';
.......
ctx.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, width, height);

 

结论

超级酷,不是吗?我会很高兴看到您的评论和意见。祝你好运!

在线演示 源码下载

 

20130812124645

 

转载请注明:HTML5游戏开发者社区 » html5游戏制作入门系列教程(二)



推荐阅读
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
author-avatar
鸟鸟212
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有