![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 03.02.2013
Сообщений: 73
|
![]()
Всем привет! Кто сможет помочь?: у меня есть некая задумка(игра) и я её начал реализовывать: сделал управление самолетиком проверку не вылетел ли он за пределы экрана и начал делать пулю снаряда! тут-то и началась проблема я все описал и все с технической точки зрения работает корректно!!! но вот с графической не очень! дело в том что я вижу пулю только в конечной и начальной точке а её передвижения не вижу! но если сделать её управляемой(при одном нажатии она перемещается на определенное расстояние) то все видно! в чем проблема??? может кто сталкивался!? вот код: (правда там нужны картинки но думаю придумаете что нибудь) такое ощущение что координаты вращаются только в этом цикле и не попадают к адресату пока прога не вышла из цикла!! хотя этого быть не должно!?
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var pl2, pt2, pt3, pl3,t,l: integer; //переменные положения самолетика и пули(х,у)(pt - place top; pl - place left) label 1,2; //нужны дальше для цыкла begin pl3:=Image3.Left; //присваиваем текущие координаты моделек переменным и оперируем уже с ними pt3:=Image3.Top; pl2:=Image2.Left; pt2:=Image2.Top; l:=pl2+115; //задаем положение пули относительно самолета t:=pt2-50; if (Key <> VK_CONTROL) and (pl3<>l) then pl3 := pl2 + 115; //проверяем находится ли пуля в нужной точке if (Key <> VK_CONTROL) and (pt3<>t) then pt3 := pt2 - 50; //если нет то ставим её туда Image3.Top := pt3; //присваиваем новые координаты пуле Image3.Left := pl3; //ставя её тем самым в нужную позицыю if (Key = VK_RIGHT) and (pl2<700) then pl2 := pl2+5; if (Key = VK_LEFT) and (pl2>0) then pl2 := pl2-5; //проверка не вылетел ли самолетик за пределы экрана(pl2>0) if (Key = VK_DOWN) and (pt2<610) then pt2 := pt2+5; //и управление самолетиком if (Key = VK_UP) and (pt2>0) then pt2 := pt2-5; Image2.Left := pl2; //перемещение модельки на форме Image2.Top := pt2; //за счет присваивания новых координат if (Key = VK_CONTROL) and (pt3>-25) then Image3.Visible := true //проверка положения пули и нажатости ctrl else Image3.Visible := False; //если координаты вышли за пределы рабочей области то пуля становится невидимой if (Key = VK_CONTROL) then goto 1; //заставляем пулю двигаться(переходим к циклю её перемещения goto 1) goto 2; //а если кнопка не нажата то пропускам цикл 1: //Проблемы начинаются в этом цыкле pt3:=pt3-5; //вход в цикл и вычитание из текущей координаты 5 пикселей Image3.Top:=pt3; //присвоение новой координаты объекту пуля Sleep(5); //задержка для плавности перемещения If pt3>-25 then goto 1; //проверка нахождения пули в пределах экрана(при false прога выйдет из цыкла) 2: //конец обработки нажатых кнопок! end; Последний раз редактировалось Xaker_Two; 18.02.2013 в 00:02. |
![]() |
![]() |
![]() |
#2 |
Пользователь
Регистрация: 16.02.2013
Сообщений: 53
|
![]()
Xaker_Two, ты бы проект в зипе прикрепил к сообщению, что бы глянуть сразу можно было что да как, и без лишней возни, если кто разобраться захочет.
|
![]() |
![]() |
![]() |
#3 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
![]()
Должен Вас разочаровать: даже по тому фрагменту, что Вы привели, видно, что это не так.
Процедура обработчика нажатия на клавишу не должна содержать: 1. Вызова процедур типа sleep. 2. Изменения значений координат. 3. Циклов, в которых последовательно изменяются какие-либо параметры состояния игрового мира. Тот факт, что у Вас нарушены все три эти условия, однозначно свидетельствует, что игровая логика у Вас организованна совершенно неверно. PS. goto - дурной тон, избавляйтесь от него. |
![]() |
![]() |
![]() |
#4 |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,899
|
![]()
В этой ерунде даже разбираться нет смысла. Программа в принципе построена неверно. Я уж молчу о ключевом незнании языка и подобающего стиля в разработке программ.
Если надо подробно, то: 1. использование goto - для Вашей задачи нет смысла в нём - только больше запутаете (его надо применять знаючи) 2. использование компонент вообще и также их "неименование" (т.е. использование имени по умолчанию) 3. более тонкий принцип - необходимо разделение логики работы элементов и их отрисовки. Нажатие кнопки и самостоятельный "полет пули" - вещи несовместимые по своей сути - одно непостоянно по природе а другое постоянно (ну условно, конечно, мол пуля летит как выстрелили и до того как скроется за экраном) 4. Использование непонятных переменных, которые бы вообще лучше хранить в виде данных об объектах вместо локальных переменных, а также числовых величин, которые стоит хранить как константы или также поля объекта, типа скорости. 5. Плохой стиль вообще и вышеперечисленное вынуждает использовать много комментариев, и так перегружая всё, в идеале, код вообще должен быть "говорящим", а комментированию подлежат только методы/подпрограммы, ибо задача оных только одна и сводится к простому описательному "что делает", и имеет соответствующее имя. Искренний совет - читать http://programmersforum.ru/showthread.php?t=1206 и пробовать большинство примеров на практике и разбирать их, создать в разделе игр новую тему, что-то вроде "разбираю тему уроки для новичков, нужна помощь" и туда писать непонятки, я лично тогда буду там разжевывать при необходимости. Саму задумку лучше ненадолго отложить, пока не впечатаются более простые (по своей идее) но грамотные (в плане реализации) вещи в сознание. А потом можно быстрее и с меньшими проблемами добить эту задумку. |
![]() |
![]() |
![]() |
#5 |
Пользователь
Регистрация: 03.02.2013
Сообщений: 73
|
![]()
Тогда как сделать так, чтобы объект двигался а не оказывался сразу в конечной точке без sleep? да и как перемещать объект без изменения его координат???
|
![]() |
![]() |
![]() |
#6 |
Пользователь
Регистрация: 03.02.2013
Сообщений: 73
|
![]()
goto я использовал т.к. думал что в цикле while данные не выходят за его пределы пока он не завершиться но ошибался! я не понимаю почему её не видно во время движения? хатя в конечной точке она появляется и от клавиши корректно робит???
|
![]() |
![]() |
![]() |
#7 | |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
![]()
Практически со всем согласен кроме одного пункта.
Цитата:
1. Комментарии ни в коем случае не должны говорить, что делает программа. Об этом должен говорить сам код. Комментарии должны объяснять, зачем она это делает. 2. В принципе, комментарии можно разделить на две группы: - комментарии, сопровождающие заголовки (видимо, о ниж Вы и говорили), - комментарии, объясняющие, почему принято то или иное решение, поясняющие выбор того или иного алгоритма, его работу, этапы выполнения и пр. - обычно достаточно 1 строки на несколько строк кода. От себя могу добавить еще один существенный недостаток: 7. Следует избегать ничего не говорящие константы типа 115, 700, 610 - вместо этого описать их все в отдельном блоке констант - а еще лучше считывать из конфигурационного файла или вычислять, исходя из конкретных размеров экрана. Последний раз редактировалось s-andriano; 18.02.2013 в 19:55. |
|
![]() |
![]() |
![]() |
#8 | |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
![]() Цитата:
Состояние игрового мира должно целиком описываться некоторым набором констант и переменных. Это набор, кстати, требует тщательного проектирования. Части кода, взаимодействующие с органами управления только меняют некоторую часть переменных состояния. Никаких задержек, попыток отрисовки и т.п. в них быть не должно. Отдельно пишутся части кода, которые описывают эволюцию игрового мира во времени. В частности, пользуется значениями переменных, описывающих органы управления. Отрисовка на экран осуществляется отдельными частями кода. Они только рисуют текущее состояние, не внося в него никаких изменений и не взаимодействуя с органами управления. |
|
![]() |
![]() |
![]() |
#9 |
Пользователь
Регистрация: 03.02.2013
Сообщений: 73
|
![]()
Спасибо phomm, за ссылку на тему там я нашёл один дельный совет по своему вопросу
И ещё одно замечание если позволите: можно говорить проще(не простыми словами а простыми фразами) а то у меня бошка кипит от всего этого научного писания! я ЧАЙНИК(почти, т.к. с паскалем знаком и с делфи немного тоже) и раздел помоему так и называется "Помощь чайникам"(образно говоря) |
![]() |
![]() |
![]() |
#10 |
Пользователь
Регистрация: 03.02.2013
Сообщений: 73
|
![]()
Люди а никто из вас не сталкивался с такой задачкой: как создавать новый объект при нажатии кнопки при помощи счетчика? допустим надо создать объект TImageI, где I порядковый номер изображения заданный счетчиком нажатия клавиш! как такое можно сделать???
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
TScrollBox и его невидимая область. Как с этим бороться? Смотрим внутри... | Vova777 | Общие вопросы Delphi | 3 | 17.02.2012 18:38 |
Очередь и пуля | revaldo666 | Общие вопросы C/C++ | 2 | 16.01.2012 14:26 |
Невидимая форма с видимыми элементами | Кольша | Мультимедиа в Delphi | 11 | 05.12.2011 19:35 |
делфи, невидимая кнопка | KaZaaM | Помощь студентам | 8 | 28.05.2010 00:01 |