我正在使用flash actionscript 3制作射击游戏,并对逻辑流程以及如何巧妙地使用OOP概念提出一些疑问。
主要有3个班级:
我想要做的是找出敌人是否被子弹击中并做了必须做的事情......
我现在正在做的是我有一个ENTER_FRAME事件,我在其中检查每个敌方单位(保存在数组中)的碰撞检测与创建的项目符号实例,如果它发生碰撞,则执行所有必要的操作。主要类..在过程中堵塞Main类..
这是正确的技术吗?或者有更好的解决方案吗?
答案 0 :(得分:4)
尝试考虑更多OOP,负责任的每个对象是什么?
我们有能够击中的敌人:
class Enemy : extends NPC implements IHittable {
. . .
function update(delta) {
// move, shoot, etc.
}
function handleHit(bullet) {
// die
}
}
一个可击中的对象:
interface IHittable {
function handleHit(bullet);
}
子弹应该移动并击中东西:
class Bullet : {
function update(delta) {
// update position
}
function checkHits(world:World) {
for each(var hittable:IHittable in world.objects) { // might want to cluster objects by location if you're handling lots of objects / bullets)
if (isColidingWith(hittable))
o.handleHit(bullet);
}
}
}
然后我们拥有一切内在的世界:
class World {
var npcs: Array ...
var bullets: Array ...
var hittables: Array ...
function update(delta) {
foreach(var c:NPC in npcs)
c.update(delta);
foreach(var b:Bullet in bullets) {
b.update(delta);
b.checkCollisions(world);
}
}
}
你的主循环很简单:
var lastTime:int;
function onEnterFrame(...) {
var now:int = getTimer(); // FlashPlayer utility function to get the time since start (in ms)
world.update(now - lastTime);
lastTime = now;
}
其他几点说明:
尝试根据delta
时间进行所有计算,否则游戏的速度会因帧率而异。
当一个角色死亡时会发生什么?子弹消失了?好吧,你可以通过以下几种方式做到:
EnemyDied
并将其从世界中删除CanDie
属性)的接口get dead():Boolean
,并在每次更新时使用它来清理世界。Enemy
类中的敌人,因为那样你将使用应该由World
处理的代码来污染类,这将很难保持以后。 很抱歉答案很长,但我无法自拔:)
答案 1 :(得分:0)
如果问题是Main类太长,这里有几种可能性。
上面基本上是从更具体的代码到更通用的代码的循环。在完善最后一步的过程中,您将再次编写一些具体的代码。这将使你进入第1步。泡沫,冲洗,重复:)事实上,你不想写OO代码,或程序代码或当天时尚告诉你要做的任何事情。你想写出好的代码:)你可以通过从更通用到更具体的再到更通用的方式来实现它,直到它完美无缺:P
可能不是最好的答案,但你必须承认,你没有提供太多信息来给你更准确的答案。