p1.motion不是函数

时间:2018-11-18 03:03:50

标签: javascript html5-canvas

所以我一直在努力解决这个问题,大约8个小时。我有课。它具有功能。我调用了该函数。它说该功能不存在。什么?

代码如下:

class Player1 extends Character{
    constructor(maxHealth,maxEnergy,sprites,x,y,vel,facingRight){
    super(maxHealth,maxEnergy,sprites,x,y,vel,facingRight);
    }
    //move
    movement() {
        window.onkeydown = function (e){
            window.addEventListener('keydown', function (e) {
                keys = (keys || []);
                keys[e.keyCode] = (e.type == "keydown");
            })
            window.addEventListener('keyup', function (e) {
                keys[e.keyCode] = (e.type == "keydown");            
            })
            //vertical
            if (keys && keys[87])
            {   
                if(this.y-this.vel>0)
                {
                    this.moveUp(); 
                }
            }
            else if (keys && keys[83]) 
            {   
                if(this.y+this.vel<444)
                {
                    this.moveDown();
                } 
            }
            //horizontal
            if (keys && keys[65]) 
            {   if(this.x-this.vel>0)
                {
                    this.moveLeft();
                }
            }
            if(keys && keys[68])
            {
                if(this.x+this.vel>screenWidth)
                {
                    this.moveRight();
                }
            }
            //charge
            if(keys && keys[66])
            {   
                this.charge();
            }
            //shoot
            if(keys && keys[32])
            {
                if(this.shootDelay==0){
                    if(this.blastCount<10){
                        this.shoot();
                    }
                } else if (this.shootDelay>5)
                {
                    this.shootDelay=0;
                }
                this.shootDelay++;
            }
            if(!(keys && keys[32])&&!(keys && keys[66])&&!(keys && keys[68])&&!(keys && keys[65])&&!(keys && keys[83])&&!(keys && keys[87])){
                this.idle();
            }
        }
        if(this.dead==true)
        {
            this.dead();
        } 
    }
};

所以我不明白为什么它在清晰可见的地方却无法识别该功能。 这是窗口加载时调用的函数。

window.onload = function () {
    let p1 = new Player1(100, 100, GokuSpriteList, 24, 492, 5, true);
    let p2 = new Player2(100, 100, GokuBlackSpriteList, 1000, 492, 5, false);
    getSprites();
    update(p1, p2);
};

这是更新画布屏幕的功能。这也是调用移动功能的地方。

function update(p1,p2) 
{
    var c=document.getElementById("screen");
    var ctx=c.getContext("2d");

    clearCanvas(ctx);

    p1.movement();
    p2.movement();

    p1.draw(ctx);
    p2.draw(ctx);

    p1.removeBlast();
    p2.removeBlast();

    for(i=0;i<p1.blastCount;i++)
    {
        p1.blastList[i].draw(ctx);
    }
    for(i=0;i<p2.blastCount;i++)
    {
        p2.blastList[i].draw(ctx);
    }

    requestAnimationFrame(update);
};

让我知道你们是否能解决。我会去学习数学考试。谢谢。

1 个答案:

答案 0 :(得分:0)

使用import I2C_LCD_driver import time import pigpio mylcd = I2C_LCD_driver.lcd() Debounce = 0.5 Input23 = 23 Input24 = 24 Input17 = 17 Output18 = 18 Output4 = 4 pi_GPIO = pigpio.pi() pi_GPIO.set_mode(Input23, pigpio.INPUT) pi_GPIO.set_pull_up_down(Input23 , pigpio.PUD_UP) pi_GPIO.set_mode(Input24, pigpio.INPUT) pi_GPIO.set_pull_up_down(Input24 , pigpio.PUD_UP) pi_GPIO.set_mode(Input17, pigpio.INPUT) pi_GPIO.set_pull_up_down(Input17 , pigpio.PUD_UP) pi_GPIO.set_mode(Output18, pigpio.OUTPUT) pi_GPIO.set_mode(Output4, pigpio.OUTPUT) while True: if pi_GPIO.read(Input23): pi_GPIO.write(18, 0) mylcd.lcd_clear() mylcd.lcd_display_string("Input 1 Active", 1) time.sleep(Debounce) else: pi_GPIO.read(Input23) pi_GPIO.write(18, 1) mylcd.lcd_clear() mylcd.lcd_display_string("Awaiting Input", 1) mylcd.lcd_display_string("Detection", 2) time.sleep(Debounce) 时会丢失对p1, p2的引用

您无法通过requestAnimationFrame(update)将参数传递给更新函数,因此您需要以其他方式维护引用。

有很多方法可以保留参考。简单的方法是使requestAnimationFrame(update)p1成为全局变量,但这并不总是最好的方法。

您可以使用闭包来保存它们。有关更多信息,请参见代码注释。

p2