上下文在OOP Javascript Pong游戏中生活在哪里?
为了练习我的面向对象知识,我使用javascript制作了一个Pong游戏(我知道,我知道它就像在吉他店里玩天国的阶梯一样)。 通过实施几种不同的技术,包括基于原型的OOP和功能风格,我已经有了几个功能版本的游戏。 然而,我没有这样做来获得我正在学习的功能性游戏。
我正在使用html5画布和普通ol'javascript,没有框架(好吧,用于捕获键盘的一点点jQuery)。 我有我的Pong对象代表我的比赛。 Pong有一个属性ctx
,其中包含对canvas.getContext("2d")
上下文的引用。 它还有一个player1
, player2
和ball
属性让你知道是什么。 当球和两名球员被实例化时,上下文被传递给他们的构造函数,以便他们也可以在上下文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
访问,并且有多个版本,根据浏览器实例化正确的一个。 真的没有比较明确地给予任何缺点graphics
既ball1
和ball2
除了纯粹主义。 当你处理数百个对象(例如表示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?