Среда, 18 Декабря 2024, 14:43

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Процедуры для работы с мышью в PascalABC
AKukuruzДата: Четверг, 07 Июля 2016, 19:56 | Сообщение # 1
был не раз
Сейчас нет на сайте
Где взять их список? MouseMove, MouseDown и тд
Если с текстом, то есть crt многое понятно, то с мышью не так... И вообще какие есть путевые книги по АБС?

Допустим надо мышкой ввести координаты путпиксела или вывести их в поле textout.

Вроде понял что они принадлежат модулю Events, но как-то видел в яндексе что есть и модуль Mouse, хотя сейчас нагуглить его не могу...
Может это от невнимательности... С вводом-выводом текста и графики все понятно, а мышиные процедуры найти не могу...

p.s.: да я гуглил.

Добавлено (07 июля 2016, 19:56)
---------------------------------------------
там где присваиваю значение а и б в mousedown что-то не так...

Код
uses GraphABC;

var a,b: integer; //координаты мышки

procedure MouseDown(x,y,mb: integer);
begin
if mb=1 then // передаем координаты мышки в переменные а и б
a : = x;
b := y;
end;

begin
SetWindowTitle('123');
Setwindowsize(800,600); //размер окна

OnMouseDown:=MouseDown; //1 клик, передаем координаты мышки в начальные координаты лайна
x1: = a;
y1: = b;

OnMouseDown:=MouseDown; //2 клик, передаем тоже самое только в конечные
x2 : = a;
y2 : = b;

Line(x1,y1,x2,y2); //рисуем

end.


Сообщение отредактировал AKukuruz - Четверг, 07 Июля 2016, 19:58
GudleifrДата: Четверг, 07 Июля 2016, 20:12 | Сообщение # 2
почти ветеран
Сейчас нет на сайте
Присваивание OnMouseDown:=MouseDown это не вызов, а присвоение обработчика. Примерно так: "Теперь, всякий раз, когда когда случиться событие OnMouseDown, выполнить ф-ию MouseDown".

Т.е Ваша программа работает так:

Теперь, всякий раз, когда когда случиться событие OnMouseDown, выполнить ф-ию MouseDown.
Присваеваем x1 и y1 мусор (т.к. мышку еще никто не кликал).
Теперь, всякий раз, когда когда случиться событие OnMouseDown, выполнить ф-ию MouseDown.
Присваеваем x2 и y2 мусор (т.к. мышку все еще никто не кликал).
Рисуем мусор...

А MouseDown так никто и не вызвал, т.к. OnMouseDown так и не случмлось.


Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
1nt3g3rДата: Четверг, 07 Июля 2016, 20:18 | Сообщение # 3
почетный гость
Сейчас нет на сайте
Цитата
OnMouseDown:=MouseDown; //1 клик, передаем координаты мышки в начальные координаты лайна
x1: = a;
y1: = b;

OnMouseDown:=MouseDown; //2 клик, передаем тоже самое только в конечные
x2 : = a;
y2 : = b;


Меня смущает этот код. Судя по всему, у тебя постоянно присваиваются значения к x2, y2. Как мне кажется - делай немного не так. Сохраняй последние координаты мышки в (oldX, oldX). Потом считывай координаты мышки в (x, y) и рисуй линию от (oldX, oldY) до (a, b). Примерный код:

Цитата
uses GraphABC;

var oldX, oldY: integer; //координаты мышки

procedure MouseDown(x,y,mb: integer);
begin
if mb=1 then
begin
if (oldX <> 0 and oldY <> 0) then Line(oldX, oldY, x, y);

oldX = x;
oldY = y;
end
end

begin
SetWindowTitle('123');
Setwindowsize(800,600); //размер окна

OnMouseDown:=MouseDown;
end.


Добавлено (07 июля 2016, 20:18)
---------------------------------------------
Gudleifr, почему это - OnMouseDown как раз и случилось (случится, вернее). То, что оно не приведет к желанному результату - это другое дело.


Нужно писать такие игры, чтобы в них было интересно играть самому

