制作五子棋小游戏单机/在线联网对弈手把手精致设计含游戏服务器源码2

本文主要是介绍制作五子棋小游戏单机/在线联网对弈手把手精致设计含游戏服务器源码2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

接上期。传送门:

http://liuxinyumo.cn/index.php?s=/Home/Index/content/id/3.html

 

上期我们有介绍IGraphElement.js到底该怎么定义元素,接下来继续设计那个草率的界面。

继续使用代码编辑器打开IGraphElement.js,删除掉模板元素,或者留有几个元素,在该模板上进行修改。

如下代码:

var IGraphElement = [{ID:"GobangLogo",Version:100.00,Src:new Array("GobangLogo.png"),Class:function(){//初始化函数 this.Constructor = function(){}this.Draw = function(ctx){var Img = this.Src[0];ctx.drawImage(Img,this.Left-Img.width/2,this.Top-Img.height/2,Img.width,Img.height);return true;}this.Over = function(){var Img = this.Src[0];var x = this.Left > 0 ? this.Left : 0-this.Left;var y = this.Top > 0 ? this.Top : 0-this.Top;if(x <= Img.width/2 && y <= Img.height/2)return true;		return false;}}},{ID:"BeginGameButton",Version:100.00,Src:new Array("BeginGame.png"),Class:function(){//初始化函数 this.Constructor = function(){}this.Draw = function(ctx){var Img = this.Src[0];ctx.drawImage(Img,this.Left-Img.width/2,this.Top-Img.height/2,Img.width,Img.height);return true;}this.Over = function(){var Img = this.Src[0];var x = this.Left > 0 ? this.Left : 0-this.Left;var y = this.Top > 0 ? this.Top : 0-this.Top;if(x <= Img.width/2 && y <= Img.height/2)return true;		return false;}}}
];

按照我之前的讲解,这些代码并不是很难理解,大致都是在做一件事,分别讲我们之前的两个图片,以中心为控制坐标点定义出来。

定义之后,我们打开我们之前所做的HTML文件,我在之前的HTML文件引用的两个script的下面有注释,另创建Game.js文件单独存放游戏部分代码,也就现在创建Game.js,并在该处引入到HTML文件,我们这里将HTML文件保存为Gobang.html。

<script type="text/javascript" src="Game.js"></script>
<script type="text/javascript">//用于移植的控制代码
</script>

使用代码编辑器打开Game.js,为了开发标准化防止变量泄露,我们创建一个js的自执行函数,并对外暴露一个Gobang的游戏类名。在Game.js文件中写入:

var Gobang;
(function(){Gobang = function(Container){//Gobang游戏类的构造函数}Gobang.fn = Gobang.prototype = {}
})();

在构造函数中提供1个参数,用于传递存放Canvas画布的容器句柄,IAnimation.js插件并不是需要我们显式提供<canvas></canvas>元素,而是提供容器,自行填充Canvas,填充的大小会自动充满整个容器内部,这样做的一大好处是大大方便了项目移植。

这里注意我们在编辑Gobang的类时,所有的成员变量要定义成 this.xxx,所有的成员函数应定义成 this.xxx= function(){},成员函数的定义也可以在prototype中使用形如JSON的定义方式,但变量数据不能在该处定义。这里我们约定所有函数使用首字母大写命名,对私有成员的标注我们在命名前增加一个下划线区分。

       接下来我们在Gobang构造器中初始化IAnimation,写入如下代码:

this._Animation = new IAnimation(Container);	//Container是参数

我们回到Game.html页面中提供一个Div容器,并使用CSS控制其大小,然后在用于移植的控制代码段中实例化Gobang类,随后我们打开浏览器查阅下执行效果。


给一下完整的Gobang.html代码内容:

<!DOCTYPE html>
<html>
<head><title>基于HTML5的在线小游戏制作 Power By Liuxinyumo.cn</title><style type="text/css">div{border: 1px solid red;width: 750px;height: 600px;}</style>
</head>
<body><div id="container"></div>
</body>
<script type="text/javascript" src="IGraphElement.js"></script>
<script type="text/javascript" src="IAnimation.js"></script>
<script type="text/javascript" src="Game.js"></script>
<script type="text/javascript">//用于移植的控制代码var Container = document.getElementById("container");var game = new Gobang(Container);
</script>
</html>

那么现在有了游戏视窗,我们将我们第一个场景,欢迎页面布置上。由于该景布置归属于游戏自身,因此我们打开Game.js在该文件中进行定义。

在使用自定义元素前我们需要先对外部资源进行选择性的异步加载,这里是一个扩充数组,将我们所有用到的自定义元素ID进行列举,告诉引擎哪些是本次作业需要加载的资源项。通用的写法为:

var t = this;function CallBack(a,b){if(a == b){t._DownloadFinished();}}this._Animation.DownloadIMGing = CallBack;		this._Animation.DownloadIMG(["GobangLogo","BeginGameButton"]);

我们需要将该代码段单独放到一个 Init()的函数里,同时对Gobang创建一个_DownloadFinished()函数。

_DownloadFinished()函数一旦之行到意味着我们想要加载的外部资源已经准备就绪,因此我们就可以调用自定义资源库中的元素了,我们在初始化阶段实际上是可以将游戏界面、欢迎界面一并装在,游戏界面我们随后设计,因此在代码结构上留好位置。

接下来开始布局欢迎界面,单独定义创建函数_CreateWelcomeScene(),引擎中我们使用Page来区分场景,因此首先利用引擎创建一个WelcomePage,并保存到成员函数中,将该名称在构造器中声明,以便日后查找。使用this._Animation.CreatePage()即可创建一个场景,返回值赋值给我们所定义的this._WelcomePage变量。接下来我们就可以利用该变量向场景中添加自定义的元素了。

利用this._WelcomePage.AddElement("GobangLogo");即可创建Logo元素,但元素默认Visible属性均是false,所以先对其进行位置布局,再将其设置为可视。同理,我们对BeginGame也做同样的处理。

保存后我们运行下效果:


还算满意,给下Game.js到目前为止的完整代码。

var Gobang;
(function(){Gobang = function(Container){//Gobang游戏类的构造函数this._Animation = new IAnimation(Container);//成员变量声明this._WelcomePage = null;this._Init();}Gobang.fn = Gobang.prototype = {_Init:function(){var t = this;function CallBack(a,b){if(a == b){t._DownloadFinished();}}this._Animation.DownloadIMGing = CallBack;this._Animation.DownloadIMG(["GobangLogo","BeginGameButton"]);},_DownloadFinished:function(){//此处外部资源已经全部加载完毕可以创建游戏场景。this._CreateWelcomeScene();//这里留有部分用于创建游戏界面},_CreateWelcomeScene:function(){//创建游戏欢迎页面this._WelcomePage = this._Animation.CreatePage();//在场景中布局var Logo = this._WelcomePage.AddElement("GobangLogo");Logo.Left(this._Animation.Width/2);Logo.Top(this._Animation.Height/2-100);Logo.Visible(true);var BeginGameButton = this._WelcomePage.AddElement("BeginGameButton");BeginGameButton.Left(this._Animation.Width/2);BeginGameButton.Top(this._Animation.Height/2+20);BeginGameButton.Visible(true);}}
})();

篇幅也已经很长了,本篇先结束。







这篇关于制作五子棋小游戏单机/在线联网对弈手把手精致设计含游戏服务器源码2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/400802

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

电力系统中的A类在线监测装置—APView400

随着电力系统的日益复杂和人们对电能质量要求的提高,电能质量在线监测装置在电力系统中得到广泛应用。目前,市场上的在线监测装置主要分为A类和B类两种类型,A类和B类在线监测装置主要区别在于应用场景、技术参数、通讯协议和扩展性。选择时应根据实际需求和应用场景综合考虑,并定期维护和校准。电能质量在线监测装置是用于实时监测电力系统中的电能质量参数的设备。 APView400电能质量A类在线监测装置以其多核

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

怎么让1台电脑共享给7人同时流畅设计

在当今的创意设计与数字内容生产领域,图形工作站以其强大的计算能力、专业的图形处理能力和稳定的系统性能,成为了众多设计师、动画师、视频编辑师等创意工作者的必备工具。 设计团队面临资源有限,比如只有一台高性能电脑时,如何高效地让七人同时流畅地进行设计工作,便成为了一个亟待解决的问题。 一、硬件升级与配置 1.高性能处理器(CPU):选择多核、高线程的处理器,例如Intel的至强系列或AMD的Ry

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

Linux服务器Java启动脚本

Linux服务器Java启动脚本 1、初版2、优化版本3、常用脚本仓库 本文章介绍了如何在Linux服务器上执行Java并启动jar包, 通常我们会使用nohup直接启动,但是还是需要手动停止然后再次启动, 那如何更优雅的在服务器上启动jar包呢,让我们一起探讨一下吧。 1、初版 第一个版本是常用的做法,直接使用nohup后台启动jar包, 并将日志输出到当前文件夹n