【问题标题】:jQuery spawning div and collision detectionjQuery 生成 div 和碰撞检测
【发布时间】:2014-12-24 21:53:10
【问题描述】:

所以我的学校作业项目快结束了,我只是错过了两件我似乎无法弄清楚的主要事情:

1.如何为间隙生成具有随机位置的管道障碍物,以便鸟可以飞过(尝试使用更改管道 div 的 css 'right' attr 用于间隙位置的函数),并移除当它离开屏幕底部时的管道。 (顺便说一句,它是一个倒飞鸟游戏……)

2.其次,我需要碰撞检测功能的帮助,以便我知道游戏何时结束(这不太重要,因为我认为在解决第一个问题后我可以弄清楚)

$(document).ready(function(){
//Variables
var screenWidth = $(window).width();//Screen width
var screenHeight = $(window).height();//Screen height
var birdWidth = $("#bird").width();//bird width
var y = 0;//Background y position
var astY = 0;//Pipe position

var bird = {//bird properties
    goingLeft: false,
    goingRight: false,
    lspeed: 0,
    rspeed: 0,
    maxSpeed: 10
};

setBirdPosition(screenWidth/2 - birdWidth/2, screenHeight/1.3 - birdWidth/2);
startBackgroundMovement();
spawnPipe();


//Start move the screen
function startBackgroundMovement(){
    setInterval(function()
    {
        y+=1;
    $('body').css('background-position-y',y + 'px');
    }, 10);
}


//bird starting position
function setBirdPosition(posX, posY) {
    $("#bird").css("left", posX);
    $("#bird").css("top", posY);
    bird.position = posX;
}
 (function birdLoop() {
    if (bird.goingLeft) {
        bird.lspeed = Math.min(bird.lspeed *1.1 || 1, bird.maxSpeed);
    } else {
        bird.lspeed = Math.max(bird.lspeed - 0.5, 0);
    }
    if (bird.goingRight) {
        bird.rspeed = Math.min(bird.rspeed *1.1 || 1, bird.maxSpeed);
    } else {
        bird.rspeed = Math.max(bird.rspeed - 0.5, 0);
    }
    bird.position = bird.position + (bird.rspeed - bird.lspeed);
    $("#bird").css('left', bird.position);
    requestAnimationFrame(birdLoop);
}());

//Move bird
$(document).keydown(function(e){
    switch(e.which){
        case 37://left
            bird.goingLeft= true; 
             //left edge of screen
      if (bird.position < 0) {
        bird.position = 0;
      }
      break;
        case 39://right
            bird.goingRight= true;
             //right edge of screen
      if (bird.position > screenWidth - birdWidth) {
        bird.position = screenWidth - birdWidth;
      }
        default: return;    
    e.preventDefault();//not sure if needed
    }
}).keyup(function(e){
    switch(e.which){
        case 37://left
            bird.goingLeft= false;
            //left edge of screen
       if (bird.position < 0) {
        bird.position = 0;
      }
            break;
        case 39://right
            bird.goingRight= false;
            //right edge of screen
      if (bird.position > screenWidth - birdWidth) {
        bird.position = screenWidth - birdWidth;
      }
        default: return;    
    e.preventDefault();//not sure if needed
    }
});

function spawnPipe()//spawn pipes
{
    setInterval(function()
    {
        astY += 1;
        $("#fullPipe").css("top", astY);              
    }, 10);
}
});

检查这个:http://jsfiddle.net/u38ratk9/6/

【问题讨论】:

  • 碰撞检测是通过获取一个元素的所有四个角的坐标位置来完成的——这很容易用 jQuery 完成——然后你可以比较看看另一个元素的角是否在第一个元素。
  • 我刚刚将exact duplicate 合并到这个问题中。请不要继续发布类似这样的重复问题。

标签: jquery css collision-detection flappy-bird-clone


【解决方案1】:

如何生成管道障碍

管道以固定的间隔或距离发生。您可以查看经过的时间,也可以查看现有管道经过的距离。

其次,我需要碰撞检测方面的帮助

管道具有宽度和高度,以及位置。本质上,您的管道是盒子。这对鸟来说也意味着同样的事情。我相信它被称为“边界框”。如果鸟的边缘与盒子的边缘相交,您可以检查它是否有任何边缘。

【讨论】:

    【解决方案2】:

    首先,我稍微更改了您的 CSS 以安排代码并为管道设置不同的宽度组类(“.zero”、“.one”等),您可以添加更多宽度组或稍后编辑它,但请注意管道边宽与鸟宽之间的比率。

    #bird
    {
        position:absolute;
        width:4%;
        height: auto;
        right:0;
    }
    
    #fullPipe
    {
        position:absolute;
        width:100%;
        left:0%;
        height: 10%;
    }
    
    #leftPipe, #rightPipe
    {
        position:absolute;
        top:0;
        width:48%;
        height: 100%;
    }
    
    #leftPipe
    {
        left:0%;
    }
    
    #rightPipe
    {
        right:0%;
    }
    
    .zero #leftPipe, .zero #rightPipe
    {
        width:48%;
    }
    
    .one #leftPipe
    {
        width:8%;
    }
    
    .one #rightPipe
    {
        width:88%;
    }
    
    .two #leftPipe
    {
        width:28%;
    }
    
    .two #rightPipe
    {
        width:68%;
    }
    
    .three #leftPipe
    {
        width:58%;
    }
    
    .three #rightPipe
    {
        width:38%;
    }
    
    .four #leftPipe
    {
        width:88%;
    }
    
    .four #rightPipe
    {
        width:8%;
    }
    
    #leftPipe img, #rightPipe img
    {
        width:100%;
        height: 100%;
    }
    

    在 JS 中,请注意 setInterval() 中的条件,我现在将其设置为 '700' 以进行演示,但是在您将碰撞准备就绪后,您可以将其替换为管道和主体的条件没有碰撞(超出框架)然后重置管道并设置新的宽度组类。

        var PipesRandom;
        var PipesWidth = ['zero', 'one', 'two', 'three', 'four'];  
        function spawnPipe(astY){ //spawn asteroids
            $('#fullPipe').css("top", astY);  
        }  
        setInterval(function(){
            astY += 1;
            if(astY < 700){
                spawnPipe(astY);
            } 
            else {
                astY = -100;
                PipesRandom = PipesWidth[Math.floor(Math.random() * PipesWidth.length)];
                $('#fullPipe').removeClass('zero one two three four');
                $('#fullPipe').addClass(PipesRandom);
                spawnPipe(astY);
            }
        } ,10);
    

    示例:http://jsfiddle.net/u38ratk9/8/

    关于碰撞,有很多选择,可以查看这个问题例如:Please recommend a JQuery plugin that handles collision detection for draggable elements

    或:Basic 2d collision detection

    有很多,随便搜一下。

    【讨论】:

    • 我试图做一些类似的事情,但我没有使用 if astY
    • 你没有听错,你可以得到窗口高度并将它放在一个变量中(var WindowHeight = $(window).height)然后检查'#fullPipe'位置是否更小比 WindowHeight (astY
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    相关资源
    最近更新 更多