为了练习我的 OOP 知识,我正在用 javascript 制作 Pong 游戏(我知道,我知道,这就像在吉他店玩 Stairway to Heaven)。通过实现几种不同的技术,包括基于原型的 OOP 和函数式风格,我已经拥有了游戏的多个功能版本。但是,我这样做并不是为了获得功能性游戏,而是为了学习。
我正在使用 html5 画布和纯 ol' javascript,没有框架(好的,用于键盘捕获的一点 jQuery)。我有代表我的游戏的 Pong 对象。Pong 有一个ctx
包含对canvas.getContext("2d")
上下文的引用的属性。它还有一个player1
,player2
和ball
属性,用于保存你知道什么。当球和两名球员被实例化时,上下文被传递给他们的构造函数,以便他们也可以持有对上下文的引用以在他们的draw(ctx)
方法中使用。Pong 有一个draw()
方法可以使用setInterval(this.draw, 10)
. Pong 的 draw 方法会调用两个玩家和球的 draw 方法。
两名球员和球都具有上下文作为属性,这对我来说并不合适。他们不拥有上下文,因此它不应该是一个属性。然而,使用 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