创造一个游戏是我童年时代的梦想,现在我真的知道自己应该如何实现自己的梦想,并在业余时间开始研究一个小游戏项目。它基本上是一种战斗类型的游戏,你有多达3个单位,以及你的对手,你轮流(因为它的http,你知道那种感觉)互相攻击并施放法术和东西。我遇到的问题是能力以及如何存储它们。基本上如果我要将数据存储在数组中,它看起来就像
$abilities = array(
0 => array(
'name' => 'Fire ball',
'desc' => 'Hurls a fire ball at your enemy, dealing X damage.'
'effect' => function($data){
$data['caster']->damage($data['target'], $data['caster']->magicPower);
}
),
1 => array(...
);
但是,如果我以这种方式存储能力,每次我需要获取有关单个能力的信息时,我需要加载整个数组并且它可能会在时间上变得非常大,所以这样做是一种巨大的记忆浪费。所以我跳到了我的另一个选项,将功能保存在mysql表中,但是我遇到了effect
部分的问题。如何将函数保存到mysql字段中并能够按需运行它?
或者,如果你可以建议另一种方法来拯救这些能力,我可能已经错过了。
答案 0 :(得分:3)
要回答有关将数组存储到数据库(如MySQL)的问题,我希望您将数组序列化为String。正常的直接序列化不起作用,因为它们不会处理关闭。
您需要使用类似super_closure的类,它可以序列化方法并将它们转换为字符串。 Read more here
https://github.com/jeremeamia/super_closure
$helloWorld = new SerializableClosure(function($data){
$data['caster']->damage($data['target'], $data['caster']->magicPower);
});
$serializedFunc = serialize($helloWorld);
现在您可以像这样创建数组:
$abilities = array(
0 => array(
'name' => 'Fire ball',
'desc' => 'Hurls a fire ball at your enemy, dealing X damage.'
'effect' => $serializedFunc
));
此数组现在可以直接保存,序列化或编码为JSON。
我建议您查看 Redis 或 Memcache 以缓存查询结果,并且不要使用MySQL来存储功能。
答案 1 :(得分:2)
你可以有树表
<强>法强>
<强> spell_effect 强>
<强> spell_effect_binder 强>
这将确保您的逻辑在php文件中,您希望它们位于哪里,但是法术,效果以及它们如何在数据库中绑定在一起的所有元素。这意味着您只需加载有需要的函数/脚本。另外,还可以为一个咒语附加多个效果。
//Firedamage.php
public function calculateEffects($level,$caster,$target) {
$extraDamage = 5*$level;
$randDamage = rand(10,50);
$caster->damage( $target, ($randDamage+$extraDamage) );
}
Spell_effect条目
<强>法强>
<强> spell_effect_binder 强>