![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Voker57 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 278 Регистрация: 18.2.2003 Где: Краснодар Репутация: нет Всего: 1 |
Есть такая игра - змея. Она ещё бывает на тетрисах и сотовых. Там змейка ползает и ест яблоки. Съест-увеличивается. Так может кто знает как сделать так чтобы если не нажата НИ ОДНА кнопка змея двигалась в текущем направлении? VC 6.0 ++
-------------------- Но кто из вас не прав, кто виноват во всей создавшейся никчёмной сложности Судить об этом не имею никакой возможности. При следующем свидании вы сами выйдете из тупика. Ну, до свидания, пока. :-) Д.И. Хармс Самый радиоактивно загрязненный сайт 2004 |
|||
|
||||
DENNN |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Ну ты же знаешь направление змеи? Вот и прибавь одну клетку в этом направлении, в чем проблема?
![]() |
|||
|
||||
Voker57 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 278 Регистрация: 18.2.2003 Где: Краснодар Репутация: нет Всего: 1 |
Так у меня непонятно где ставить... ну в общем может тебе на мыло кинуть а то это длинная история
-------------------- Но кто из вас не прав, кто виноват во всей создавшейся никчёмной сложности Судить об этом не имею никакой возможности. При следующем свидании вы сами выйдете из тупика. Ну, до свидания, пока. :-) Д.И. Хармс Самый радиоактивно загрязненный сайт 2004 |
|||
|
||||
DENNN |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Если кода неочень много то кидай, если строк много то быстро не обещаю-работы постоянно много.
|
|||
|
||||
MuToGeN |
|
|||
![]() Лесник ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4379 Регистрация: 15.8.2002 Где: Москва Репутация: нет Всего: 32 |
У меня это решалось с помощью трехмерного массива - для каждого пикселя (блока) направление движения змеи (0, если ее там нет). Такой подход так же решает проблему, какой блок считать последним после того, как прежний "последний" исчез, и как отследить столкновение змеи с самой собой.
-------------------- Three pings for the token rings, Five pings for the UNIX machines, Hundred pings for the broken links, One special ping to check them all Through Simple Network Management Protocol! |
|||
|
||||
Voker57 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 278 Регистрация: 18.2.2003 Где: Краснодар Репутация: нет Всего: 1 |
Ну я как бы не очень опытный программист и на паскале я как-то и без 3D всё решал - но забыл как... ![]() 2DENNN: Куда кидать-то? Это сообщение отредактировал(а) Voker57 - 24.6.2003, 16:01 -------------------- Но кто из вас не прав, кто виноват во всей создавшейся никчёмной сложности Судить об этом не имею никакой возможности. При следующем свидании вы сами выйдете из тупика. Ну, до свидания, пока. :-) Д.И. Хармс Самый радиоактивно загрязненный сайт 2004 |
|||
|
||||
MuToGeN |
|
|||
![]() Лесник ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4379 Регистрация: 15.8.2002 Где: Москва Репутация: нет Всего: 32 |
Не было там никакого трехмерного массива, обычный двухмерный, и не более... Решение достаточно простое, кстати. Как для применения, так и для понимания. И быстрое, и памяти лишней не жрет... Если что, кидай на [email protected] свой код -------------------- Three pings for the token rings, Five pings for the UNIX machines, Hundred pings for the broken links, One special ping to check them all Through Simple Network Management Protocol! |
|||
|
||||
Voker57 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 278 Регистрация: 18.2.2003 Где: Краснодар Репутация: нет Всего: 1 |
Я тут кое-что выяснил:
Вот что мне реально надо: как отследить если в единицу времени не произошло ничего? -------------------- Но кто из вас не прав, кто виноват во всей создавшейся никчёмной сложности Судить об этом не имею никакой возможности. При следующем свидании вы сами выйдете из тупика. Ну, до свидания, пока. :-) Д.И. Хармс Самый радиоактивно загрязненный сайт 2004 |
|||
|
||||
&-ray |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 406 Регистрация: 15.4.2003 Где: Казахстан, г Аста на Репутация: нет Всего: нет |
Я делал змейку на Делфях так:
игровое поле - двумерный массив (заполняешь его, определенное значение - определенная "штучка" на игровом поле); сама змея - одномерный динамический массив - туда записываем последовательность всех составляющих змейки; глобальная переменная - 1 - змейка движется вверх, 2 - вниз и т.д. при нажатии на стрелки клавиатуры изменяем эту переменную, исходя из того, какая стрелка была нажата; по таймеру обрабатываем значение этой переменной и двигаем змейку в нужном направлении, исходя из координат ее головы и хвоста -------------------- "Совсем неважно от чего помрешь, ведь куда важнее - для чего родился..." С.Б. -------------------- И снова мышь беру я в руки Куда иду? - Конечно в сруки! |
|||
|
||||
Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 92 |
Если я тебя правильно понял, то у тебя проблема с тем, что пока не нажата клавиша, то ничего не происходит.
Я, когда писал змейку, то просто устанавливал таймер, который генерировал сообщение WM_TIMER через небольшие интервалы времени (~100 мс), и по этим сообщениям изменял положение змейки и перерисовывал экран. А ещё есть другой вариант, если ты пишешь без MFC, то есть на "чистом" Win32 API то в WinMain() вместо чего-то такого: while (GetMessage (&msg, NULL, 0, 0)){ TranslateMessage (&msg); DispatchMessage (&msg); } можно написать что-то другое, вроде: while(1){ if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage (&msg); DispatchMessage (&msg); if(msg.message==WM_QUIT) break; } NextFrame(); // твоя функция двигающая змею, перерисовывающая экран и т.п. } Дело в том что GetMessage() ждёт появления сообщения, а PeekMessage() -- нет. Поэтому цикл будет крутиться без остановок, и ты получишь максимально возможную частоту кадров в игре. Кстати, я змейку в своё время за 2 дня написал. ![]() -------------------- Да. Именно так. |
|||
|
||||
Voker57 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 278 Регистрация: 18.2.2003 Где: Краснодар Репутация: нет Всего: 1 |
А как это? Напиши код,если не трудно
А я пишу уже 2 года ![]() -------------------- Но кто из вас не прав, кто виноват во всей создавшейся никчёмной сложности Судить об этом не имею никакой возможности. При следующем свидании вы сами выйдете из тупика. Ну, до свидания, пока. :-) Д.И. Хармс Самый радиоактивно загрязненный сайт 2004 |
||||
|
|||||
Дрон |
|
||||||||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 92 |
Код говоришь... Я-то напишу, только я так и не понял, с использованием чего ты пишешь, поэтому приведу два варианта (они, в общем-то, похожи).
Первый. Application using MFC. (Не силён я в этом, если честно...) Будем считать, что мастер создал за тебя основу твоего приложения. И пусть, есть у тебя функция StartGame(), которая начинает новую игру. В ней ты инициализируешь переменные, обнуляешь счётчик очков и т.д. И в ней же ты создаёшь таймер, примерно так:
Где theApp - твоё приложение, m_pMainWnd - главное окно. Здесь: 123 - идентификатор таймера, чтобы отличать, если их несколько 100 - время в миллисекундах, через которые будет срабатывать таймер TimerProc - имя функции-обработчика Функция-обработчик, естественно, должна быть описана заранее:
А когда тебе нужно удалить таймер (игра окончена) пишешь так:
Кажется так. Если кто-нибудь увидел здесь что-нибудь неправильное, то я с вами заранее полностью согласен ![]() А теперь второй способ. Application NOT using MFC. Просто Win32 Application Пусть:
TimerProc() точно такая же.
Вот так. Это как-то к сердцу ближе ![]() Ты спросишь, а где здесь WM_TIMER? Лучше забудь... А ещё лучше почитай документацию. Хотя бы Microsoft® Win32® Programmer's Reference. P.S. Надеюсь, не слишком утомил? ![]() -------------------- Да. Именно так. |
||||||||||
|
|||||||||||
Voker57 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 278 Регистрация: 18.2.2003 Где: Краснодар Репутация: нет Всего: 1 |
Спасибо!!!!!!!!!
-------------------- Но кто из вас не прав, кто виноват во всей создавшейся никчёмной сложности Судить об этом не имею никакой возможности. При следующем свидании вы сами выйдете из тупика. Ну, до свидания, пока. :-) Д.И. Хармс Самый радиоактивно загрязненный сайт 2004 |
|||
|
||||
Voker57 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 278 Регистрация: 18.2.2003 Где: Краснодар Репутация: нет Всего: 1 |
Чё-то не выходит...
Я объявил эту функцию и вызываю SetTimer так:
Две ошибки:
-------------------- Но кто из вас не прав, кто виноват во всей создавшейся никчёмной сложности Судить об этом не имею никакой возможности. При следующем свидании вы сами выйдете из тупика. Ну, до свидания, пока. :-) Д.И. Хармс Самый радиоактивно загрязненный сайт 2004 |
||||
|
|||||
Дрон |
|
||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 92 |
Я уж и забыл было...
Первая ошибка - это не ко мне. ![]() А со второй дело такое: Твоё сообщение об ошибке не соответсвует приведённому коду. ![]() Если написать код так, как у тебя то выскакивает вот такое:
И это справедливо. Ведь тебе же надо передать в SetTimer третьим параметром указатель на функцию TimerProc, и записывается он именем функции без круглых скобок. А в твоей записи будет вызвана функция TimerProc, а потом то значение, которое она вернёт (а она вообще-то void ![]() Короче, должно быть просто:
Как я и писал в прошлый раз ![]() Твоё сообщение об ошибке - это случай, если бы у тебя TimerProc был объявлен без _stdcall, а вот вызов SetTimer был правильный. Посмотри внимательно. В общем, что-то ты напутал. А у меня всё правильно было написано. Это сообщение отредактировал(а) Дрон - 4.7.2003, 23:26 -------------------- Да. Именно так. |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |