搜索
首页web前端js教程使用Visual Studio和ASP.NET在一个小时内构建网络游戏

使用Visual Studio和ASP.NET在一个小时内构建网络游戏

>本文是Microsoft的Web开发系列的一部分。感谢您支持使SitietPoint成为可能的合作伙伴。 本文讨论:

基本游戏发展哲学
  • 使用Web技术进行游戏开发
  • 添加游戏控件和AI
  • 讨论的技术:
  • Visual Studio 2013 Pro,Visual Studio 2013 Community,ASP.NET

>代码下载(.zip)

  • >您不需要全新的技能来开发游戏。实际上,您目前在HTML,JavaScript,CSS等方面的网络开发技能非常适合各种游戏。当您使用Web技术构建游戏时,它将在几乎所有带有浏览器的设备上运行。
  • > 为了证明这一点,我将展示使用Web Technologies和两个外部图书馆从头开始构建游戏,我将在不到一个小时的时间内完成。我将介绍从基本设计和布局,控件和精灵到简单对手的人工智能(AI)的各种游戏开发主题。我什至要开发游戏,以便在PC,平板电脑和智能手机上使用。如果您有作为Web开发人员或其他开发领域编程的经验,但是没有经验写游戏的经验,那么本文将使您入门。如果您给我一个小时,我保证会向您展示绳索。
  • 钥匙要点

快速开发:利用HTML,JavaScript和CSS中的现有Web开发技能来创建几乎任何带有浏览器的设备,使用Visual Studio和ASP.NET。

> Visual Studio作为工具:利用视觉工作室进行快速游戏开发和跨不同设备进行测试,确保兼容性和性能。

游戏设计简化:从基本的游戏设计原理和一个简单的游戏开始,例如“ ping”(乒乓变体),重点放在布局和基本游戏机制上。

