3

嗨,我对 javascript 完全陌生,需要 help.im 制作 HtML javascript 游戏。我只是想问我如何让我的敌人可以点击?我已经成功地为我的游戏创建了我的敌人,但目前他们从游戏屏幕的顶部下来并在底部退出。如果玩家接触到任何敌人,那么它就会结束游戏,但我希望玩家能够点击敌人然后继续游戏结束。我已经尝试了几个星期,但我输了。

此外,我的播放器目前正由鼠标控制,因为鼠标就是播放器。

我需要更改我的 collison 测试吗?我只是不确定如何让玩家能够点击敌人。我是否需要注册一个“点击”功能,如 onmouseclick 等?

我在用着:

window.addEventListener("mousedown",onDown,false);  
window.addEventListener("mousemove",onMove,false);
window.addEventListener("mouseup",onUp,false);  

谢谢任何帮助都会很棒!只需要一点帮助就可以朝着正确的方向前进。

提前致谢 :)

这是播放器移动鼠标(播放器)时的功能。它的工作原理是我的播放器由鼠标 movememt 控制:

function onMove(e) {
                if (!e) var e = window.event;

                //get mouse position

                var posx = 0;
                var posy = 0;

                if (e.pageX || e.pageY)     {
                    posx = e.pageX;
                    posy = e.pageY;
                }

                else if (e.clientX || e.clientY)    {
                    posx = e.clientX + document.body.scrollLeft
                        + document.documentElement.scrollLeft;
                    posy = e.clientY + document.body.scrollTop
                        + document.documentElement.scrollTop;
                }

                var totalOffsetX = 0;
                var totalOffsetY = 0;
                var currentElement = canvas;

                do{
                    totalOffsetX += currentElement.offsetLeft;
                    totalOffsetY += currentElement.offsetTop;
                }
                while(currentElement = currentElement.offsetParent)

                mouseX = posx - totalOffsetX;
                mouseY = posy - totalOffsetY;

            }

    }

和鼠标:

function onUp(e) {
            mouseDown = false;
        }

对于敌人,我做了:

enemies = new Array();
            createEnemies();

以及敌人物体(游戏中的食物和水果物品)动画的功能:

function createEnemies() {
            var enemy
            if(level>2 && Math.random()<0.2) {
                var breakfastItems =  Math.floor(Math.random() * breakfastsheets.length);
                var tmpAnimation = new Animation(breakfastsheets[breakfastItems],4,2)
                enemy = new Skull(tmpAnimation,Math.random()*(canvas.width-tmpAnimation.width),-tmpAnimation.height);
            } else if(level>3 && Math.random()<0.2) {
                var randomVegetable =  Math.floor(Math.random() * vegetablesheets.length);
                var tmpAnimation = new Animation(vegetablesheets[randomVegetable],4,2)
                enemy = new Skull(tmpAnimation,Math.random()*(canvas.width-tmpAnimation.width),-tmpAnimation.height);
            }else { 
                var randomFruit = Math.floor(Math.random() * enemysheets.length);
                var tmpAnimation = new Animation(enemysheets[randomFruit],4,2)
                enemy = new Skull(tmpAnimation,Math.random()*(canvas.width-tmpAnimation.width),-tmpAnimation.height);
            }

            enemy.setExplosionSound(explosionSoundPool);

            enemies.push(enemy);
        }

忘了说敌人中的“骷髅”就是这个:尽管我没有使用导弹,但忘记导弹。

function Skull (image, x,y, width, height) {
//call constructor of parent object
DisplayObject.call(this,'skull', image, x,y, width, height);

//initialise objects
this.img.play();
this.img.setLoop(true);
this.img.setRange(0,4);

//private variables
var dying = false;
var alive = true;
var speed = 5;

var explosionSound;

//public methods

this.update = function(game_area, missiles) { //game area is a Rect2d, missiles is an array of display objects.
    this.y+=speed;
    this.img.next();
    if(!dying && missiles) {
        for(var i = 0; i<missiles.length; i++) {
            if(Collision.test(missiles[i],this)) {
                missiles[i].kill();
                dying = true;
                this.img.setRange(4,8);
                this.img.setLoop(false);
                this.img.setFrame(0);
                //play explosion sound. 
                if(explosionSound) explosionSound.play(0.5);
            }
        }
    }

    if(Collision.isOutside(this,game_area) || (dying && !this.img.isPlaying())) {
        alive = false;
    }

}

//set a sound to be played when the enemy is hit.
this.setExplosionSound = function (soundPool) {
    explosionSound = soundPool;
}

this.isDying = function () { 
    return dying; 
}

this.isDead = function () { 
    return !alive; 
}

}

Skull.prototype = new DisplayObject();

4

1 回答 1

1

假设敌人是在屏幕上移动的方形物体,

您可以做的是为包含当前位置的敌人创建一个类:

function newEnemy(){
   this.topLeftx = 'some random value'
   this.topLefty = 'some random value'
   this.bottomRightx = 'some random value'
   this.bottomRighty = 'some random value'
   this.isSelected = false;
   ...

}

然后有一个方法,当用户单击时调用,并逐个遍历敌人列表。对于每个敌人,调用一个“命中测试”函数,该函数将检查用户在鼠标上的 (x,y) 坐标是否在敌人的方格内。

如果选择了任何形状,则将它们设置为 true,然后在下一个绘制周期中,选择的敌人是否以不同的方式绘制或根本没有绘制,即被摧毁?

如果敌人是圆形的,那么您将需要一个 x,y 坐标,每个坐标都有一个半径。然后,只需检查在圆心和鼠标坐标之间绘制的线是否小于圆本身的半径。使用勾股定理求长度。

于 2012-10-15T15:33:38.590 回答