| Sphinx_Rider |
26.07.2010 18:06 |
Дребезжание шара в игре
Здравствуйте.
Я тут одно приложение делаю, а точнее с его помощью осваиваю AS 3.0 =)
Представляет из себя оное игру: внизу платформа, сверху кирпичики, надо отбивать мяч платформой так, чтобы разбить все кирпичики.
Сразу скажу, что за основу взял пример из книги Гари Розенцвейга (там разрешено использовать код в учебных целях, а тем более модифицированный).
Я столкнулся с проблемой: можно запустить шар так, что одновременно:
а)он пробивает несколько блоков НАСКВОЗЬ (!)
б)он при этом попеременно летит то вверх, то вниз (от чего же он отражается? О.о)
Что могло бы послужить причиной этому и как это исправить? =)
Как я уже модифицировал приложение: http://vkontakte.ru/app1907812_21135075
Код движения мяча и столкновений с кирпичами:
Код AS3:
if (ball ==null) {
return;
}
if (lastTime ==0) {
lastTime = getTimer();
}
var timePassed:int = getTimer() - lastTime;
lastTime +=timePassed;
var newBallX = ball.x + ballDX*timePassed;
var newBallY = ball.y + ballDY*timePassed;
var oldBallRect = new Rectangle(ball.x - ballRadius,
ball.y-ballRadius, ballRadius*2, ballRadius*2);
var newBallRect = new Rectangle(newBallX-ballRadius,
newBallY-ballRadius, ballRadius*2, ballRadius*2);
var paddleRect = new Rectangle(paddle.x-paddleWidth/2,
paddle.y-paddleHeight/2, paddleWidth, paddleHeight);
if (newBallRect.bottom >= paddleRect.top) {
if (oldBallRect.bottom < paddleRect.top) {
if (newBallRect.right > paddleRect.left) {
if (newBallRect.left < paddleRect.right) {
newBallY -= 2*(newBallRect.bottom - paddleRect.top);
ballDY *= -1;
ballDX = (newBallX-paddle.x)*paddleCurve;
}
}
} else if (newBallRect.top >400) {
removeChild(ball);
ball = null;
if (balls >0) {
balls--;
gameMessage.text = "Кликните, когда будете готовы.";
} else {
endGame();
}
return;
}
}
if (newBallRect.top < wallTop) {
newBallY += 2*(wallTop - newBallRect.top);
ballDY *= -1;
}
if (newBallRect.left < wallLeft) {
newBallX += 2*(wallLeft - newBallRect.left);
ballDX *= -1;
}
if (newBallRect.right > wallRight) {
newBallX += 2*(wallRight - newBallRect.right);
ballDX *= -1;
}
for (var i:int=bricks.length-1; i>=0; i--) {
var brickRect:Rectangle = bricks[i].getRect(this);
if (brickRect.intersects(newBallRect)) {
if (oldBallRect.right < brickRect.left) {
newBallX += 2*(brickRect.left - oldBallRect.right);
ballDX *=-1;
} else if (oldBallRect.left > brickRect.right) {
newBallX += 2*(brickRect.right - oldBallRect.left);
ballDX *= -1;
}
if (oldBallRect.top > brickRect.bottom) {
ballDY *= -1;
newBallY += 2*(brickRect.bottom - newBallRect.top);
} else if (oldBallRect.bottom < brickRect.top) {
ballDY *= -1;
newBallY += 2*(brickRect.top - newBallRect.bottom);
}
if (bricks[i].currentFrame==1) {
removeChild(bricks[i]);
bricks.splice(i,1);
bricksLost();
} else {
bricks[i].gotoAndStop(bricks[i].currentFrame-1);
}
}
if (bricks.length <1) {
nextLevel();
return;
}
}
ball.x = newBallX;
ball.y = newBallY;
Вот такие вот пироги =)
Сразу прошу извинить за длинное сообщение.
|