HTML5游戏对象和共享方法

时间:2016-01-17 14:53:46

标签: javascript object html5-canvas

我在解决HTML5游戏的下面代码时遇到了一些问题。这就是我的想法,并且想知道我的理解是否正确?

1)调用实体函数时,会创建对象SELF及其方法(测试碰撞)

2)当创建Enemy对象时,它会调用函数' actor'和INHERITS来自SELF对象的函数(因为self指的是它自己)但它也是INHERITS的perform.attack方法

我不确定为什么要返回该对象,但简而言之,通过创建SELF对象,我们可以共享方法,行为和属性,以便我们创建DRY代码?

我希望我的理解是正确的?

Entity = function(type,id,x,y,spdX,spdY,width,height,color){
    // a function to call 
    var self = {
            type:type,
            x:x,
            spdX:spdX,
            y:y,
            spdY:spdY,
            width:width,
            height:height,
            color:color,
    };

    self.testCollision = function(entity2){
            var rect1 = {
                    x:self.x-self.width/2,
                    y:self.y-self.height/2,
                    width:self.width,
                    height:self.height,
            }
            var rect2 = {
                    x:entity2.x-entity2.width/2,
                    y:entity2.y-entity2.height/2,
                    width:entity2.width,
                    height:entity2.height,
            }
            return testCollisionRectRect(rect1,rect2);
    }

    return self;

}

//---------actor can be an enemy or player in the game-----//  


Actor = function(type,id,x,y,spdX,spdY,width,height,color){
    var self = Entity(type,id,x,y,spdX,spdY,width,height,color);

    self.attackCounter = 0;
    self.aimAngle = 0;
    self.atkSpd = 1;

    self.performAttack = function(){
            if(self.attackCounter > 25){    //every 1 sec
                    self.attackCounter = 0;
                    generateBullet(self);
            }
    }

    return self;
}


// ------------------Create the enemy function----------- //

Enemy = function(id,x,y,spdX,spdY,width,height){
    var self = Actor('enemy',id,x,y,spdX,spdY,width,height,'red');
    enemyList[id] = self;
}

randomlyGenerateEnemy = function(){
    //Math.random() returns a number between 0 and 1
    var x = Math.random()*WIDTH;
    var y = Math.random()*HEIGHT;
    var height = 10 + Math.random()*30;     //between 10 and 40
    var width = 10 + Math.random()*30;
    var id = Math.random();
    var spdX = 5 + Math.random() * 5;
    var spdY = 5 + Math.random() * 5;
    Enemy(id,x,y,spdX,spdY,width,height);
}

感谢您的帮助。 P

1 个答案:

答案 0 :(得分:1)

JavaScript没有本机继承。 JavaScript甚至没有继承的类 - 但是JS6有类。

Entity是一家创建&返回带有属性&的匿名self个对象一个testCollision方法。

Actor从实体请求新对象。演员添加属性&对请求的对象执行performAttack方法并返回该扩展对象。

Enemy从Actor请求一个新对象。敌人将该对象添加到数组中。

如果我们只检查此代码

如果这是Entity&使用Actor然后代码不一定分成几部分。整个最终对象(包括所有属性和所有方法)可以在randomlyGenerateEnemy中最有效地构建。

如果有更多代码使用Entity&演员

据推测(!)......

实体创建所有游戏片段(片段==字符,结构等)共有的属性和方法。借用一个数学短语,Entity使用"最常见的分母"创建一个对象。

Actor使用Actor游戏角色固有的属性和方法来增强基本的Entity对象。

Enemy只是将新的Actor对象添加到enemyList

据推测,可能还有一个Structure函数(像Actor一样)使用Structure游戏块固有的属性和方法来增强基本的Entity对象。

据推测,可能还有一个Buildings函数(像Enemy)只是将一个新的Structure对象添加到buildingsList

由于实体代码正被Actor&假定代码中的结构,假定的代码将使用DRY(不要重复自己)编码模式。