Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Дребезжание шара в игре (http://www.flasher.ru/forum/showthread.php?t=142622)

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;

Вот такие вот пироги =)
Сразу прошу извинить за длинное сообщение.


Часовой пояс GMT +4, время: 06:18.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.