【发布时间】:2013-09-05 20:30:24
【问题描述】:
我正在制作一个游戏,其中我想要一个“玩家”object,我想在一个函数中执行此操作,但我还想将对象绑定到显示为player 的图像。我想要这个,因为我后来创建了怪物,并且我希望悬停具有与悬停类似的效果,但基于 object 的属性(即显示它们的健康)。我当前的方法不使用.data(),并使用了向后编码,虽然它适用于我现在拥有的东西,但我无法使用此代码扩展我的游戏,所以我想修复它。
这是我的尝试
function Player() {
this.currentLocation = 0;
printPlayer(this);
}
function printPlayer(p) {
$("#" + p.currentLocation).html( "<img src = 'http://3.bp.blogspot.com/-kAhN0HX-MBk/T_5bApfhbJI/AAAAAAAAAuI/lUww8xT9yV8/s1600/smileys_001_01.png'" +
"class='onTop displayCurrentHealth' alt='you' border='0' />" +
"<div class = 'healthLost hide'></div>");
}
var player = new Player();
console.log($("#" + player.currentLocation).data("inFight", "false"));
console.log($("#" + player.currentLocation).data("inFight"));
console.log($("#" + player.currentLocation).data(!"inFight"));
这是我的console.log() 结果
Object[]
adventure.js (line 62)
null
adventure.js (line 63)
null
adventure.js (line 64)
这是我的旧代码
function Player(id) {
this.id = id;
this.healthid = this.id + "health";
this.displayText = "<img src = 'http://3.bp.blogspot.com/-kAhN0HX-MBk/T_5bApfhbJI/AAAAAAAAAuI/lUww8xT9yV8/s1600/smileys_001_01.png'" +
"class='onTop displayCurrentHealth' id='" + this.id + "' alt='you' border='0' />" +
"<div id = '" + this.healthid + "' class = 'healthLost hide'></div>";
this.inFight = false;
this.currentLocation = 0;
this.xp = 0;
this.level = 1;
}
Object.defineProperty(player,"health",{
set: function() {
return 100 + ( this.level * 150 );
},
get: function() {
return 100 + ( this.level * 150 );
},
enumerable: true
} );
player.currentHealth = player.health;
Object.defineProperty(player,"strength",{
set: function() {
return ( this.level * 5 );
},
get: function() {
return ( this.level * 5 );
},
enumerable: true
} );
Object.defineProperty(player,"hitRating",{
set: function() {
return 3 + ( this.level );
},
get: function() {
return 3 + ( this.level );
},
enumerable: true
} );
我如何将它作为 jquery data() 在函数中动态创建到图像上可以有变化的位置?
--更新--
我在此添加
$("#" + player.currentLocation).data("foo");
console.log($("#" + player.currentLocation).data());
它也返回null。
--更新--
好的,所以我认为我需要某种mvc,有没有办法仅在 javascript/jquery 中执行此操作?如果是的话怎么办?请提供完整的解释和/或链接。
【问题讨论】:
-
保留数据的关键是保留包含它的DOM元素。不要每次都画一个新的玩家精灵 - 创建 一个 并移动它。这样,所有附加的数据和行为都将保留在它们所属的位置。
-
@Tomalak 我不知道该怎么做,但如果你能告诉我那真的很棒
-
用
var $player = $("<img id='player' ...>").data("whatever", value)和$("#" + p.currentLocation).append($player)代替$("#" + p.currentLocation).html("<a new img>")。不要删除代表播放器的<img>。只是移动它。 (提示:.append()在 DOM 中移动节点,因为节点只能附加到 one 父节点。) -
@Tomalak tyvvm 如果你把它放在答案中,我会接受它
-
请注意,我的回答是一个相当粗略的草图,源自您的代码。您绝对应该研究 HTML 模板,可能还应该研究 MVC/MVVM。我建议将 knockout.js 用于一种组合的、声明性的模型绑定/模板方法,它的学习曲线不那么陡峭,但功能却相当强大。 (另一方面,在没有另一个框架的情况下做事首先可以让您了解更多。一旦您对 jQuery 有信心并且可以使用它,请继续使用模型/视图框架,例如骨干网或淘汰赛。那里也是专用的游戏框架。)
标签: javascript jquery html function data-binding