Сообщение отредактировал 1nt3g3r - Четверг, 07 Июля 2016, 20:19
GudleifrДата: Четверг, 07 Июля 2016, 20:27 | Сообщение # 4
почти ветеран
Сейчас нет на сайте
Цитата 1nt3g3r ()
почему это - OnMouseDown как раз и случилось (случится, вернее)
Насколько я понимаю, программа отработает до начала полноценной работы окна.


Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
1nt3g3rДата: Четверг, 07 Июля 2016, 20:32 | Сообщение # 5
почетный гость
Сейчас нет на сайте
Gudleifr, нет, вы понимаете неверно - при использовании модуля GraphABC автоматически будет создано графическое окно. Программа завершит работу лишь тогда, когда пользователь закроет окно. А пока оно открыто, он вполне может несколько раз щелкнуть мышкой где-то в окне, и что-то нарисуется (предполагаю, что будут точки рисоваться).

Нужно писать такие игры, чтобы в них было интересно играть самому
GudleifrДата: Четверг, 07 Июля 2016, 20:41 | Сообщение # 6
почти ветеран
Сейчас нет на сайте
Цитата 1nt3g3r ()
Программа завершит работу лишь тогда, когда пользователь закроет окно.
Формально, да. Но отработает она "до". Иначе бы некоторые On... не успели бы загрузиться. Возможно, в Pascal ABC и есть какие-либо дополнительные средства синхронизации окна с программой, но в их отсутствие с окном работают только обработчики событий. Программный курсор стоит на "end". Это азбука любых программ, работающих с окнами.


Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
1nt3g3rДата: Четверг, 07 Июля 2016, 20:44 | Сообщение # 7
почетный гость
Сейчас нет на сайте
Цитата
Цитата 1nt3g3r ()
Программа завершит работу лишь тогда, когда пользователь закроет окно.
Формально, да. Но отработает она "до". Иначе бы некоторые On... не успели бы загрузиться. Возможно, в Pascal ABC и есть какие-либо дополнительные средства синхронизации окна с программой, но в их отсутствие с окном работают только обработчики событий. .


Вы пишете что-то не то. Создастся отдельный поток событий, привязанный к окну. Этот поток будет завершен лишь при закрытии окна. Пока окно не закрыто - программа работает.

Цитата
Программный курсор стоит на "end". Это азбука любых программ, работающих с окнами

Вы о чем? Какая азбука? "Програмный курсор" - что за новое понятие в информатике? Наверное, вы хотели сказать, что код между Begin и End выполнится ДО создания окна?


Нужно писать такие игры, чтобы в них было интересно играть самому
GudleifrДата: Четверг, 07 Июля 2016, 20:51 | Сообщение # 8
почти ветеран
Сейчас нет на сайте
Цитата 1nt3g3r ()
"Програмный курсор" - что за новое понятие в информатике?
Наоборот, видимо, слишком старое.

Цитата 1nt3g3r ()
Наверное, вы хотели сказать, что код между Begin и End выполнится ДО создания окна?
Именно. Как Вы иначе сможете отметить в программе границу между "окна еще нет" и "окно уже есть"? И гарантировать, что все присвоения On... будут сделаны до этой границы?

Впрочем, вижу, Вам понравилось разбираться с этой задачкой (и этим коллегой). Вот Вы его дальше и курируйте. А то все я, да я. И ругаю, и подсказываю... Будьте "добрым полицейским".



Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
AKukuruzДата: Четверг, 07 Июля 2016, 21:18 | Сообщение # 9
был не раз
Сейчас нет на сайте
Цитата Gudleifr ()
А MouseDown так никто и не вызвал, т.к. OnMouseDown так и не случмлось.


Когда писал программу рисующую точку при MouseDown все работало. Тыкнули мышкой - нарисовали точку, тыкнули еще раз нарисовали еще раз...
Соответственно событие произошло.

Цитата 1nt3g3r ()
Gudleifr, почему это - OnMouseDown как раз и случилось (случится, вернее). То, что оно не приведет к желанному результату - это другое дело.

Да я тоже уверен что случится, но при присваивании а и б координат что-то не так...

