所以我几乎在学校的家庭作业项目结束时,我只是遗漏了两件似乎无法弄清楚的重大事情:
1.如何以间隙的随机位置产生管道障碍物,以便鸟类可以飞过(使用改变管道div的css'right'attr为间隙位置的功能),并移除管道离开屏幕底部时。 (这是一个像btw一样倒置的飞鸟游戏......)
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);
}
});
答案 0 :(得分:2)
如何产生管道障碍
管道以规则的间隔或距离发生。您可以检查已用时间,也可以检查现有管道的行进距离。
其次我需要有关碰撞检测的帮助
管道有宽度和高度,以及位置。基本上,你的管道是盒子。这对于鸟来说也意味着相同。我相信它被称为&#34;边界框&#34;。您可以检查鸟的任何边缘是否与盒子的边缘相交。
答案 1 :(得分:1)
首先,我已经改变了你的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
有很多,只是搜索。