JS 函数中的错误,我不知道为什么

时间:2021-03-25 17:17:45

标签: javascript arrays json function push

我正在开发一个简单的 JS 平台游戏。这是我的代码:

/*
        TODO:
        
    [X] 1. Add content to 'Game.Sprite.EditSpriteVel' (Function)
    [] 2. Figure out a way to make a hitbox that can tell which way it hit
    [X] 3. Find some game SFX
    
*/

var Game = {
    
    Canvas: null,
    
    Ctx: null,
    
    Start: function(){
        
        Game.Setup();
        
        Game.Tick();
        
    },
    
    Keyup: function(e){
        
        if(e.key == 'ArrowUp' && Game.World.Sprite.inJump === false){
            
            Game.Keys.up = false;
            
        }
        
        if(e.key == 'ArrowLeft'){
            
            Game.Keys.left = false;
            
        }
        
        if(e.key == 'ArrowRight'){
            
            Game.Keys.right = false;
            
        }
        
    },
    
    Paused: false,
    
    Keydown: function(e){
        
        if(e.key == 'ArrowUp' && Game.World.Sprite.inJump === false){
            
            Game.Keys.up = true;
            
            Game.World.Sprite.inJump = true 
            
            Game.World.Sprite.yVel = -Game.World.Sprite.jumpPower;
            
        }
        
        if(e.key == 'ArrowLeft'){
            
            Game.Keys.left = true;
            
        }
        
        if(e.key == 'ArrowRight'){
            
            Game.Keys.right = true;
            
        }
        
    },
    
    Setup: function(){
        
        Game.Canvas = document.createElement('Canvas');
        
        Game.Canvas.width = 600;
        
        Game.Canvas.height = 600;
        
        Game.Canvas.style.border = '1px solid black';
        
        document.body.appendChild(Game.Canvas);
        
        Game.Ctx = Game.Canvas.getContext('2d');
        
    },
    
    Tick: function(){
        
        if(!Game.Paused){
        
            Game.Ctx.clearRect(0, 0, 600, 600);
            
            Game.World.Platforms.Render();
            
            Game.World.RenderSprite();
            
            Game.World.EditSpriteVel();
            
            Game.World.MoveSprite();
        
            Game.World.ScreenBounds();
            
            Game.World.CheckSpriteHealth();
        
        }
        
        requestAnimationFrame(Game.Tick);
        
    },
    
    Keys: {
        
        up: false,
        left: false,
        right: false
        
    },
    
    World: {
        
        Platforms: {
          
            Index: [[{x: 200, y: 200, w: 200, h: 200}, {x: 100, y: 100, w: 100, h: 100}]],
            
            Render: function(){
                
                for(var i = 0; i < Game.World.Platforms.Index[Game.World.Map].length; i++){
                    
                    Game.Ctx.fillStyle = 'grey';
                    
                    Game.Ctx.fillRect(Game.World.Platforms.Index[Game.World.Map][i].x, Game.World.Platforms.Index[Game.World.Map][i].y, Game.World.Platforms.Index[Game.World.Map][i].w, Game.World.Platforms.Index[Game.World.Map][i].h);
                    
                }
                
            },
            
            
        },
        
        Map: 0,
        
        Level: {
            
            StartingCoords: [{x: 300, y: 0}]  
            
        },
        
        ResetLevel: function(){
            
            Game.World.Sprite.x = Game.World.Level.StartingCoords[Game.World.Map].x
            
            Game.World.Sprite.y = Game.World.Level.StartingCoords[Game.World.Map].y
            
            Game.World.Sprite.xVel = 0;
            
            Game.World.Sprite.yVel = 0;
            
            Game.World.Sprite.inJump = false
            
        },
        
        CheckSpriteHealth: function(){
            
            if(Game.World.Sprite.health <= 0){
                
                Game.World.Sprite.health = 100
                
                Game.World.Sprite.lives--;
                
                Game.World.ResetLevel();
                
            }  
            
            if(Game.World.Sprite.lives < 0){
                
                Game.World.Map = 0;
                
                Game.World.ResetLevel();
                
                Game.World.Sprite.lives = 3
                
            }
            
        },
        
        ScreenBounds: function(){
            
            if(Game.World.Sprite.x < 0){
                
                Game.World.Sprite.x = 0
                
                Game.World.Sprite.xVel = 0
                
            }
            
            if(Game.World.Sprite.x > 600 - Game.World.Sprite.size){
                
                Game.World.Sprite.x = 600 - Game.World.Sprite.size
                
                Game.World.Sprite.xVel = 0
                
            }
            
            if(Game.World.Sprite.y > 600 - Game.World.Sprite.size){
                
                Game.World.Sprite.health = 0
                
            }
             
            if(Game.World.Sprite.y < 0){
                
                Game.World.Sprite.y = 0
                
                Game.World.Sprite.yVel = 0
                
            }
            
        },
        
        Sprite: {
            
            x: 300,
            xVel: 0,
            y: 0,
            yVel: 0,
            size: 15,
            inJump: false,
            health: 100,
            jumpPower: 7.5,
            acc: 0.95,
            fri: 0.1,
            grav: 0.15,
            lives: 3,
            oldX:  0,
            oldY: 0
            
        },
        
        MoveSprite: function(){
            
            var hitting = [];
            
            for(var i = 0; i < Game.World.Platforms.length; i++){
                
                if(Game.World.Sprite.x + Game.World.Sprite.size > Game.World.Platforms[i].x && Game.World.Sprite.x < Game.World.Platforms[i].x + Game.World.Platforms[i].w && Game.World.Sprite.y + Game.World.Sprite.size > Game.World.Platforms[i].y && Game.World.Sprite.y < Game.World.Platforms[i].y){
                    
                    hitting.push(Game.World.Platforms[i])
                    
                }
                
            }
            
            Game.World.Sprite.x += Game.World.Sprite.xVel;
            
            Game.World.Sprite.y += Game.World.Sprite.yVel;
            
            console.log(hitting)

            
        },
        
        RenderSprite: function(){
            
            Game.Ctx.fillStyle = 'lightgrey';
            
            Game.Ctx.fillRect(Game.World.Sprite.x, Game.World.Sprite.y, Game.World.Sprite.size, Game.World.Sprite.size); 
            
        },
        
        EditSpriteVel: function(){
            
            if(Game.Keys.left){
                
                Game.World.Sprite.xVel -= Game.World.Sprite.acc;
                
            }
            
            if(Game.Keys.right){
                
                Game.World.Sprite.xVel += Game.World.Sprite.acc;
                
            }
            
            Game.World.Sprite.xVel *= (1 - Game.World.Sprite.fri)
            
            if(Game.World.Sprite.yVel < 7.5){
                
                Game.World.Sprite.yVel += Game.World.Sprite.grav
                
            }else{
                
                Game.World.Sprite.yVel = 7.5;
                
            }
            
        }
        
    }
    
};

document.onkeydown = function(e){ Game.Keydown(e); };
document.onkeyup = function(e){ Game.Keyup(e); };

Game.Start();
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Game</title>
    </head>
    <body>
    </body>
</html>

然而,Game.World.MoveSprite 函数并没有完成它的工作。我做了它来检测精灵正在击中哪个平台,但是,该功能不起作用,我无法弄清楚原因。我希望该函数将平台的(正在命中的)规范(以 ```JSON 格式)推送到一个数组中以供进一步使用。谢谢。

0 个答案:

没有答案