我正在开发它正在变成一个“跨平台”2D 游戏引擎,我最初的平台目标是 iPhone 操作系统,但可以转移到 Android 或什至一些控制台,如 PSP 或 Nintendo DS,我想保持我的选择开放。
我的引擎是用 C++ 开发的,并且已经阅读了很多关于 Box2D 和 Chipmunk 的内容,但我仍然无法决定使用哪一个作为我的物理中间件。
Chipmunk 看起来很容易嵌入,而 Box2D 似乎被广泛使用。 Chipmunk 是 C 语言,Box2D 是 C++,但我听说 Box2D 的 API 比 chipmunk 的 API 差很多。
现在我将为不规则多边形(非凹面)使用引擎形状创建和碰撞检测功能。
我的值(value)观:
1) Good API's
2) Easy to integrate.
3) Portability.
当然,如果您注意到其他任何事情,我很乐意听到。
您认为哪个更符合我的需求?
编辑:我最后写了一篇关于我的特定选择的文章,你可以找到它here
最佳答案
我两者都用,但当我可以选择时,我选择花栗鼠,它有更好的 API,而且更容易学习...
但那是因为我不需要社区就学会了,手册完全没问题。
更新:我目前的游戏使用的是 Box2D,我希望我能使用 Chipmunk ......主要是因为 Box2D 有两个严重的问题,这些问题在我的游戏中更加严重:首先,它有一个非常老的错误,对象“阻碍” “在拐角处,我的游戏是突破性游戏,所以当球沿着墙壁“滚动”时,有时它会卡住并被甩离墙壁,很多人问为什么我的游戏物理看起来是“随机的”。
Box2D 的其他问题是它如何存储对象,Chipmunk 使用空间散列,而 Box2D 使用二叉树,我的游戏在包含大量对象的关卡中速度大幅下降,我问 Erin(Box2D 的作者)原因,他解释说因为 Box2D 使用二叉树,如果你把对象放在一个网格中(就像我说的,我的游戏是一个突破性的克隆!一切都在一个网格中!)树变得不平衡,Box2D 变慢了。我的游戏的解决方案是将某些级别设置为“棋盘”模式以避免此问题。
所以,对于所有基于图 block 的游戏,我将只使用 Chipmunk,Box2D 真的不适合那些(因为图 block 角上的“阻碍”错误,以及图 block 网格的减速错误)
关于c++ - 用于 C++ 2D GameEngine 的 Chipmunk Physics 或 Box2D?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2707106/
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
当我使用has_one时,它工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我正在使用带有Rails的Devise,我想添加一个方法“getAllComments”,所以我这样写:classUser在我的Controller中:defdashboard@user=current_user@comments=@user.getAllComments();end当我访问我的url时,我得到了undefinedmethod`getAllComments'for#我做错了什么?谢谢 最佳答案 因为getAllComments是一个类方法,而您正试图将其作为实例方法访问。您要么需要访问它:User.getAllCom
我正在使用Rails3.2.3和Ruby1.9.3p0。我发现我经常需要确定某个字符串是否出现在选项列表中。看来我可以使用Ruby数组.includemethod:或正则表达式equals-tildematchshorthand用竖线分隔选项:就性能而言,一个比另一个好吗?还有更好的方法吗? 最佳答案 总结:Array#include?包含String元素,在接受和拒绝输入时均胜出,对于您的示例只有三个可接受的值。对于要检查的更大的集合,看起来Set#include?和String元素可能会获胜。如何测试我们应该根据经验对此进行测试
我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“
有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=