Я даже скомпилировать не могу.
В строке a: = x; ругается что "Встречено ':', а ожидалось ';'"...
А почему я не могу понять, язык изучаю недели две, сильно путаюсь в расстановках.
Если бы кто-то обьяснил почему ругается было бы понятней что делать...
То есть я понимаю что ошибка а в чем именно не понимаю.

Команда рисующая точку обьявляется в процедуре клика мышки. Для лайна нужно 2 клика... То есть я не могу засунуть line в mousedown, что логично. События ведь два.
Код
procedure mousedown(x,y,mb: integer);
begin
if mb=1 then
PutPixel(x, y, clRed); //красим пиксель
end;


Сообщение отредактировал AKukuruz - Четверг, 07 Июля 2016, 21:27
1nt3g3rДата: Четверг, 07 Июля 2016, 21:45 | Сообщение # 10
почетный гость
Сейчас нет на сайте
AKukuruz,
Цитата
В строке a: = x; ругается что "Встречено ':', а ожидалось ';'"
- это потому, что вы пишете двоеточие отдельно от знака равно - ": =" (между ними пробел). Нужно писать слитно, без пробела.


Нужно писать такие игры, чтобы в них было интересно играть самому
AKukuruzДата: Четверг, 07 Июля 2016, 22:02 | Сообщение # 11
был не раз
Сейчас нет на сайте
Цитата 1nt3g3r ()
Gudleifr, нет, вы понимаете неверно - при использовании модуля GraphABC автоматически будет создано графическое окно. Программа завершит работу лишь тогда, когда пользователь закроет окно. А пока оно открыто, он вполне может несколько раз щелкнуть мышкой где-то в окне, и что-то нарисуется (предполагаю, что будут точки рисоваться).


А окно разве не часть программы? В программе может быть графическое окно + консольщина для команд. Это вроде и есть программа...
Даже пустое окно - все равно программа.


Сообщение отредактировал AKukuruz - Четверг, 07 Июля 2016, 22:20
1nt3g3rДата: Четверг, 07 Июля 2016, 22:15 | Сообщение # 12
почетный гость
Сейчас нет на сайте
AKukuruz, не пишите "a : = x", пишите - "a := x". Пробел между двоеточием и знаком равно - его там не должно быть.

Нужно писать такие игры, чтобы в них было интересно играть самому
AKukuruzДата: Четверг, 07 Июля 2016, 22:20 | Сообщение # 13
был не раз
Сейчас нет на сайте
Исправил. Программа запускается, но ничего не происходит... Ятп координаты или не хранятся или не передаются в переменные Line.
пробовал обьвлять x1,x2,y1,y2 - не помогает...

Наверное теперь что-то в том месте где обработчик события не правильно...
А на ваш вариант программа тоже ругается при запуске... "Операция '<>' не применима к типам boolean и integer".


Сообщение отредактировал AKukuruz - Четверг, 07 Июля 2016, 22:23
1nt3g3rДата: Четверг, 07 Июля 2016, 22:30 | Сообщение # 14
почетный гость
Сейчас нет на сайте
AKukuruz, да, в моем варианте есть некоторые моменты. Верный код будет примерно таким:

Цитата
uses GraphABC;

var oldX, oldY: integer; //координаты мышки

procedure MouseDown(x,y,mb: integer);
begin
if mb=1 then
begin
if ((oldX <> 0) and (oldY <> 0)) then Line(oldX, oldY, x, y);

oldX := x;
oldY := y;
end
end

begin
SetWindowTitle('123');
Setwindowsize(800,600); //размер окна

OnMouseDown:=MouseDown;
end.


Мой основной язык сейчас - Java, синтаксис Pascal-я уже немного подзабылся...


Нужно писать такие игры, чтобы в них было интересно играть самому
AKukuruzДата: Четверг, 07 Июля 2016, 22:41 | Сообщение # 15
был не раз
Сейчас нет на сайте
Нагуглил что-то похожее.

Рисуем линию, но начальные координаты в точке 0,0...
Буду думать как ее задать при первом клике.

Код
uses GraphABC;

procedure MouseDown(x,y,mb: integer);
begin
if mb=1 then LineTo(x,y);  
end;

