Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 26.07.2010, 18:06
Sphinx_Rider вне форума Посмотреть профиль Отправить личное сообщение для Sphinx_Rider Найти все сообщения от Sphinx_Rider
  № 1  
Ответить с цитированием
Sphinx_Rider

Регистрация: Jul 2010
Сообщений: 13
По умолчанию Дребезжание шара в игре

Здравствуйте.
Я тут одно приложение делаю, а точнее с его помощью осваиваю 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;
Вот такие вот пироги =)
Сразу прошу извинить за длинное сообщение.


Последний раз редактировалось Sphinx_Rider; 26.07.2010 в 18:10. Причина: Уточнение
Создать новую тему Ответ Часовой пояс GMT +4, время: 09:34.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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