>
    交互式元素:使用JavaScript和CSS进行动态游戏玩法,并合并交互式游戏控件,以确保诸如球和玩家之类的元素有效地响应用户输入。 AI集成:为对手实施基本人工智能,允许更具吸引力的单人游戏体验。
  • >跨平台兼容性:测试并确保游戏在各种浏览器和设备上的性能都很好
  • 启动并运行
  • >我将在Visual Studio中进行所有开发,这将在我进行更改时快速执行Web应用程序。请确保拥有最新版本的Visual Studio,以便您可以跟随。我使用了Visual Studio 2013 Pro,但通过Visual Studio 2013社区更新了代码。另外,如果您有Mac或Linux,则如今可以使用Visual Studio代码。

    这个应用程序将不需要服务器代码,因此我首先在Visual Studio中创建一个新的,空的网页项目。我将通过选择文件后选择“ Visual C#”选项来使用空网站的空C#模板。新| ASP.NET空网站。

    索引HTML文件仅需要三个资源:jQuery,主样式表和主JavaScript文件。我将一个空的CSS文件添加到名为style.css和一个空的JavaScript文件的项目中,称为ping.js,以避免加载页面时错误:

    >
    <span><span>
    </span><span><span><span>></span>
    </span><span><span><span>></span>
    </span>  <span><span><span><script> src<span >="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.1.1.min.js"</script></span>></span><span><span></span>></span>
    </span>  <span><span><span><script> src<span >="ping.js"</script></span>></span><span><span></span>></span>
    </span>  <span><span><span><link> rel<span>="stylesheet"</span> href<span>="style.css"</span>></span><span><span></span>></span>
    </span><span><span><span></span>></span>
    </span><span><span><span>></span>
    </span><span><span><span></span>></span>
    </span><span><span><span></span>></span>
    </span></span></span></span></span></span>

    也不要忘记在浏览器和设备之间对此应用进行测试(或任何其他)。虽然我编写的代码与Chrome,Firefox和Microsoft Edge等现代浏览器可互操作,但这始终是双重检查的最佳实践。现在,您可以使用免费的虚拟机和其他工具(例如http://www.browserstack.com。

    基本设计

    我正在构建的游戏是我称为ping的变体。 Ping与Pong的规则基本相同,只是任何一个玩家在涉及到球时都会抓住球,然后可以直接或向上或向下倾斜或向下发射球。通常最好在构建游戏之前绘制您希望游戏的外观。对于此游戏,我想看到的整体布局如下所示。

    >

    使用Visual Studio和ASP.NET在一个小时内构建网络游戏>一旦我开发了游戏设计布局,只是将每个元素添加到HTML以构建游戏的问题。但是,要注意的一件事是,我将对记分板和控件进行分组,以确保它们坐在一起。因此,您可以一一看到我添加了这些元素,如下所示:

    >

    <span><span><span><div> id<span>="arena"</span>>
      <span><span><span><div> id<span>="score"</span>>
        <span><span><span><h1 id="gt">></h1></span>
    </span>      <span><span><span><span> id<span>="playerScore"</span>></span>0<span><span></span></span>></span>
    </span>     <span><span><span><span> id<span>="opponentScore"</span>></span>0<span><span></span></span>></span>
    </span>   <span><span><span></span>></span>
    </span> <span><span><span></span></span></span></span></span></span>
    </div></span>></span>
    </span> <span><span><span><div> id<span>="player"</span>><span><span></span></span>
    </div></span>></span>
    </span> <span><span><span><div> id<span>="opponent"</span>><span><span></span></span>
    </div></span>></span>
    </span> <span><span><span><div> id<span>="ball"</span>><span><span></span></span>
    </div></span>></span>
    </span> <span><span><span><div> id<span>="controls-left"</span>>
       <span><span><span><div> id<span>="up"</span>><span><span></span></span>
    </div></span>></span>
    </span>   <span><span><span><div> id<span>="down"</span>><span><span></span></span>
    </div></span>></span>
    </span>  <span><span><span></span></span></span>
    </div></span>></span>
    </span>  <span><span><span><div> id<span>="controls-right"</span>>
        <span><span><span><div> id<span>="left"</span>><span><span></span></span>
    </div></span>></span>
    </span>    <span><span><span><div> id<span>="right"</span>><span><span></span></span>
    </div></span>></span>
    </span>  <span><span><span></span></span></span>
    </div></span>></span>
    </span><span><span><span></span></span></span>
    </div></span>></span>
    </span>
    >使用样式

    播放

    如果您要加载此页面,则不会看到任何东西,因为没有应用样式。我已经在HTML中设置了指向main.css文件的链接,因此我将所有CSS放在带有该名称的新文件中。我要做的第一件事是将所有内容都放在屏幕上。页面的主体需要占用整个屏幕,因此我将首先设置:>

    >第二,我需要将竞技场填充整个屏幕,并应用了竞技场背景图像(请参见下图):
    <span>body {
    </span>  <span>margin: 0px;
    </span>  <span>height: 100%;
    </span><span>}
    </span>

    <span><span>#arena</span> {
    </span>  <span>background-image: <span>url(arena.png)</span>;
    </span>  <span>background-size: 100% 100%;
    </span>  <span>margin: 0px;
    </span>  <span>width: 100%;
    </span>  <span>height: 100%;
    </span>  <span>overflow: hidden;
    </span><span>}
    </span>
    接下来,我将记分牌定位。我希望这在其他元素上出现顶部和中心。命令位置:绝对让我将其放置在我想要的任何地方:50%将其放在窗口顶部的一半,但从记分板元素的最左侧开始。为了确保它是完全居中的,我使用转换属性,Z-Index属性可确保它始终处于顶部:使用Visual Studio和ASP.NET在一个小时内构建网络游戏>

    我也希望文本字体以复古主题为主题。大多数现代浏览器都让我包括自己的字体。我从Codeman38(Zone38.net)找到了适当的按下2P字体。要将字体添加到计分板中,我必须创建一个新的字体脸:>
    <span><span>
    </span><span><span><span>></span>
    </span><span><span><span>></span>
    </span>  <span><span><span><script> src<span >="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.1.1.min.js"</script></span>></span><span><span></span>></span>
    </span>  <span><span><span><script> src<span >="ping.js"</script></span>></span><span><span></span>></span>
    </span>  <span><span><span><link> rel<span>="stylesheet"</span> href<span>="style.css"</span>></span><span><span></span>></span>
    </span><span><span><span></span>></span>
    </span><span><span><span>></span>
    </span><span><span><span></span>></span>
    </span><span><span><span></span>></span>
    </span></span></span></span></span></span>

    >现在,得分在H1标签中,因此我可以为所有H1标签设置字体。万一缺少字体,我将提供一些备份选项:

    >
    <span><span><span><div> id<span>="arena"</span>>
      <span><span><span><div> id<span>="score"</span>>
        <span><span><span><h1 id="gt">></h1></span>
    </span>      <span><span><span><span> id<span>="playerScore"</span>></span>0<span><span></span></span>></span>
    </span>     <span><span><span><span> id<span>="opponentScore"</span>></span>0<span><span></span></span>></span>
    </span>   <span><span><span></span>></span>
    </span> <span><span><span></span></span></span></span></span></span>
    </div></span>></span>
    </span> <span><span><span><div> id<span>="player"</span>><span><span></span></span>
    </div></span>></span>
    </span> <span><span><span><div> id<span>="opponent"</span>><span><span></span></span>
    </div></span>></span>
    </span> <span><span><span><div> id<span>="ball"</span>><span><span></span></span>
    </div></span>></span>
    </span> <span><span><span><div> id<span>="controls-left"</span>>
       <span><span><span><div> id<span>="up"</span>><span><span></span></span>
    </div></span>></span>
    </span>   <span><span><span><div> id<span>="down"</span>><span><span></span></span>
    </div></span>></span>
    </span>  <span><span><span></span></span></span>
    </div></span>></span>
    </span>  <span><span><span><div> id<span>="controls-right"</span>>
        <span><span><span><div> id<span>="left"</span>><span><span></span></span>
    </div></span>></span>
    </span>    <span><span><span><div> id<span>="right"</span>><span><span></span></span>
    </div></span>></span>
    </span>  <span><span><span></span></span></span>
    </div></span>></span>
    </span><span><span><span></span></span></span>
    </div></span>></span>
    </span>

    对于其他元素,我将使用一张图像片。精灵表包含一个我在一个文件中所需的游戏所需的图像(请参见下图)。

    > 使用Visual Studio和ASP.NET在一个小时内构建网络游戏

    >在此表上具有图像的任何元素都将分配一个精灵类。然后,对于每个元素,我将使用背景位置来定义我要显示的精灵表的哪一部分:

    <span>body {
    </span>  <span>margin: 0px;
    </span>  <span>height: 100%;
    </span><span>}
    </span>
    接下来,我将将Sprite类添加到所有将使用精灵表的元素中。我将不得不短暂地跳回HTML做到这一点:

    >

    <span><span>#arena</span> {
    </span>  <span>background-image: <span>url(arena.png)</span>;
    </span>  <span>background-size: 100% 100%;
    </span>  <span>margin: 0px;
    </span>  <span>width: 100%;
    </span>  <span>height: 100%;
    </span>  <span>overflow: hidden;
    </span><span>}
    </span>
    现在,我需要指示每个元素在纸板上的每个精灵的位置。同样,我将使用背景位置进行此操作:

    <span><span>#score</span> {
    </span>  <span>position: absolute;
    </span>  <span>z-index: 1000;
    </span>  <span>left: 50%;
    </span>  <span>top: 5%;
    </span>  <span>transform: translate(-50%, 0%);
    </span><span>}
    </span>
    >位置:玩家,对手和球上的绝对属性将让我使用JavaScript移动它们。如果您现在查看页面,您会看到控件和球上附有不必要的作品。这是因为精灵尺寸小于默认的128像素,因此我将其调整为正确的尺寸。只有一个球,所以我将直接设置它的大小:

    <span><span>@font-face</span> {
    </span>  <span>font-family: 'PressStart2P';
    </span>  <span>src: <span>url('PressStart2P.woff')</span>;
    </span><span>}
    </span>
    >有四个控制元素(用户可以按下按钮以移动播放器的按钮),因此我应该为他们做一个特殊的课程。我还会添加一个边距,以便它们周围有一点空间:

    <span>h1 {
    </span>  <span>font-family: 'PressStart2P', 'Georgia', serif;
    </span><span>}
    </span>
    添加此类课程后,游戏具有更好的外观控件:

    >

    <span><span>.sprite</span> {
    </span>  <span>background-image: <span>url("sprites.png")</span>;
    </span>  <span>width: 128px;
    </span>  <span>height: 128px;
    </span><span>}
    </span>
    >我需要做的最后一件事是将控件放置,以便在页面在移动设备上运行时用户的拇指。我将它们粘在底部的角落:

    <span><span><span><div> id<span>="player"</span> class<span>="sprite"</span>><span><span></span></span>
    </div></span>></span>
    </span><span><span><span><div> id<span>="opponent"</span> class<span>="sprite"</span>><span><span></span></span>
    </div></span>></span>
    </span><span><span><span><div> id<span>="ball"</span> class<span>="sprite"</span>><span><span></span></span>
    </div></span>></span>
    </span><span><span><span><div> id<span>="controls-left"</span>>
      <span><span><span><div> id<span>="up"</span> class<span>="sprite"</span>><span><span></span></span>
    </div></span>></span>
    </span>  <span><span><span><div> id<span>="down"</span> class<span>="sprite"</span>><span><span></span></span>
    </div></span>></span>
    </span><span><span><span></span></span></span>
    </div></span>></span>
    </span><span><span><span><div> id<span>="controls-right"</span>>
      <span><span><span><div> id<span>="left"</span> class<span>="sprite"</span>><span><span></span></span>
    </div></span>></span>
    </span>  <span><span><span><div> id<span>="right"</span> class<span>="sprite"</span>><span><span></span></span>
    </div></span>></span>
    </span><span><span><span></span></span></span>
    </div></span>></span>
    </span>
    >关于此设计的一件好事是一切都设置为具有相对位置。这意味着屏幕可能是许多不同的尺寸,同时仍然使游戏看起来不错。

    >

    遵循弹跳球

    >现在,我将球四处移动。对于JavaScript代码,就像我对CSS一样,我引用了一个名为ping.js的文件。我将此代码添加到带有该名称的新文件中。我将为球和每个球员制作对象,但是我将使用工厂模式作为对象。

    >

    这是一个简单的概念。当您调用它时,球功能会产生一个新的球。无需使用新关键字。这种模式通过阐明可用的对象属性来减少该变量周围的一些混乱。而且由于我只有一个小时来制作这个游戏,所以我需要最大程度地减少任何令人困惑的概念。

    当我完成简单的球类时,这种模式的结构:

    >

    为创建一个新的球,我只称其为已定义的此功能:>
    <span><span>
    </span><span><span><span>></span>
    </span><span><span><span>></span>
    </span>  <span><span><span><script> src<span >="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.1.1.min.js"</script></span>></span><span><span></span>></span>
    </span>  <span><span><span><script> src<span >="ping.js"</script></span>></span><span><span></span>></span>
    </span>  <span><span><span><link> rel<span>="stylesheet"</span> href<span>="style.css"</span>></span><span><span></span>></span>
    </span><span><span><span></span>></span>
    </span><span><span><span>></span>
    </span><span><span><span></span>></span>
    </span><span><span><span></span>></span>
    </span></span></span></span></span></span>

    >现在我想使球移动并在屏幕上弹跳。首先,我需要以某个时间间隔调用更新功能来创建球的动画。现代浏览器提供了一种用于此目的的函数,称为requestAnimationFrame。这将作为一个参数函数,并将在下次运行动画周期时称之为传递功能。当浏览器准备好进行更新时,这使球可以平稳地走动。当它调用传递功能时,它将在加载页面后将其在几秒钟内提供时间。这对于确保动画随着时间的流逝至关重要。在游戏中,requestAnimationFrame的使用如下:

    >
    <span><span><span><div> id<span>="arena"</span>>
      <span><span><span><div> id<span>="score"</span>>
        <span><span><span><h1 id="gt">></h1></span>
    </span>      <span><span><span><span> id<span>="playerScore"</span>></span>0<span><span></span></span>></span>
    </span>     <span><span><span><span> id<span>="opponentScore"</span>></span>0<span><span></span></span>></span>
    </span>   <span><span><span></span>></span>
    </span> <span><span><span></span></span></span></span></span></span>
    </div></span>></span>
    </span> <span><span><span><div> id<span>="player"</span>><span><span></span></span>
    </div></span>></span>
    </span> <span><span><span><div> id<span>="opponent"</span>><span><span></span></span>
    </div></span>></span>
    </span> <span><span><span><div> id<span>="ball"</span>><span><span></span></span>
    </div></span>></span>
    </span> <span><span><span><div> id<span>="controls-left"</span>>
       <span><span><span><div> id<span>="up"</span>><span><span></span></span>
    </div></span>></span>
    </span>   <span><span><span><div> id<span>="down"</span>><span><span></span></span>
    </div></span>></span>
    </span>  <span><span><span></span></span></span>
    </div></span>></span>
    </span>  <span><span><span><div> id<span>="controls-right"</span>>
        <span><span><span><div> id<span>="left"</span>><span><span></span></span>
    </div></span>></span>
    </span>    <span><span><span><div> id<span>="right"</span>><span><span></span></span>
    </div></span>></span>
    </span>  <span><span><span></span></span></span>
    </div></span>></span>
    </span><span><span><span></span></span></span>
    </div></span>></span>
    </span>

    请注意,随着球完成更新,函数中再次调用requestAnimationFrame。这确保了连续动画。

    >虽然此代码可以正常工作,但在页面满载完整之前,脚本可能会开始运行。为了避免这种情况,我将使用jQuery:>加载页面时启动代码

    <span>body {
    </span>  <span>margin: 0px;
    </span>  <span>height: 100%;
    </span><span>}
    </span>
    因为我知道球的速度(速度)和自上次更新以来的时间,所以我可以做一些简单的物理学来向前移动球:

    <span><span>#arena</span> {
    </span>  <span>background-image: <span>url(arena.png)</span>;
    </span>  <span>background-size: 100% 100%;
    </span>  <span>margin: 0px;
    </span>  <span>width: 100%;
    </span>  <span>height: 100%;
    </span>  <span>overflow: hidden;
    </span><span>}
    </span>
    >尝试运行代码,您会看到球以一定角度移动并从屏幕上移动。这很有趣,但是一旦球从屏幕的边缘掉下来,乐趣就会停止。因此,下一步是使球从屏幕的边缘弹起,如图7所示。添加此代码并运行该应用程序将显示一个连续弹跳的球。>

    一个可移动的播放器

    现在是时候制作播放器对象了。散开播放器类的第一步是使移动功能更改播放器的位置。侧变量将指示球员将居住的球场的哪一侧,这将决定如何水平定位球员。传递到移动函数的Y值将是播放器将移动多少或向下移动的值

    然后,我们可以布置玩家的运动,如果玩家精灵到达窗户的顶部或底部,则停止运动。>

    我现在可以创建两个玩家,并让他们移至屏幕上适当的一侧:>
    <span><span>#score</span> {
    </span>  <span>position: absolute;
    </span>  <span>z-index: 1000;
    </span>  <span>left: 50%;
    </span>  <span>top: 5%;
    </span>  <span>transform: translate(-50%, 0%);
    </span><span>}
    </span>

    键盘输入

    <span><span>@font-face</span> {
    </span>  <span>font-family: 'PressStart2P';
    </span>  <span>src: <span>url('PressStart2P.woff')</span>;
    </span><span>}
    </span>
    >因此,从理论上讲,您可以移动玩家,但是如果没有指示,它不会移动。在左侧的播放器中添加一些控件。您需要两种控制该播放器的方法:使用键盘(在PC上)并敲击控件(在平板电脑和电话上)。

    > 为了确保各种平台上的触摸输入和鼠标输入之间的一致性,我将使用出色的统一框架hand.js(handjs.codeplex.com)。首先,我将脚本添加到HTML中:

    >
    <span>h1 {
    </span>  <span>font-family: 'PressStart2P', 'Georgia', serif;
    </span><span>}
    </span>
    然后,当您按键盘键A和Z时,或者点击控件时,我将使用Hand.js和JQuery来控制播放器。

    <span><span>
    </span><span><span><span>></span>
    </span><span><span><span>></span>
    </span>  <span><span><span><script> src<span >="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.1.1.min.js"</script></span>></span><span><span></span>></span>
    </span>  <span><span><span><script> src<span >="ping.js"</script></span>></span><span><span></span>></span>
    </span>  <span><span><span><link> rel<span>="stylesheet"</span> href<span>="style.css"</span>></span><span><span></span>></span>
    </span><span><span><span></span>></span>
    </span><span><span><span>></span>
    </span><span><span><span></span>></span>
    </span><span><span><span></span>></span>
    </span></span></span></span></span></span>

    捕获球

    随着球的反弹,我想让玩家抓住球。当它被抓住时,球有一个主人,并遵循该主人的动议。我将在球的移动方法中添加功能,允许所有者,然后球将遵循:

    <span><span><span><div> id<span>="arena"</span>>
      <span><span><span><div> id<span>="score"</span>>
        <span><span><span><h1 id="gt">></h1></span>
    </span>      <span><span><span><span> id<span>="playerScore"</span>></span>0<span><span></span></span>></span>
    </span>     <span><span><span><span> id<span>="opponentScore"</span>></span>0<span><span></span></span>></span>
    </span>   <span><span><span></span>></span>
    </span> <span><span><span></span></span></span></span></span></span>
    </div></span>></span>
    </span> <span><span><span><div> id<span>="player"</span>><span><span></span></span>
    </div></span>></span>
    </span> <span><span><span><div> id<span>="opponent"</span>><span><span></span></span>
    </div></span>></span>
    </span> <span><span><span><div> id<span>="ball"</span>><span><span></span></span>
    </div></span>></span>
    </span> <span><span><span><div> id<span>="controls-left"</span>>
       <span><span><span><div> id<span>="up"</span>><span><span></span></span>
    </div></span>></span>
    </span>   <span><span><span><div> id<span>="down"</span>><span><span></span></span>
    </div></span>></span>
    </span>  <span><span><span></span></span></span>
    </div></span>></span>
    </span>  <span><span><span><div> id<span>="controls-right"</span>>
        <span><span><span><div> id<span>="left"</span>><span><span></span></span>
    </div></span>></span>
    </span>    <span><span><span><div> id<span>="right"</span>><span><span></span></span>
    </div></span>></span>
    </span>  <span><span><span></span></span></span>
    </div></span>></span>
    </span><span><span><span></span></span></span>
    </div></span>></span>
    </span>
    >当前,无法获得播放器对象的位置,因此我将getPosition和getside登录器添加到播放器对象:

    >

    <span>body {
    </span>  <span>margin: 0px;
    </span>  <span>height: 100%;
    </span><span>}
    </span>
    现在,如果球有一个所有者,它将跟随周围的所有者。但是如何确定所有者?有人必须接球。让我们确定一个球员精灵何时接触球。发生这种情况时,我将把球的所有者设置为那个球员。

    >

    <span><span>#arena</span> {
    </span>  <span>background-image: <span>url(arena.png)</span>;
    </span>  <span>background-size: 100% 100%;
    </span>  <span>margin: 0px;
    </span>  <span>width: 100%;
    </span>  <span>height: 100%;
    </span>  <span>overflow: hidden;
    </span><span>}
    </span>
    >如果您现在尝试玩游戏,则会发现球从屏幕顶部弹起,并且可以移动玩家捕捉它。现在,你怎么扔它?这就是右手控制的目的 - 赶出球。让我们为玩家添加一个“火”功能以及AIM属性。

    >

    然后,我们可以增强键盘功能以设置播放器的目标和射击功能。瞄准的工作方式略有不同。当瞄准键释放时,目标将恢复直接。
    <span><span>#score</span> {
    </span>  <span>position: absolute;
    </span>  <span>z-index: 1000;
    </span>  <span>left: 50%;
    </span>  <span>top: 5%;
    </span>  <span>transform: translate(-50%, 0%);
    </span><span>}
    </span>
    >

    最终添加将是所有控件的触摸支持。我将在正确的控件上更改玩家的目标。我还将在屏幕上的任何地方都触摸它:
    <span><span>@font-face</span> {
    </span>  <span>font-family: 'PressStart2P';
    </span>  <span>src: <span>url('PressStart2P.woff')</span>;
    </span><span>}
    </span>

    >保持得分
    <span>h1 {
    </span>  <span>font-family: 'PressStart2P', 'Georgia', serif;
    </span><span>}
    </span>

    >当球通过球员时,我想更改得分并将球交给那个球员。我将使用自定义事件,以便可以将评分与任何现有对象分开。更新功能越来越长,因此我将添加一个名为CheckScored的新私人功能:

    >

    >下面的代码对这些事件做出反应,以更新得分并交出球。将此代码添加到JavaScript文档的底部。
    <span><span>.sprite</span> {
    </span>  <span>background-image: <span>url("sprites.png")</span>;
    </span>  <span>width: 128px;
    </span>  <span>height: 128px;
    </span><span>}
    </span>

    现在,当球超越对手时(这并不困难,因为对手没有移动),您的得分就会上升,球将交给对手。但是,对手只会抓住球。
    <span><span><span><div> id<span>="player"</span> class<span>="sprite"</span>><span><span></span></span>
    </div></span>></span>
    </span><span><span><span><div> id<span>="opponent"</span> class<span>="sprite"</span>><span><span></span></span>
    </div></span>></span>
    </span><span><span><span><div> id<span>="ball"</span> class<span>="sprite"</span>><span><span></span></span>
    </div></span>></span>
    </span><span><span><span><div> id<span>="controls-left"</span>>
      <span><span><span><div> id<span>="up"</span> class<span>="sprite"</span>><span><span></span></span>
    </div></span>></span>
    </span>  <span><span><span><div> id<span>="down"</span> class<span>="sprite"</span>><span><span></span></span>
    </div></span>></span>
    </span><span><span><span></span></span></span>
    </div></span>></span>
    </span><span><span><span><div> id<span>="controls-right"</span>>
      <span><span><span><div> id<span>="left"</span> class<span>="sprite"</span>><span><span></span></span>
    </div></span>></span>
    </span>  <span><span><span><div> id<span>="right"</span> class<span>="sprite"</span>><span><span></span></span>
    </div></span>></span>
    </span><span><span><span></span></span></span>
    </div></span>></span>
    </span>
    获得Smart

    您几乎有一场比赛。如果你有一个可以和谁一起玩的人。作为最后一步,我将展示如何用简单的AI控制对手。对手会在球移动时试图与球保持平行。如果对手接球,它将随机移动并朝随机发射球。为了使人工智能感觉更加人性化,我将在所有事情中添加延误。请注意,这不是高度智能的AI,但这将是与游戏对抗的事情。

    在设计这种系统时,在各州进行思考是一件好事。对手AI有三个可能的状态:遵循,瞄准/射击和等待。我将成为遵循添加更人性化元素的行动之间的状态。仅针对AI对象开始:

    <span><span>
    </span><span><span><span>></span>
    </span><span><span><span>></span>
    </span>  <span><span><span><script> src<span >="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.1.1.min.js"</script></span>></span><span><span></span>></span>
    </span>  <span><span><span><script> src<span >="ping.js"</script></span>></span><span><span></span>></span>
    </span>  <span><span><span><link> rel<span>="stylesheet"</span> href<span>="style.css"</span>></span><span><span></span>></span>
    </span><span><span><span></span>></span>
    </span><span><span><span>></span>
    </span><span><span><span></span>></span>
    </span><span><span><span></span>></span>
    </span></span></span></span></span></span>

    >根据AI的状态,我希望它采取不同的动作。就像球一样,我将在requestAnimationframe中进行更新函数,以根据其状态制定AI法案:>

    <span><span><span><div> id<span>="arena"</span>>
      <span><span><span><div> id<span>="score"</span>>
        <span><span><span><h1 id="gt">></h1></span>
    </span>      <span><span><span><span> id<span>="playerScore"</span>></span>0<span><span></span></span>></span>
    </span>     <span><span><span><span> id<span>="opponentScore"</span>></span>0<span><span></span></span>></span>
    </span>   <span><span><span></span>></span>
    </span> <span><span><span></span></span></span></span></span></span>
    </div></span>></span>
    </span> <span><span><span><div> id<span>="player"</span>><span><span></span></span>
    </div></span>></span>
    </span> <span><span><span><div> id<span>="opponent"</span>><span><span></span></span>
    </div></span>></span>
    </span> <span><span><span><div> id<span>="ball"</span>><span><span></span></span>
    </div></span>></span>
    </span> <span><span><span><div> id<span>="controls-left"</span>>
       <span><span><span><div> id<span>="up"</span>><span><span></span></span>
    </div></span>></span>
    </span>   <span><span><span><div> id<span>="down"</span>><span><span></span></span>
    </div></span>></span>
    </span>  <span><span><span></span></span></span>
    </div></span>></span>
    </span>  <span><span><span><div> id<span>="controls-right"</span>>
        <span><span><span><div> id<span>="left"</span>><span><span></span></span>
    </div></span>></span>
    </span>    <span><span><span><div> id<span>="right"</span>><span><span></span></span>
    </div></span>></span>
    </span>  <span><span><span></span></span></span>
    </div></span>></span>
    </span><span><span><span></span></span></span>
    </div></span>></span>
    </span>
    >以下状态很简单。对手沿球的垂直方向移动,而AI向等待状态转变,以注入一些缓慢的反应时间。下面的代码显示了这两个状态:

    <span>body {
    </span>  <span>margin: 0px;
    </span>  <span>height: 100%;
    </span><span>}
    </span>
    > AI在必须跟随球和等待一秒钟之间交替。现在,将代码添加到游戏范围的更新功能:

    <span><span>#arena</span> {
    </span>  <span>background-image: <span>url(arena.png)</span>;
    </span>  <span>background-size: 100% 100%;
    </span>  <span>margin: 0px;
    </span>  <span>width: 100%;
    </span>  <span>height: 100%;
    </span>  <span>overflow: hidden;
    </span><span>}
    </span>
    >运行游戏时,您会看到对手跟随球的动作,而不是在不到30行代码的情况下进行糟糕的AI。当然,如果对手接球,那将无能为力。因此,对于一个小时的最后一个技巧,是时候处理目标状态的动作了。 我希望AI随机移动几次,然后以随机的方向发射球。让我们添加一个可以做到这一点的私人功能。将AimandFire函数添加到Aiming Case语句中,这使得可以进行功能齐全的AI。

    总结

    到目前为止,您拥有一个完整的网络游戏,可在PC,智能手机和平板电脑上使用。该游戏有许多可能的改进。例如,它在智能手机上的肖像模式中看起来会有些尴尬,因此您需要确保在景观中握住手机才能正常工作。这只是网络及以后游戏开发的可能性的一个小表明。

    <span><span>#score</span> {
    </span>  <span>position: absolute;
    </span>  <span>z-index: 1000;
    </span>  <span>left: 50%;
    </span>  <span>top: 5%;
    </span>  <span>transform: translate(-50%, 0%);
    </span><span>}
    </span>
    感谢技术专家Mohamed Ameen Ibrahim回顾了这篇文章。

    与JavaScript更多动手

    本文是Microsoft Tech传教士的Web开发系列的一部分,该系列有关实用的JavaScript学习,开源项目和互操作性最佳实践,包括Microsoft Edge浏览器和新的Edgehtml渲染引擎。

    我们鼓励您在浏览器和设备上进行测试,包括Microsoft Edge(Windows 10的默认浏览器),并在dev.modern.ie上使用免费工具:

    >扫描您的网站以获取过时的库,布局问题和可访问性

    >

    使用Mac,Linux和Windows

    的虚拟机

    >远程测试您自己的设备上的Microsoft Edge

    GitHub上的编码实验室:跨浏览器测试和最佳实践

    在Microsoft Edge上以及我们的工程师和传教士的Web平台上的深入技术学习:
        2015年Microsoft Edge Web Summit(新浏览器,新支持的Web平台标准以及JavaScript社区的来宾演讲者的期望)
      • 哇,我可以在Mac&Linux上测试Edge&IE! (来自Rey Bango)>在没有打破网络的情况下(来自克里斯蒂安·海尔曼)
      • >前进的javascript
      • > Edge渲染引擎,使网络刚刚起作用(来自Jacob Rossi)
      • >使用WebGL启用3D(来自David Catuhe,包括Vorlon.js和Babylonjs Projects)
      • 托管了网络应用程序和Web平台创新(来自Kevin Hill和Kiril Seksenov,包括歧管项目)
      • Web平台的更多免费的跨平台工具和资源:>
      • Linux,MacOS和Windows的Visual Studio代码
      • >与node.js的代码和azure
      的免费试用

      经常询问有关使用Visual Studio和ASP.NET
        建立网络游戏的问题(常见问题解答)
      • >如何使用Visual Studio和ASP.NET?
      • >创建多人游戏游戏,使用Visual Studio和ASP.NET创建多人游戏涉及多个步骤。首先,您需要设计游戏逻辑,其中包括规则,玩家互动和游戏的结果。接下来,您需要使用HTML,CSS和JavaScript创建游戏的用户界面。您可以使用ASP.NET中的SignalR库来处理服务器与客户端之间的实时通信。最后,您需要使用C#和ASP.NET在服务器端实现游戏逻辑。这涉及处理玩家连接,管理游戏状态并向所有连接的客户广播更新。
      • >在Visual Studio中,游戏开发的最佳实践是什么?工作室包括使用模型视图控制器(MVC)模式将游戏逻辑与用户界面分开,使用实体框架进行数据访问,并使用单元测试来确保您的正确性 代码。此外,您应该使用Visual Studio中的内置调试工具来识别和修复代码中的错误。

      我可以使用Visual Studio和asp.net开发移动游戏?您可以使用Visual Studio和ASP.NET开发手机游戏。但是,重要的是要注意,ASP.NET主要是​​一个网络开发框架,因此您需要使用其他工具和库来创建手机游戏。 Xamarin是Visual Studio随附的跨平台开发工具,允许您在C#中编写游戏代码,然后将其编译为Android,iOS和Windows Phone。

      >如何在Visual Studio中优化游戏的性能?首先,您应该使用内置分析工具来识别代码中的瓶颈。接下来,您可以使用诸如代码优化,数据结构优化和算法优化之类的技术来提高代码的性能。此外,您应该使用现代图形卡的硬件加速功能来提高游戏的渲染性能。

      我如何在Visual Studio中添加声音效果和音乐?在Visual Studio中为游戏的声音效果和音乐涉及使用System.Media名称空间中的Soundplayer类。您可以使用播放方法播放声音效果或音乐曲目,以及停止播放声音的停止方法。您也可以使用Playlooping方法连续播放声音。 Soundplayer类支持WAV文件,因此您需要将声音效果和音乐曲目转换为此格式。

      >如何在Visual Studio中发布我的游戏?在Visual Studio中开发的涉及多个步骤。首先,您需要在发布模式下构建游戏以创建可执行文件。接下来,您需要使用诸如InstallShield之类的工具为游戏创建安装程序。最后,您可以通过各种渠道(例如您自己的网站,在线游戏商店或应用商店。 >虽然可以使用Visual Studio和ASP.NET开发3D游戏,但对于这些工具来说,它并不是最常见的用例。 ASP.NET主要是​​一个网络开发框架,Visual Studio是一种通用开发环境。如果您有兴趣开发3D游戏,则可能需要考虑使用专用游戏开发引擎(例如Unity或Unreal Engine),这些引擎为3D游戏开发提供了更高级的工具和功能。

      >我如何添加多个 - 在Visual Studio中对我的游戏的支持?

      >在Visual Studio中为您的游戏添加多语言支持涉及使用ASP.NET的本地化功能。您可以使用资源文件为每种语言存储文本,然后使用ResourceManager类使用用户的语言设置来检索适当的文本。您还可以使用CultureInfo类来处理数字格式,日期格式和其他特定环境特定设置的差异。

      我如何在Visual Studio中测试我的游戏? Visual Studio涉及使用内置测试工具。您可以使用单元测试来测试游戏的各个组件,集成测试以测试这些组件如何共同工作以及UI测试以测试用户界面。您还可以使用Visual Studio中的调试工具来识别和修复代码中的错误。

      >我可以使用Visual Studio和asp.net开发游戏机游戏吗?

      >

      虽然在技术上可以使用Visual Studio和asp.net开发游戏机,但这并不是这些最常见的用例工具。游戏机游戏开发通常涉及使用专用游戏开发引擎(例如Unity或Unreal Engine),该引擎为游戏机游戏开发提供了更高级的工具和功能。但是,您可以使用Visual Studio和ASP.NET来开发控制台游戏的服务器端组件,例如多人游戏配对服务或排行榜系统。>

以上是使用Visual Studio和ASP.NET在一个小时内构建网络游戏的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
node.js流带打字稿node.js流带打字稿Apr 30, 2025 am 08:22 AM

Node.js擅长于高效I/O,这在很大程度上要归功于流。 流媒体汇总处理数据,避免内存过载 - 大型文件,网络任务和实时应用程序的理想。将流与打字稿的类型安全结合起来创建POWE

Python vs. JavaScript:性能和效率注意事项Python vs. JavaScript:性能和效率注意事项Apr 30, 2025 am 12:08 AM

Python和JavaScript在性能和效率方面的差异主要体现在:1)Python作为解释型语言,运行速度较慢,但开发效率高,适合快速原型开发;2)JavaScript在浏览器中受限于单线程,但在Node.js中可利用多线程和异步I/O提升性能,两者在实际项目中各有优势。

