Я хочу добавить изображение вместо треугольника в свой код на p5. js - PullRequest
1 голос
/ 06 мая 2020

Я попытался выполнить loadImage () с помощью preload (), но он застрял при загрузке, только это не помогло мне, потому что

я просто скопировал код из источника, теперь он работает, но если я добавлю изображение, используя loadImage () не работает

Я новичок в этом, пожалуйста, помогите мне

html код

<!DOCTYPE html>
    <html>

    <head >
        <meta charset="UTF-8">
        <title> Kill Corona Virus </title>
        <script src="libraries/p5.js" type="text/javascript"></script>
        <script src="libraries/p5.dom.js" type="text/javascript"></script>
        <script src="libraries/p5.sound.js" type="text/javascript"></script>
        <script src="game.js" type="text/javascript"></script>
        <script src="scoreboard.js" type="text/javascript"></script>
        <script src="ship.js" type="text/javascript"></script>
        <script src="bubble.js" type="text/javascript"></script>
        <script src="sketch.js" type="text/javascript"></script>
        <style>
            body {
                padding: 0;
                margin: 0;
            }
            canvas {
                vertical-align: top;

            }
        </style>
    </head>


    <body style="background-color:grey;">
    </body>

    </html>

пузырь. js

function Bubble(x, y, size, speed, col, crazyness) {
    // position
    this.x = x;
    this.y = y;
    this.size = size;
    this.speed = speed;
    this.col = col;
    // should we delete?
    this.alive = true;
    // crazy fx
    this.crazyness = crazyness;

    // schedule ball for destroyal
    this.destroy = function() {
        this.alive = false;
    }

    this.setSpeed = function(newSpeed) {
        this.speed = newSpeed;
    }

    this.display = function() {
        strokeWeight(1);
        stroke(0);
        fill(this.col);

        ellipse(this.x, this.y, this.size, this.size);
    };

    // move the ball down (towards the ground)  
    this.move = function() {
        this.y += this.speed;
        this.size += random(-this.crazyness, this.crazyness);
    };

    // detects intersection with another Bubble()   
    this.intersects = function(other) {
        d = dist(this.x, this.y, other.x, other.y);
        r1 = this.size / 2;
        r2 = other.size / 2;
        if (d < r1 + r2)
            return true
        else
            return false
    }
}

игра. js

function Game(ship, scoreboard) {
    this.debug = false;

    this.ship = ship;
    this.scoreBoard = scoreboard;
    var canvas = document.querySelector("canvas")

    this.reset = function() {
        this.gameActive = false;
        this.scoreBoard.reset();
        this.meteors = [];
        this.projectiles = [];

        this.meteorsDensity = 0.985;
        this.meteorsDensityInc = 0.0001;

        this.meteorsMinSpeed = 0.25;
        this.meteorsMinSpeedInc = 0.0001;

        this.meteorsMaxSpeed = 2;
        this.meteorsMaxSpeedInc = 0.0001;

        this.meteorsMinSize = 25;
        this.meteorsMaxSize = 125;
    }

    this.isActive = function() {
        return this.gameActive;
    }

    this.start = function() {
        this.gameActive = true;
    }

    this.showWelcomeScreen = function() {
        background(255);
        textFont("Courier New");
        fill(0);
        noStroke();
        textAlign(CENTER);
        welcome_msg = "Kill Corona-virus";
        textSize(random(65, 68));
        text(welcome_msg, width / 2, height / 2);
        action_msg = "Click to start, click to play.";
        textSize(25);
        text(action_msg, width / 2, height / 4);
        score_msg = "Your previous score was " + scoreBoard.score + ".";
        textSize(25);
        text(score_msg, width / 2, height / 4 * 3);
        credits_msg = "(c) 2020 - Haseef Azhaan";
        textSize(15);
        text(credits_msg, width / 2, height / 4 * 3.75);
    }

    this.createNewMeteor = function() {
        if (random() > this.meteorsDensity) {
            // pick random color, speed, size and horizontal position
            col = color(random(255), random(255), random(255), 50);
            speed = random(this.meteorsMinSpeed, this.meteorsMaxSpeed);
            size = random(this.meteorsMinSize, this.meteorsMaxSize);
            x = random(0 + size / 2, width - size / 2);
            // vertical position is fixed
            y = -size / 2;
            // crzyness is just a visual FX
            crazyness = random(0.5, 1.5);
            //create a new "meteor" (a Bubble)
            this.meteors.push(new Bubble(x, y, size, speed, col, crazyness));
        }
    };

    this.updateAndDisplayMeteors = function() {
        for (var i = this.meteors.length - 1; i >= 0; i--) {
            this.meteors[i].move();
            this.meteors[i].display();
        }
    };

    this.updateAndDisplayProjectiles = function() {
        for (var i = this.projectiles.length - 1; i >= 0; i--) {
            this.projectiles[i].move();
            this.projectiles[i].display();
        }
    };

    this.updateAndDisplayShip = function() {
        this.ship.updatePosition();
        this.ship.display();
    };

    this.displayScoreboard = function() {
        this.scoreBoard.display();
    };
    canvas.addEventListener("keyup",(e)=>{

        if(e.key==='Enter'){alert("p")}

    })
    this.shoot = function() {

        this.projectiles.push(this.ship.shoot());
    }

    this.stopIfMeteorHitGround = function() {
        // iterate through all the meteors
        for (var i = this.meteors.length - 1; i >= 0; i--) {
            // when a meteor hits the ground, it's game over
            if (this.meteors[i].y > height) {
                this.gameActive = false;
            }
        }
    };

    this.removeLostProjectiles = function() {
        // iterate through all the projectiles
        for (var i = this.projectiles.length - 1; i >= 0; i--) {
            // if a projectile passes the screen top, it's lost (can delete it)
            if (this.projectiles[i].y < 0)
                this.projectiles.splice(i, 1);
        }
    };

    this.detectSuccessfullShots = function() {
        // iterate through all the meteors
        for (var i = this.meteors.length - 1; i >= 0; i--) {
            // for each meteor, now consider all projectiles
            for (var j = this.projectiles.length - 1; j >= 0; j--) {
                // is there a hit?
                if (this.meteors[i].intersects(this.projectiles[j])) {
                    // destroy both projectile and meteor
                    this.meteors[i].destroy();
                    this.projectiles[j].destroy();
                    // increment score! 
                    this.scoreBoard.incrementScore();
                    // increment game difficulty! :)
                    this.meteorsMinSpeed += this.meteorsMinSpeedInc;
                    this.meteorsMaxSpeed += this.meteorsMaxSpeedInc;
                    this.meteorsDensity -= this.meteorsDensityInc;
                }
            }
        }
    };

    this.removeKilledMeteors = function() {
        // remove meteors scheduled for removal
        for (var i = this.meteors.length - 1; i >= 0; i--) {
            if (!this.meteors[i].alive)
                this.meteors.splice(i, 1);
        }
    };

    this.removeUsedProjectiles = function() {
        for (var i = this.projectiles.length - 1; i >= 0; i--) {
            if (!this.projectiles[i].alive)
                this.projectiles.splice(i, 1);
        }
    };

    this.setDebug = function(v) {
        this.debug = v;
    }

    this.showDebugInfo = function() {
        if (this.debug == true) {
            print("# meteors: " + this.meteors.length);
            print("# projectiles: " + this.projectiles.length);
        }
    }
}

