Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2013, 23:29   #1
Xaker_Two
Пользователь
 
Регистрация: 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;
Вложения
Тип файла: zip Project002.zip (858.5 Кб, 5 просмотров)

Последний раз редактировалось Xaker_Two; 18.02.2013 в 00:02.
Xaker_Two вне форума Ответить с цитированием
Старый 17.02.2013, 23:44   #2
Alchemic
Пользователь
 
Регистрация: 16.02.2013
Сообщений: 53
По умолчанию

Xaker_Two, ты бы проект в зипе прикрепил к сообщению, что бы глянуть сразу можно было что да как, и без лишней возни, если кто разобраться захочет.
Alchemic вне форума Ответить с цитированием
Старый 18.02.2013, 07:46   #3
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Xaker_Two Посмотреть сообщение
...все с технической точки зрения работает корректно!!!
Должен Вас разочаровать: даже по тому фрагменту, что Вы привели, видно, что это не так.

Процедура обработчика нажатия на клавишу не должна содержать:
1. Вызова процедур типа sleep.
2. Изменения значений координат.
3. Циклов, в которых последовательно изменяются какие-либо параметры состояния игрового мира.

Тот факт, что у Вас нарушены все три эти условия, однозначно свидетельствует, что игровая логика у Вас организованна совершенно неверно.

PS. goto - дурной тон, избавляйтесь от него.
s-andriano вне форума Ответить с цитированием
Старый 18.02.2013, 07:55   #4
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

В этой ерунде даже разбираться нет смысла. Программа в принципе построена неверно. Я уж молчу о ключевом незнании языка и подобающего стиля в разработке программ.

Если надо подробно, то:
1. использование goto - для Вашей задачи нет смысла в нём - только больше запутаете (его надо применять знаючи)
2. использование компонент вообще и также их "неименование" (т.е. использование имени по умолчанию)
3. более тонкий принцип - необходимо разделение логики работы элементов и их отрисовки. Нажатие кнопки и самостоятельный "полет пули" - вещи несовместимые по своей сути - одно непостоянно по природе а другое постоянно (ну условно, конечно, мол пуля летит как выстрелили и до того как скроется за экраном)
4. Использование непонятных переменных, которые бы вообще лучше хранить в виде данных об объектах вместо локальных переменных, а также числовых величин, которые стоит хранить как константы или также поля объекта, типа скорости.
5. Плохой стиль вообще и вышеперечисленное вынуждает использовать много комментариев, и так перегружая всё, в идеале, код вообще должен быть "говорящим", а комментированию подлежат только методы/подпрограммы, ибо задача оных только одна и сводится к простому описательному "что делает", и имеет соответствующее имя.

Искренний совет - читать http://programmersforum.ru/showthread.php?t=1206 и пробовать большинство примеров на практике и разбирать их, создать в разделе игр новую тему, что-то вроде "разбираю тему уроки для новичков, нужна помощь" и туда писать непонятки, я лично тогда буду там разжевывать при необходимости.

Саму задумку лучше ненадолго отложить, пока не впечатаются более простые (по своей идее) но грамотные (в плане реализации) вещи в сознание. А потом можно быстрее и с меньшими проблемами добить эту задумку.
phomm вне форума Ответить с цитированием
Старый 18.02.2013, 19:17   #5
Xaker_Two
Пользователь
 
Регистрация: 03.02.2013
Сообщений: 73
По умолчанию

Тогда как сделать так, чтобы объект двигался а не оказывался сразу в конечной точке без sleep? да и как перемещать объект без изменения его координат???
Xaker_Two вне форума Ответить с цитированием
Старый 18.02.2013, 19:20   #6
Xaker_Two
Пользователь
 
Регистрация: 03.02.2013
Сообщений: 73
По умолчанию

goto я использовал т.к. думал что в цикле while данные не выходят за его пределы пока он не завершиться но ошибался! я не понимаю почему её не видно во время движения? хатя в конечной точке она появляется и от клавиши корректно робит???
Xaker_Two вне форума Ответить с цитированием
Старый 18.02.2013, 19:52   #7
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Практически со всем согласен кроме одного пункта.
Цитата:
Сообщение от phomm Посмотреть сообщение
комментированию подлежат только методы/подпрограммы, ибо задача оных только одна и сводится к простому описательному "что делает", и имеет соответствующее имя.
Здесь сразу несколько неверных утверждений.
1. Комментарии ни в коем случае не должны говорить, что делает программа. Об этом должен говорить сам код. Комментарии должны объяснять, зачем она это делает.
2. В принципе, комментарии можно разделить на две группы:
- комментарии, сопровождающие заголовки (видимо, о ниж Вы и говорили),
- комментарии, объясняющие, почему принято то или иное решение, поясняющие выбор того или иного алгоритма, его работу, этапы выполнения и пр. - обычно достаточно 1 строки на несколько строк кода.

От себя могу добавить еще один существенный недостаток:
7. Следует избегать ничего не говорящие константы типа 115, 700, 610 - вместо этого описать их все в отдельном блоке констант - а еще лучше считывать из конфигурационного файла или вычислять, исходя из конкретных размеров экрана.

Последний раз редактировалось s-andriano; 18.02.2013 в 19:55.
s-andriano вне форума Ответить с цитированием
Старый 18.02.2013, 20:02   #8
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Xaker_Two Посмотреть сообщение
Тогда как сделать так, чтобы объект двигался а не оказывался сразу в конечной точке без sleep? да и как перемещать объект без изменения его координат???
Еще раз: у Вас совершенно неверная организация игрового цикла.

Состояние игрового мира должно целиком описываться некоторым набором констант и переменных. Это набор, кстати, требует тщательного проектирования.
Части кода, взаимодействующие с органами управления только меняют некоторую часть переменных состояния. Никаких задержек, попыток отрисовки и т.п. в них быть не должно.
Отдельно пишутся части кода, которые описывают эволюцию игрового мира во времени. В частности, пользуется значениями переменных, описывающих органы управления.
Отрисовка на экран осуществляется отдельными частями кода. Они только рисуют текущее состояние, не внося в него никаких изменений и не взаимодействуя с органами управления.
s-andriano вне форума Ответить с цитированием
Старый 18.02.2013, 20:11   #9
Xaker_Two
Пользователь
 
Регистрация: 03.02.2013
Сообщений: 73
По умолчанию

Спасибо phomm, за ссылку на тему там я нашёл один дельный совет по своему вопросу

И ещё одно замечание если позволите: можно говорить проще(не простыми словами а простыми фразами) а то у меня бошка кипит от всего этого научного писания! я ЧАЙНИК(почти, т.к. с паскалем знаком и с делфи немного тоже) и раздел помоему так и называется "Помощь чайникам"(образно говоря)
Xaker_Two вне форума Ответить с цитированием
Старый 18.02.2013, 20:59   #10
Xaker_Two
Пользователь
 
Регистрация: 03.02.2013
Сообщений: 73
По умолчанию

Люди а никто из вас не сталкивался с такой задачкой: как создавать новый объект при нажатии кнопки при помощи счетчика? допустим надо создать объект TImageI, где I порядковый номер изображения заданный счетчиком нажатия клавиш! как такое можно сделать???
Xaker_Two вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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