begin
SetWindowTitle('Графическое окно');
Setwindowsize(800,600); //размер окна

OnMouseMove:=MouseDown;

end.

Добавлено (07 июля 2016, 22:41)
---------------------------------------------

Цитата 1nt3g3r ()
Мой основной язык сейчас - Java, синтаксис Pascal-я уже немного подзабылся...

Да) Всеравно спасибо за помощь.
1nt3g3rДата: Четверг, 07 Июля 2016, 22:51 | Сообщение # 16
почетный гость
Сейчас нет на сайте
AKukuruz, код, что вы нагуглили - фактически, тот код, что привел вам я. Только в моем варианте как раз и учтено рисовать линию лишь после первого клика.

Нужно писать такие игры, чтобы в них было интересно играть самому
AKukuruzДата: Пятница, 08 Июля 2016, 02:27 | Сообщение # 17
был не раз
Сейчас нет на сайте
Вообще ее надо бы рисовать после второго клика когда мы узнали конечные координаты... А при первом только начальные указать.

А как дать понять программе что я делаю второй клик?
Вот через moveto... Тоже не работает...

Код
uses GraphABC;

procedure mousedown(x,y,mb: integer);
begin
if mb=1 then
MoveTo(x, y);
begin
if mb=1 then
Lineto(x, y);
end;
end;

begin
SetWindowTitle('Графическое окно');
Setwindowsize(800,600); //размер окна

OnMousedown:=Mousedown;

end.
1nt3g3rДата: Пятница, 08 Июля 2016, 09:52 | Сообщение # 18
почетный гость
Сейчас нет на сайте
AKukuruz, не понимаю сути вашей проблемы) Специально поставил PascalABC, проверил свой код:



(прямая ссылка, если не видно картинку - https://www.dropbox.com/s/6oxpbld3wxvzw87/Скриншот 2016-07-08 09.46.13.png?dl=0)

Единственная ошибка в моем коде - я забыл поставить точку с запятой перед end.

Цитата
uses GraphABC;

var oldX, oldY: integer; //координаты мышки

procedure MouseDown(x,y,mb: integer);
begin
if mb=1 then
begin
if ((oldX <> 0) and (oldY <> 0)) then Line(oldX, oldY, x, y);

oldX := x;
oldY := y;
end
end;

begin
SetWindowTitle('123');
Setwindowsize(800,600); //размер окна

OnMouseDown:=MouseDown;
end.


Это полностью рабочий вариант (скопированный прямо из PascalABC). Как мы избегаем рисования линии при первом нажатии - мы смотрим на (oldX, oldY). Если они оба равны нулю (а такое может быть лишь при первом клике) - мы ничего не делаем. А начиная со второго клика - начинается рисование.


Нужно писать такие игры, чтобы в них было интересно играть самому
GudleifrДата: Пятница, 08 Июля 2016, 12:04 | Сообщение # 19
почти ветеран
Сейчас нет на сайте
Цитата 1nt3g3r ()
не понимаю сути вашей проблемы
Дык, я же объяснил.

Цитата 1nt3g3r ()
я забыл поставить точку с запятой перед end
Наоборот, точка с запятой перед end - это ошибка.


Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
1nt3g3rДата: Пятница, 08 Июля 2016, 12:12 | Сообщение # 20
почетный гость
Сейчас нет на сайте
Gudleifr,

Цитата

Цитата 1nt3g3r ()
не понимаю сути вашей проблемы
Дык, я же объяснил.

Я обращался не к вам, но вы все обьяснили за человека. Вы очень проницательны и умеете отвечать за других. Отличная привычка!

Цитата
Цитата 1nt3g3r ()
я забыл поставить точку с запятой перед end
Наоборот, точка с запятой перед end - это ошибка.

Да - после end, спасибо за подсказку, точно подмечено, сразу видно, что у человека большой, я бы сказал, ДРЕВНИЙ, опыт в программировании!


Нужно писать такие игры, чтобы в них было интересно играть самому

Сообщение отредактировал 1nt3g3r - Пятница, 08 Июля 2016, 12:12
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг