那么,在面对这样的问题时,任何自尊心的极客都会做什么?当然,他们写了一个2D,侧滚动平台游戏!
在这个两部分的系列中,您将学习足够的HTML,CSS和JavaScript,使您能够构建自己的JavaScript平台游戏。我在示例中使用了原型JavaScript库,仅仅是因为这是我所知道的 - 其他许多可用的JavaScript库很可能具有等效的功能。
>在获得有趣的东西之前,我们需要浏览一些高级JavaScript技术,这将使我们能够欺骗您的浏览器,以为它是一个8位游戏机。
钥匙要点
>让我们看一些构建新类的JS代码,然后创建一个新对象:
// Declare the class <br> function WalkingSprite(element, x, y) { <br> this.x = x; <br> this.y = y; <br> this.element = element; <br> } <br> <br> WalkingSprite.prototype = { <br> x: 0, <br> y: 0, <br> element: null, <br> <br> walk: function(direction) { <br> this.x += direction; <br> } <br> } <br> <br> koopa = new WalkingSprite(null, 10, 10); <br> koopa.walk(20); <br> alert(koopa.x + "," + koopa.y);>粗略地浏览此代码,表明我们已经建立了一个名为Walkingsprite的新类,该类别具有三个属性(元素,x和y)和一个功能,称为Walk。如果我们
实例化对象的新版本并将其称为walk函数,则我们的koopa对象现在将位于坐标点(20,30)。以这种方式声明类有点麻烦 - 我们必须创建一个类,然后更新原型。值得庆幸的是,原型(库)已将其封装到一个名为Class.Create的方便函数中。以上代码变为以下内容:
与类继承一起工作var WalkingSprite = Class.create({ <br> x: 0, <br> y: 0, <br> element: null, <br> <br> initialize: function(element, x, y) { <br> this.element = element; <br> this.x = x; <br> this.y = y; <br> }, <br> <br> walk: function(steps) { <br> this.x += steps; <br> } <br> }); <br> <br> koopa = new WalkingSprite(null, 10, 10); <br> koopa.walk(20); <br> alert(koopa.x + "," + koopa.y);OOP的另一个基本组成部分是继承的概念。基本上,如果您有一个具有某些变量和函数的基类,则所有类别
不幸的是,JavaScript本身不支持继承。那么,为什么我浪费了最后一段告诉您的呢?好吧,有了一些骗局,我们可以模仿JavaScript中的类继承。 因为JavaScript中的所有内容(包括我们类中的功能)都是变量,因此我们可以将它们的值分配给其他变量。因此,如果我们考虑一秒钟的继承是什么,那么我们要做的就是模仿它,就是将属性和功能从父类复制为子类。如果我们想从上面创建的班级继承,我们可以做到这一点:>
>运行代码,您将拥有一个新类,该类具有两个属性和一个函数的父,以及一个新功能:跳跃。唯一的事情是,这样的编码并不能真正扩展; 如果您在父级中添加鸭子功能怎么办?您将不得不参加每个孩子课程并添加功能签名。再次,救援原型!我们以前了解到的班级创建函数可以将另一个类作为其第一个参数。该提供的类将成为父母,它将动态地找到我们所有的属性和功能,并自动将其注入子类。因此以上将变为:
>正如预期的那样,新类具有父类的所有相同属性!那么,添加和覆盖属性和功能呢?我们在上面说明了如何手动执行此操作,但是原型允许我们使用类定义新功能。
// Declare the class <br> function WalkingSprite(element, x, y) { <br> this.x = x; <br> this.y = y; <br> this.element = element; <br> } <br> <br> WalkingSprite.prototype = { <br> x: 0, <br> y: 0, <br> element: null, <br> <br> walk: function(direction) { <br> this.x += direction; <br> } <br> } <br> <br> koopa = new WalkingSprite(null, 10, 10); <br> koopa.walk(20); <br> alert(koopa.x + "," + koopa.y);
>在这里,我们已经覆盖了步行功能并添加了跳跃功能。等等 - 将卡车向上返回 - $超级可变从哪里弹出?好问题!使用继承时,运行父类的函数版本有时很有用。在这种情况下,我们通过将输入变量加倍并将此新值传递给父类,使角色步行最初的要求是最初要求的两倍。如果您将$ super声明为函数签名的第一个参数,则原型将在$ super变量中提供父类版本。这使您可以轻松地从覆盖版本中调用函数的父版本。您会注意到新的跳跃功能没有$ SUPER变量;我们不使用它,因此我们不需要提供它。如果我们确实需要它,我们可以将其添加为功能签名的第一个参数。
>现在,我们已经写了JavaScript类,如果我们可以通过给出特定的类名称来告诉HTML元素成为Walkingsprite对象,那不是很酷吗?在JavaScript 1.6中,您可以使用document.getElementByClassName函数轻松地找到所有具有特定类名称的DOM元素。但是,大多数浏览器尚不支持1.6版。幸运的是,原型为我们提供了$$函数 - 将其传递给CSS选择器,它将返回所有匹配元素的数组。
查看以下代码:
>var WalkingSprite = Class.create({ <br> x: 0, <br> y: 0, <br> element: null, <br> <br> initialize: function(element, x, y) { <br> this.element = element; <br> this.x = x; <br> this.y = y; <br> }, <br> <br> walk: function(steps) { <br> this.x += steps; <br> } <br> }); <br> <br> koopa = new WalkingSprite(null, 10, 10); <br> koopa.walk(20); <br> alert(koopa.x + "," + koopa.y);
首先,我们创建Walkingsprite类,然后创建使用Walkingsprite类作为父母的Koopasprite类。接下来,我们通过选择具有类名称为“ koopa”的文档中的所有元素来创建一个koopasprite对象。
>>现在,我们有了一系列的koopasprite对象,并引用了相应的dom元素(稍后会很重要)。我们在这里所做的是的基础JavaScript
。现在,我们已经动态地找到了我们感兴趣的HTML元素,我们可以绑定事件(例如OnClick和Onfocus),将它们重新列为或使它们消失!>由于我们没有编写文本驱动的冒险游戏,因此我们将需要一种使角色动画的方法。这超出了它们在屏幕上移动,稍后将覆盖。如果我们能使角色看起来像是走路,跳跃或躲避,那也将是一件好事。为此,我们将调用一个旧的CSS技巧:背景位置黑客。
这个想法很简单:我们构建了构成动画框架的图像的色带,然后通过将它们左右移动来循环它们,然后将它们左右移动。这是一个示例背景图像:
如您所见,我们在一个图像中有12帧,每个图像相距48个像素。如果我们有一个马里奥级别的div,则某些不同框架的CSS可能看起来像:
// Declare the class <br> function WalkingSprite(element, x, y) { <br> this.x = x; <br> this.y = y; <br> this.element = element; <br> } <br> <br> WalkingSprite.prototype = { <br> x: 0, <br> y: 0, <br> element: null, <br> <br> walk: function(direction) { <br> this.x += direction; <br> } <br> } <br> <br> koopa = new WalkingSprite(null, 10, 10); <br> koopa.walk(20); <br> alert(koopa.x + "," + koopa.y);
>您可能在创建无闪烁的翻车之前就已经看到了这种技术。回到过去,您将使用一小部分JavaScript创建图像翻转效果,该javaScript在发射时更改图像标签的SRC值。然而,您第一次这样做时,浏览器仍然需要从服务器下载图像,这通常会引起闪烁。可以预紧图像,但这一切都有些笨拙。上级CSS技术使设计人员可以将所有翻转状态加载到一个图像中,并使用:悬停伪级创建单独的CSS规则以移动背景,从而在没有JavaScript的情况下进行平滑的过渡。
不过,在我们的游戏引擎中,我们将使用JavaScript更改背景图像的位置。要在JS中设置背景位置,您可以操纵元素的样式。backgroundPosition属性。以下代码创建了一个名为Mariosprite的新类,该类别为Parent Walkingsprite类添加了渲染函数。此新功能随着时间延迟而反复调用,并将使用两个帧进行动画行走:
var WalkingSprite = Class.create({ <br> x: 0, <br> y: 0, <br> element: null, <br> <br> initialize: function(element, x, y) { <br> this.element = element; <br> this.x = x; <br> this.y = y; <br> }, <br> <br> walk: function(steps) { <br> this.x += steps; <br> } <br> }); <br> <br> koopa = new WalkingSprite(null, 10, 10); <br> koopa.walk(20); <br> alert(koopa.x + "," + koopa.y);
使用计时器
毫秒。我们将使用setInterval函数来实现后者:
// Declare the class <br> function WalkingSprite(element, x, y) { <br> this.x = x; <br> this.y = y; <br> this.element = element; <br> } <br> <br> WalkingSprite.prototype = { <br> x: 0, <br> y: 0, <br> element: null, <br> <br> walk: function(direction) { <br> this.x += direction; <br> } <br> } <br> <br> // Create the child class <br> JumpingAndWalkingSprite = WalkingSprite; <br> JumpingAndWalkingSprite.prototype = { <br> x: 0, <br> y: 0, <br> walk: WalkingSprite.prototype.walk <br> jump: function() { <br> y += 20; <br> } <br> }>可能值得解释JS的限制,该限制将稍后再咬住我们:JavaScript不是多线程。这意味着无法同时获得两个代码块。您可以通过设置一个毫秒间隔的单发计时器来中断另一个代码,这将迫使您的浏览器在下一个机会中运行回调函数,但是中断的代码将停止,并且不会继续执行直到中断函数。因此,将计时器设置为每毫秒射击,并不保证您的功能会很快被调用。当我谈论循环时,我们将看到这一点。
>事件侦听。
有两种不同的事件模型,具体取决于您拥有的浏览器的风味(惊喜,惊喜),尽管原型在封装了两者的细微差别方面也做得非常出色,但值得知道知道引擎盖下发生了什么。
如果您已经使用网络玩了一段时间,则可能会使用诸如OnMouseover或OnClick之类的属性熟悉内联事件处理。该技术等同于在CSS中使用样式属性 - 这是邪恶的,不要做。值得庆幸的是,有几种方法可以将事件动态绑定到JavaScript中的元素。考虑以下代码:
>
// Declare the class <br> function WalkingSprite(element, x, y) { <br> this.x = x; <br> this.y = y; <br> this.element = element; <br> } <br> <br> WalkingSprite.prototype = { <br> x: 0, <br> y: 0, <br> element: null, <br> <br> walk: function(direction) { <br> this.x += direction; <br> } <br> } <br> <br> koopa = new WalkingSprite(null, 10, 10); <br> koopa.walk(20); <br> alert(koopa.x + "," + koopa.y);>在这里,我们有三种将事件连接到DOM中的元素的不同方法。第一个使用AddEventListener是W3C标准做事的标准方式。第一个参数是事件的名称,第二个参数是回调函数的名称,第三个是布尔值,它指示我们是捕获(false)还是冒泡(true)。第二个是使用actactevent - 是Internet Explorer的方式;它与W3C版本基本相同,而没有第三个参数,因为IE仅支持事件冒泡。最后一个(使用元素的OnClick属性)是一种在所有浏览器中都起作用的方法。
> MouseOver和Mouseout之类的事件非常简单,但是键盘事件更为复杂,因为我们需要知道按下哪个键。在这种情况下,我们必须从JavaScript事件对象获取信息;事件对象要么传递到回调函数中,要么如果您在IE Land中,则在窗口对象中创建一个全局事件对象:window.event,它具有我们需要的信息。
这是一个示例:
var WalkingSprite = Class.create({ <br> x: 0, <br> y: 0, <br> element: null, <br> <br> initialize: function(element, x, y) { <br> this.element = element; <br> this.x = x; <br> this.y = y; <br> }, <br> <br> walk: function(steps) { <br> this.x += steps; <br> } <br> }); <br> <br> koopa = new WalkingSprite(null, 10, 10); <br> koopa.walk(20); <br> alert(koopa.x + "," + koopa.y);
// Declare the class <br> function WalkingSprite(element, x, y) { <br> this.x = x; <br> this.y = y; <br> this.element = element; <br> } <br> <br> WalkingSprite.prototype = { <br> x: 0, <br> y: 0, <br> element: null, <br> <br> walk: function(direction) { <br> this.x += direction; <br> } <br> } <br> <br> // Create the child class <br> JumpingAndWalkingSprite = WalkingSprite; <br> JumpingAndWalkingSprite.prototype = { <br> x: 0, <br> y: 0, <br> walk: WalkingSprite.prototype.walk <br> jump: function() { <br> y += 20; <br> } <br> }
var JumpingAndWalkingSprite = Class.create(WalkingSprite); <br> <br> mario = new JumpingAndWalkingSprite(null, 10, 10); <br> mario.walk(10): <br> alert(mario.x + "," + mario.y); <br> mario.jump(); <br> alert(mario.x + "," + mario.y); <br>>使用Event.Observe设置我们的事件处理程序允许我们丢弃有条件的测试,该测试检查我们是否通过函数参数或窗口事件具有事件对象。 这一切都是由原型对我们无缝处理的。
同时,请查看将上述理论付诸实践的演示(提示:按箭头键,看看会发生什么)。您可以下载本文的代码存档 - 查看是否可以自己扩展,因为您需要了解本系列第二篇文章的情况。直到下一次……
>关于JavaScript的娱乐和利润
的经常询问问题网站与JavaScript进行刮擦涉及使用Node.js和诸如PuppeTeer和Cheerio之类的工具。这些工具使您可以自动访问网页,与其元素进行交互并提取所需数据的过程。这对于从不提供API或自动化重复任务的网站收集信息可能很有用。
>>有几种保护您的网站免受基于JavaScript的攻击的方法。最有效的方法之一是输入验证,您可以在其中检查和对网站的所有用户输入进行消毒。另一种方法是输出编码,您可以在网站上牢固地显示任何用户提供的数据。您还可以使用仅HTTP的cookie来防止跨站点脚本(XSS)攻击。
What is penetration testing and how can JavaScript assist in it?
>我如何学习道德黑客的JavaScript?
JavaScript是唯一用于伦理hacking的语言吗?
不,javascript,javaScript不是唯一在伦理hackakic中使用的语言。 python,Ruby和PHP等其他语言也常用。 However, JavaScript is particularly useful for web-based attacks due to its ubiquity on the web.What are some common JavaScript libraries used in ethical hacking?
>
我可以使用JavaScript使用JavaScript无需任何事先编程经验吗?>>
>> ,尽管可能会学习JavaScript并将其用于无需任何事先的编程经验,而没有任何事先的编程经验,它可以进行任何概念,因此可以概念地理解。这将使您更容易理解不同的攻击如何工作以及如何有效使用JavaScript。以上是黑客javascript以获取乐趣和利润:第一部分的详细内容。更多信息请关注PHP中文网其他相关文章!