| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Центр помощи > [Delphi] Арканойд. |
| Автор: MotokoK 12.3.2010, 18:28 | ||
Добрый вечер. Я только начала изучать делфи после Паскаля и сейчас пишу на нем курсовую, тема Арканойд.Без каких либо графических наворотов,просто игра прямо на форме.Столкнулась с многими сложнастями например с такой. Вот кусочек кода из самого начала.
В задумке по нажатие "Новая игра" у пользователя спрашивают имя,а послее ввода и нажатия на Enter запрос и поле ввода уничтожаются.Вот только вобще ничего не проиходит. |
| Автор: ИванМ 12.3.2010, 20:23 |
| откуда взялась процедура Edit1KeyDown если Edit1 создается динамически? |
| Автор: Frees 14.3.2010, 00:13 |
| http://www.delphisources.ru/pages/faq/faq_delphi_basics/InputQuery.php.html |
| Автор: MotokoK 14.3.2010, 14:01 |
| ИванМ Эм процедуру сама руками написала... |
| Автор: ИванМ 14.3.2010, 15:25 | ||
MotokoK, а связать ее с объектом?
|
| Автор: MotokoK 14.3.2010, 20:29 | ||||||
| ИванМ Спасибо большое,теперь умею связывать денамически созданые объекты с процедурами. Вот только не знаю как правильно их разрушать,потому что от edit1.destroy Ошибка. Подскажите пожалуйста как удалять обекты. Но в этом случае наверно InputQuery больше подходит.Но теперь еще больше вопросов.Задам попорядку.
Вобщем вопросы. Во-первых
Как сделать чтобы 1:Не выдавало ошибку при ведение мишки по форме до начала новой игры.А то ошибка потому что player еще не создан. 2:Убрать курсор мыши. 3:Привязать скорость к перемешению мыши.Т.е чтобы пластика двигалась с заданой скоростью. 4:Чтобы не выезжала за правый край формы. и вот тут чуть посложнее
Это очень упрошенный способ рекашета шарика от платформы,но существует формула arccos((x-0.5l)/0.5l), где l - общая длина платформы, а x - расстояние от левого края платформы до точки удара шарика. Но я немогупонять к чему прировнять arccos((x-0.5l)/0.5l). Получается нужно добавлять в класс шара переменную угла его отражения, и как тогда узнать х при столкновение. Очень прошу ответить на все вопросы.Думаю уже неделю на ними совсем ничего не выходит. |
| Автор: MotokoK 14.3.2010, 22:30 | ||||||||
можно пример?
Понятно что с помощью if,я думала так
или
Но это не подходит. |
| Автор: ИванМ 14.3.2010, 23:08 | ||||
Если чуть перефразировать
на такое:
то должно подойти. |
| Автор: MotokoK 17.3.2010, 21:53 |
| Спасибо,так сработало. Вот еще 2 вопроса. Как сделать так чтобы курсор не выходил за форму во время игры? И второй это про разрушения. У меня неполучается динамически удалять обекты.Например в момент проигрыша или при попадании шарика в кирпич.Как реализовать разрушение объектов? |
| Автор: ИванМ 17.3.2010, 23:02 | ||||
Покажи свой код. |
| Автор: MotokoK 18.3.2010, 08:38 | ||||
Я думаю это ошибка сзвязаня с тем что это массив и обрабатывается в цикле потоу что уничтажение шарика у меня получилось и все работает
А и еще на счет мышки есть такая проблема.Поскольку движения курсора приравнены к левой стороне игрока,то когда он упирается в правый край формы и уже не движется курсор еще может двигатся до края формы.Поэтому при движение обратно игрок движется не сразу. |
| Автор: ИванМ 18.3.2010, 23:25 |
| MotokoK, как мне представляется, ошибка происходит из-за того, что после уничтожении элемента массива к этому массиву снова идет обращение в цикле, и в т.ч. к тому элементу, который уже удален. Поэтому самый простой способ это после удаления элемента присвоить ему значение nil, а потом в цикле проверять, равен ли он nil или нет, и в зависимости от этого работать с ним или нет. Что касается правой части экрана, то можно, например, сделать ограничение курсора не до правого края формы, а отнять от этого значения еще длину игрока. Это не очень, конечно, грамотный подход, но зато самый простой. |
| Автор: MotokoK 20.3.2010, 17:05 | ||||||
Если имеется в виду вычитать ширину отсюда
то я не понимаю как это сделать,не совпадают же типы. А с этим
что делать после else т.е если wall[i]=nil |
| Автор: ИванМ 20.3.2010, 23:44 | ||
Видимо ничего не делать |
| Автор: MotokoK 23.3.2010, 01:07 | ||
Уничтожение кирпичей не работает =(
ошибка памяти |
| Автор: ИванМ 23.3.2010, 15:22 | ||
В этой строке идет обращение к wall, без проверки на nil. |
| Автор: MotokoK 26.3.2010, 02:12 | ||||
| Спасибо большое. Сегодня добавила "бонусы" какие по идее должны быть в арканойде,но запнулась на одном моменте. Бонус случайно создается при уничтожение "кирпича" и падает вниз, если его поймать то таймером проверяется
и бонус эффект например такой
А вот как написать отключение бонуса по прошествию времени я не знаю. И с этим канечно проблема с этим. "arccos((x-0.5l)/0.5l), где l - общая длина платформы, а x - расстояние от левого края платформы до точки удара шарика." Можете подсказать как вычислять Х и к чему приравнивать эту формулу.Шарику нужно ввести переменную хранащую угол падения? |
| Автор: ИванМ 28.3.2010, 14:45 | ||
Создаешь новый таймер и ставишь ему интервал = времени работы бонуса. Когда бонус начинается, включаешь таймер и переменную, связанную с бонусом. Когда возникает событие таймера, отключаешь таймер и переменную, связанную с бонусом. Можно вообще эту переменную не использовать, а в программе проверять, включен таймер или нет. Если да, то работаем с бонусом, если нет - то не работаем. Это конечно по-лаймерски, зато просто.
Из этой формуле нельзя вычислить x, потому что эта формула ничему не равна. Должен быть знак =. |