代码之家  ›  专栏  ›  技术社区  ›  Alexis Vandepitte

Javascript游戏(P5.js)-当一个角色跳到一个方块上后,他需要一个条件的帮助才能让他落地

  •  0
  • Alexis Vandepitte  · 技术社区  · 6 年前

    我只是想创建一个小的2d游戏,我们可以控制一个角色,可以用鼠标在“地图”上放置块,然后跳上去攀爬等等。这只是一个练习的测试。

    我做到了让角色在走入街区时停下来。

    有人能帮我吗?处理字符和块之间冲突的代码位于 draw for .

    控制

    • 左: Q
    • 正确的: D
    • 跳转: Space Bar
    • 放置块: Mouse Click
    • 鼠标点击

    编辑

    function Man() {
        this.w = 20;
        this.h = 40;
        this.x = width/2;
        this.y = height - this.h;
        this.canJump = true;
    
        this.velocity = 0;
    
        this.show = function(){
            fill(255);
            rect(this.x, this.y, this.w, this.h);
        }
    
        this.update = function(){
            this.velocity += gravity;
            this.y += this.velocity;
    
            if(this.y + this.h  > height) {
                this.y = height - this.h ;
                this.velocity = 0;
                this.canJump = true;
            }
    
            if(this.x <= 0) {
                this.x = 0;
            }
    
            if(this.x + this.w >= width) {
                this.x = width - this.w;
            }
        }
    
        this.jump = function(){
            if(this.canJump) {
                man.velocity -= 6;
                this.canJump = false;
            }
        }
    }
    
    
    var man;
    var ground;
    
    var gravity = 0.4;
    
    function setup(){
        frameRate(60);
        createCanvas(640, 480);
    
        man = new Man();
    }
    
    var tilesSize = 20;
    var tiles = [];
    
    for(var i = 0; i < 640; i+= tilesSize) {
        for(var j = 0; j < 480; j+= tilesSize) {
            tiles.push({x:i, y:j, empty: true});
        }
    }
    
    function draw(){
        background(0);
        noStroke();
    
        push();
        for(var i = 0; i < tiles.length; i++) {
            if(!tiles[i].empty) {
                fill(150);
                rect(tiles[i].x, tiles[i].y, tilesSize, tilesSize);
            }
            if(mouseX >= tiles[i].x && mouseX < tiles[i].x + tilesSize && mouseY >= tiles[i].y && mouseY < tiles[i].y + tilesSize) {
                if(tiles[i].empty) {
                    fill(50);
                    rect(tiles[i].x, tiles[i].y, tilesSize, tilesSize);
                }else {
                    fill(255,0,0);
                    rect(tiles[i].x, tiles[i].y, tilesSize, tilesSize);
                }
            }
    
            // HERE IS CONDITIONS FOR COLLISION WITH BLOCK
            if(!tiles[i].empty) { 
    
                if(tiles[i].x + tilesSize >= man.x && tiles[i].x < man.x && tiles[i].y < man.y + man.h ) {      
                    man.x = tiles[i].x + tilesSize;    
                }
                if(man.x + man.w >= tiles[i].x && man.x <= tiles[i].x && tiles[i].y < man.y + man.h) {
                    man.x = tiles[i].x - man.w;
                }
            }
        }
        pop();
    
        man.show();
        man.update();
        
        moveMan(); 
    }
    
    function moveMan(){
        if(keyIsDown(81)) {
            man.x -= 2;
        }
        if(keyIsDown(68)) {
            man.x += 2;
        }
    }
    
    function keyPressed() {
        if(keyIsDown(32)) {
           man.jump();
        }
    }
    
    function mouseClicked() {
        for(var i = 0; i < tiles.length; i++) {
            if(mouseX >= tiles[i].x && mouseX < tiles[i].x + tilesSize && mouseY >= tiles[i].y && mouseY < tiles[i].y + tilesSize) {
                if(tiles[i].empty) {
                    tiles[i].empty = false;
                }else {
                    tiles[i].empty = true;
                }
            }
        }
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.7.2/p5.min.js"></script>
    0 回复  |  直到 6 年前