上下文在OOP Javascript Pong游戏中生活在哪里?

为了练习我的面向对象知识,我使用javascript制作了一个Pong游戏(我知道,我知道它就像在吉他店里玩天国的阶梯一样)。 通过实施几种不同的技术,包括基于原型的OOP和功能风格,我已经有了几个功能版本的游戏。 然而,我没有这样做来获得我正在学习的功能性游戏。

我正在使用html5画布和普通ol'javascript,没有框架(好吧,用于捕获键盘的一点点jQuery)。 我有我的Pong对象代表我的比赛。 Pong有一个属性ctx ,其中包含对canvas.getContext("2d")上下文的引用。 它还有一个player1player2ball属性让你知道是什么。 当球和两名球员被实例化时,上下文被传递给他们的构造函数,以便他们也可以在上下文draw(ctx)方法中使用上下文的引用。 Pong有一个draw()方法,可以使用setInterval(this.draw, 10)来调用。 Pong的抽签方法可以称为两位球员和球的抽签方式。

对我来说,两位球员和球都具有上下文作为属性并不妥当。 他们不拥有上下文,因此它不应该是一个属性。 然而,使用JavaScript和画布的本质似乎是,这是最好的方式。 在这种情况下谁或应该拥有什么背景? 理想情况下,我不希望球员和球对象有一个绘制对象。 我觉得他们应该具有描述它们几何形状和位置的属性,而专用对象应该负责将它们渲染到屏幕上。 这样,如果将来我决定使用<div>而不是画布,我可以改变渲染对象,其他所有东西都不会被忽略。

我知道我正在做一个JavaScript Pong游戏比它需要更复杂,但我想练习这些技巧,并且非常喜欢OOP的概念,但是每次我想我已经破解了一个由我的'解决方案创建的全新问题'呈现自己。

编辑:如果它会帮助,如果你在我的代码有一个香味这里是一个(几乎)完全正常工作的版本:

library.js - http://mikemccabe.me/tests/pong.archive.14.06.11/library.js

pong.js - http://mikemccabe.me/tests/pong.archive.14.06.11/pong.js

试试吧 - http://mikemccabe.me/tests/pong.archive.14.06.11/


我没有看到你使用上下文的问题。 为了实现设计目标以使渲染成为独立于技术的,那么您应该为您需要的渲染方法编写通用接口,并创建一个使用context来实现此接口的对象。 然后,您可以替换该对象的另一个版本,例如,使其在Internet Explorer <9中工作。

在Javascript中,我认为使用scope允许应用程序中的对象直接访问共享资源通常很方便。 尽管这不是严格的OO设计,但将其视为单例。 例如:

var Pong = (function() {
   var Graphics, graphics, Ball, ball1, ball2, play;
   Graphics = function() {
      this.context = ...
   };
   graphics = new Graphics();
   Ball = function() {
     // do something with graphics
   };
   ball1 = new Ball();
   ball2 = new Ball();
   // ball1 and ball2 will both be able to access graphics

   play =function() {
       // play the game!
   };
   return {
       play: play
   }
}());

为了概括这一点,您可以让Graphics对象具有通用目的的方法,而不是直接提供对context访问,并且有多个版本,根据浏览器实例化正确的一个。 真的没有比较明确地给予任何缺点graphicsball1ball2除了纯粹主义。 当你处理数百个对象(例如表示DOM元素)而不仅仅是几个对象时,优势就会变得很大。


你正在使事情比他们的价值更复杂。

一个专用对象应该负责将它们渲染到屏幕上。

当你有需要做的任务时,奇怪地说,“一个对象的任务”是做这件事。 函数做事。 对象封装数据。 一个函数应该负责将它们渲染到屏幕上。

在这种情况下谁或应该拥有什么背景?

没有什么“拥有”上下文。 或者,如果你喜欢,画布拥有上下文,但我不知道你为什么要把上下文放在某个地方; 我希望这比传递它更混乱。

编辑:看你的代码,你已经使Pong封闭“拥有”(有一个参考,就是)上下文,这似乎足够合理。 我真的不明白你用这种方法会遇到什么问题。 然而,我不同意你应该将它传递给Ball的构造函数等等。我认为将它传递给各种draw()方法会更直接。


不是特定于pong,而是这本在线书

http://eloquentjavascript.net/chapter8.html

有一个建立小型游戏的例子。 虽然略有不同,但它在展示如何使用面向对象原则方面做得很好。

您可以通过多种方式对事物进行编码,并且使用设计模式很容易。 至于任何事情,请使用适度。 在使用新语言时,我一直使用Nibbles / Snake作为我的goto游戏。

链接地址: http://www.djcxy.com/p/53121.html

上一篇: Where does the context live in an OOP Javascript Pong game?

下一篇: allauth 404 error?