JavaScript的起源:探索其实施语言JavaScript的起源:探索其实施语言Apr 29, 2025 am 12:51 AM

JavaScript起源于1995年,由布兰登·艾克创造,实现语言为C语言。1.C语言为JavaScript提供了高性能和系统级编程能力。2.JavaScript的内存管理和性能优化依赖于C语言。3.C语言的跨平台特性帮助JavaScript在不同操作系统上高效运行。

幕后:什么语言能力JavaScript?幕后:什么语言能力JavaScript?Apr 28, 2025 am 12:01 AM

JavaScript在浏览器和Node.js环境中运行,依赖JavaScript引擎解析和执行代码。1)解析阶段生成抽象语法树(AST);2)编译阶段将AST转换为字节码或机器码;3)执行阶段执行编译后的代码。

Python和JavaScript的未来:趋势和预测Python和JavaScript的未来:趋势和预测Apr 27, 2025 am 12:21 AM

Python和JavaScript的未来趋势包括:1.Python将巩固在科学计算和AI领域的地位,2.JavaScript将推动Web技术发展,3.跨平台开发将成为热门,4.性能优化将是重点。两者都将继续在各自领域扩展应用场景,并在性能上有更多突破。

Python vs. JavaScript:开发环境和工具Python vs. JavaScript:开发环境和工具Apr 26, 2025 am 12:09 AM

Python和JavaScript在开发环境上的选择都很重要。1)Python的开发环境包括PyCharm、JupyterNotebook和Anaconda,适合数据科学和快速原型开发。2)JavaScript的开发环境包括Node.js、VSCode和Webpack,适用于前端和后端开发。根据项目需求选择合适的工具可以提高开发效率和项目成功率。

JavaScript是用C编写的吗?检查证据JavaScript是用C编写的吗?检查证据Apr 25, 2025 am 12:15 AM

是的,JavaScript的引擎核心是用C语言编写的。1)C语言提供了高效性能和底层控制,适合JavaScript引擎的开发。2)以V8引擎为例,其核心用C 编写,结合了C的效率和面向对象特性。3)JavaScript引擎的工作原理包括解析、编译和执行,C语言在这些过程中发挥关键作用。

JavaScript的角色:使网络交互和动态JavaScript的角色:使网络交互和动态Apr 24, 2025 am 12:12 AM

JavaScript是现代网站的核心,因为它增强了网页的交互性和动态性。1)它允许在不刷新页面的情况下改变内容,2)通过DOMAPI操作网页,3)支持复杂的交互效果如动画和拖放,4)优化性能和最佳实践提高用户体验。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能