最近我一直在尝试用 C# 编写游戏代码。我没有为此使用 XNA,因为我认为如果我从头开始编写游戏代码我会学到更多(尽管我使用的是多媒体引擎)。
我正在尝试设计一个 2D RPG 游戏——我知道这有点雄心勃勃,但我至少对游戏的基本部分(即“样板”代码)有相当好的理解,而且我已经到达了我不知道从这里去哪里的部分。
在 2D 游戏中,您通过在不同“区域”中走动来推进游戏。一旦你击中了一个“门户板 block ”,你就会被传送到下一个区域等等。
我无法理解应该如何设置这些区域对象。这是我的第一个想法:每个区域都有一些不同的集合结构(例如,可见性四叉树、碰撞四叉树、AI 实体列表等)。所以如果我要在游戏中添加一个敌人实体,它会被放入可见性四叉树、碰撞四叉树(因为你可以与实体发生碰撞)和 AI 实体列表。当该区域收到更新请求时,它会通知这些结构中的每一个进行 self 更新,而这些结构又会告诉实体进行 self 更新。到目前为止一切都很好。
我的问题是:如果这个敌人需要与其他对象通信怎么办?例如,它可能需要知道玩家是否在它的某个范围内。或者是否被玩家击中。或者所有可碰撞对象都在该区域中的位置(因此它可以寻路)。
这个问题的第一个(也是不好的)解决方案是简单地向每个实体传递一个对每个集合的引用。但这显然会鼓励紧密耦合的对象,这并不好。
我想出的第二个解决方案是让每个实体都能够通过消息结构查询该区域。因此,敌人可以说“给我一个在我位置 X 距离内的每个实体的列表”,该区域将返回一个答案。然而,这将变得越来越困难,因为我必须将越来越多的可能性编码到该区域(“给我一个不在我 X 距离内的实体列表”,“给我一个健康低于我的所有实体的列表X”等)。
我正在寻找的是针对对象间通信问题的耗时考验的解决方案,以及如何设置区域的基本方法。我想它也需要某种消息传递系统,尽管我不确定。
感谢阅读。
最佳答案
您可以查看 Mediator pattern .它可以让你有低耦合,但是是的,你会在中介对象中有很多代码来促进其他对象之间的通信。但我认为这是其中之一。然后这是更可取的。它还可以让你更自由地做一些技巧,比如排队某些更新请求并在更合适的时间处理请求,或者对很多请求进行批处理,而不是一个一个地处理它们,这会(假设地)强加某种高架。
关于c# - 游戏编程 - 二维游戏对象之间的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1677706/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调
我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser
在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee
我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行