табло. js

function ScoreBoard(x,y) {
    // position
    this.x = x;
    this.y = y;
    // initial score
    this.score = 0;

    this.display = function() {
        noStroke();
        fill(0);
        textAlign(RIGHT);
        textFont("Courier new");
        textSize(22);
        text("score: " + this.score,this.x,this.y);
    };

    this.incrementScore = function() {
        this.score++;
    };

    this.reset = function() {
        this.score = 0;
    }
}

корабль. js

, вместо этого треугольника мне нужно изображение

function Ship(x,y) {
    // ship position
    this.x = x;
    this.y = y;
// width and height
this.width = 25;
this.height = 50;

this.display = function() {
    fill(color(255,0,0,50));
    stroke(0);
    strokeWeight(1);
    triangle(this.x - this.width, this.y,this.x, this.y - this.height,this.x + this.width, this.y);

};

// update position based on mouseX
this.updatePosition = function() {
    this.x = mouseX;
    this.y = height - 10;
};



// shoot a projectile
    this.shoot = function(){
        projectile = new Bubble(this.x, this.y - 50, 10,-10,0,0);
        return projectile;
    }
}

набросок. js

var game;
var ship_im;

function setup() {
    var a = createCanvas(windowWidth, windowHeight);

    ship = new Ship(width / 2, height / 2);
    var b = createCanvas(windowWidth, windowHeight);
    ship_im = loadImage("ship.png")
    scoreBoard = new ScoreBoard(width - 10, 20);
    game = new Game(ship, scoreBoard);
    game.reset();
    game.setDebug(true);
}

function draw() {
    if (game.isActive()) {
        background(255);
        // create new meteors
        game.createNewMeteor();
        // update position of and display stuff (meteors, projectiles, ship)
        game.updateAndDisplayMeteors();
        game.updateAndDisplayProjectiles();
        game.updateAndDisplayShip();
        // display the scoreboard
        game.displayScoreboard();
        // remove projectiles that passed the top of screen
        game.removeLostProjectiles();
        // detect successfull shots (projectile hits meteor)
        // after a successfull shoot, projectile and meteor will be marked as "dead"
        game.detectSuccessfullShots();
        // remove "dead" meteors and projectiles
        game.removeKilledMeteors();
        game.removeUsedProjectiles();
        // if a meteor hits the ground, it's game over.
        game.stopIfMeteorHitGround();
        // show debug info when enables
        //game.showDebugInfo();
    } else {
        game.showWelcomeScreen();
    }
}

function mouseClicked() {
    // when the game is active, clicking the mouse shots
    if (game.gameActive)
        game.shoot();
    // when the game is inactive, clicking the mouse restarts the game
    else {
        game.reset();
        game.start();
    }
}
function keyPressed(){
        if(keyCode===ENTER){
            if (game.gameActive)
        game.shoot();
    // when the game is inactive, clicking the mouse restarts the game
    else {
        game.reset();
        game.start();
        }

    }
}

, пожалуйста, не обращайте внимания на плохой отступ

...