|
2D-программирование Вопросы, касающиеся двумерного программирования |
19.01.2010, 12:45
|
#1
|
ПроЭктировщик
Регистрация: 09.10.2008
Адрес: Казань
Сообщений: 137
Написано 7 полезных сообщений (для 9 пользователей)
|
Непойму...
Добрый день.
создал функцию:
Function D2D_SetAnimPointer(D2D_AnimPointPatch$,SlideX%,SlideY%,StartFirst%,CountSlides%,Speed%)
D2D_AnimPoint=LoadAnimImage(D2D_AnimPointPatch$,SlideX%,SlideY%,StartFirst%,CountSlides%)
If D2D_AnimPoint=False Then
RuntimeError("Ошибка в функции 'D2D_SetAnimPointer'.")
Else
SetAnimPointer=1
EndIf
End Function
Использую:
D2D_SetAnimPointer("Media Files/02_1.bmp",14,20,0,11,300)
но почему то в переменной CountSlides% значений 0. Хоть я ее сделал глобальной. Почему так?
|
(Offline)
|
|
19.01.2010, 13:30
|
#2
|
Дэвелопер
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений (для 774 пользователей)
|
Ответ: Непойму...
потому что ты не приравнял значение к этой глобальной переменной. Все параметры в функции являются локальными, тебе нужно было задать локальным переменным другие названия (чтобы отделить глобальные переменные) и затем в самой функции приравнять глобальные к локальным значениям.
Вот так :
Global D2D_count
Function D2dLoadAnimImage(count)
D2D_count = count
end function
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо H@NON за это полезное сообщение:
|
|
19.01.2010, 15:28
|
#3
|
Мастер
Регистрация: 05.04.2008
Сообщений: 910
Написано 530 полезных сообщений (для 3,006 пользователей)
|
Ответ: Непойму...
Function D2D_SetAnimPointer(D2D_AnimPointPatch$,SlideX%,SlideY%,StartFirst%,CountSlide%,Speed%)
D2D_AnimPoint=LoadAnimImage(D2D_AnimPointPatch$,SlideX%,SlideY%,StartFirst%,CountSlide%)
CountSlides% = CountSlide%
If D2D_AnimPoint=False Then
RuntimeError("Ошибка в функции 'D2D_SetAnimPointer'.")
Else
SetAnimPointer=1
EndIf
End Function
Теперь должно вернуть.
Параметры функции локальны. Поэтому тебе надо записать их в функции.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
19.01.2010, 21:43
|
#4
|
ПроЭктировщик
Регистрация: 09.10.2008
Адрес: Казань
Сообщений: 137
Написано 7 полезных сообщений (для 9 пользователей)
|
Ответ: Непойму...
Спасибо вам обоим. Все понятно теперь. )
|
(Offline)
|
|
24.01.2010, 10:24
|
#5
|
ПроЭктировщик
Регистрация: 09.10.2008
Адрес: Казань
Сообщений: 137
Написано 7 полезных сообщений (для 9 пользователей)
|
Ответ: Непойму...
Не буду создавать новую тему, продлжу тут....
скажу сразу, что вопрос касаеться типов...
Создал такой тип:
Type TButton
Field Id%
Field Name$
Field Menu$
Field X%
Field Y%
Field Width%
Field Height%
Field Disabled%
End Type
Функцией добавляю запись:
Function D2D_CreateNewButton(ButtonPatch$,ButtonName$,MenuId$,ButtonX%,ButtonY%,ButtonFlag%=0)
Buttons.TButton=New TButton
Buttons\Id%=LoadImage(ButtonPatch$)
Buttons\Name$=ButtonName$
Buttons\Menu$=MenuId$
Buttons\X%=ButtonX%
Buttons\Y%=ButtonY%
Buttons\Width%=ImageWidth(Buttons\Id%)
Buttons\Height%=ImageHeight(Buttons\Id%)
Buttons\Disabled%=ButtonFlag%
End Function
тут все отлично работает.
Потом создал функцию, которая проверяет, находиться ли указатель мыши над данным элементом или нет.
Function D2D_MouseButtonFree%(ElementId$)
For MButtons.TButton=Each TButton
If MButtons\Name$=ElementId$ Then
If D2D_MX%>MButtons\X% And D2D_MY%>MButtons\Y% And D2D_MX%<MButtons\X%+MButtons\Width% And D2D_MY%<MButtons\Y%+MButtons\Height% Then
D2D_MouseFree%=1
Else
D2D_MouseFree%=0
EndIf
Else
D2D_MouseFree%=3
EndIf
Next
Return D2D_MouseFree%
End Function
Потом пишу так:
D2D_CreateNewButton("Media Files\07.bmp","Option_Button","Option_Menu",200,100,0) ; создаю элемент Button
; и проверяю находиться ли мышь над ним
Text 10,10,D2D_MouseButtonFree("Option_Button")
Но у меня получаеться работать только с последней записью в типе ((( В данном случае Option_Button (функция возвращает 1 если мышь находиться над ним), а если добавить еще одну запись, допустим, New_Button, то уже функция возвратит 3 (элемент не найден). Почему так происходит? Че с добавлением новой записи старые удаляються? Или я проверяю их не так? Вроде цикл For Each проходиться по всем записям в типе....подскажите пожалуйста что,где и как. ) Я с типами работаю только 2-ой день и еще не освоил их...
|
(Offline)
|
|
24.01.2010, 11:12
|
#6
|
Задрот
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений (для 863 пользователей)
|
Ответ: Непойму...
Код сильно не копал, но помогу тебе с логикой : Почитай про REctsOverlap.
|
(Offline)
|
|
24.01.2010, 11:15
|
#7
|
ПроЭктировщик
Регистрация: 09.10.2008
Адрес: Казань
Сообщений: 137
Написано 7 полезных сообщений (для 9 пользователей)
|
Ответ: Непойму...
А причем тут RectsOverlap? Проблема то не в этом. У меня и так проверяеться находиться ли мышь над ним или нет. Проблема в том, что эта функция работает по последнему объекту в типе.
допустим я создам объект:
d2d_createnewbutton("img.bmp","button_1","menu",10 ,100,0)
и функция d2d_mousebuttonfree() будет прекрассно работать с объектом button_1.
а если добавлю еще один объект:
d2d_createnewbutton("img.bmp","button_2","menu",10 ,200,0)
то функция d2d_mousebuttonfree() будет прекрассно работать только с объектом button_2 а с button_1 уже ни как не будет работать. (возвратит 3, типа такой объект не найден)
|
(Offline)
|
|
24.01.2010, 11:24
|
#8
|
Задрот
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений (для 863 пользователей)
|
Ответ: Непойму...
Сообщение от ArtemkA
Потом создал функцию, которая проверяет, находиться ли указатель мыши над данным элементом или нет.
If D2D_MX%>MButtons\X% And D2D_MY%>MButtons\Y% And D2D_MX%<MButtons\X%+MButtons\Width% And D2D_MY%<MButtons\Y%+MButtons\Height% Then
D2D_MouseFree%=1
Else
D2D_MouseFree%=0
EndIf
|
вот для этой операции
|
(Offline)
|
|
24.01.2010, 11:33
|
#9
|
ПроЭктировщик
Регистрация: 09.10.2008
Адрес: Казань
Сообщений: 137
Написано 7 полезных сообщений (для 9 пользователей)
|
Ответ: Непойму...
спасибо за совет, но я почему-то недолюбливаю RectsOverlap.
#7
|
(Offline)
|
|
24.01.2010, 11:48
|
#10
|
Задрот
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений (для 863 пользователей)
|
Ответ: Непойму...
ArtemKa, нельзя недолюбливать Блиц ибо ты пишешь на нем ем более сам блиц своим RectsOverlap'ом проверит быстрее чем ты своим способом.
ЗЫ а твой код неверный.
Function D2D_MouseButtonFree%(ElementId$)
For MButtons.TButton=Each TButton
If MButtons\Name$=ElementId$ Then
If D2D_MX%>MButtons\X% And D2D_MY%>MButtons\Y% And D2D_MX%<MButtons\X%+MButtons\Width% And D2D_MY%<MButtons\Y%+MButtons\Height% Then
D2D_MouseFree%=1
Else
D2D_MouseFree%=0
EndIf
Вот здесь вся лага была, он пролетал дальше :)
Exit
Else
D2D_MouseFree%=3
EndIf
Next
Return D2D_MouseFree%
End Function
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Reizel за это полезное сообщение:
|
|
24.01.2010, 12:18
|
#11
|
ПроЭктировщик
Регистрация: 09.10.2008
Адрес: Казань
Сообщений: 137
Написано 7 полезных сообщений (для 9 пользователей)
|
Ответ: Непойму...
Не подскажешь где сдесь ошибка, я с типами еще плохо работаю....
ЗЫ. ладно, учту, буду привыкать к RectsOverlap'у )
|
(Offline)
|
|
24.01.2010, 12:30
|
#12
|
Задрот
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений (для 863 пользователей)
|
Ответ: Непойму...
А тут и не в типах дело просто цикл пролетает по ВСЕМ элементам, например в середине встретил нужный элемент, записал значение нужное, полетел дальше, а уже следующий элемент не подходит, поэтому значение записывается в 3 там Exit стоит если ты не заметил
ЗЫ а код то работает хоть
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
24.01.2010, 13:40
|
#13
|
ПроЭктировщик
Регистрация: 09.10.2008
Адрес: Казань
Сообщений: 137
Написано 7 полезных сообщений (для 9 пользователей)
|
Ответ: Непойму...
Блин, из-за какого-то маленького Exit'a была возня.... Спасибо большое теперь буду знать)))
там Exit стоит если ты не заметил
|
Да, незаметил сначало )
ЗЫ а код то работает хоть
Да, щас работает. Спасибо.
|
(Offline)
|
|
24.01.2010, 14:35
|
#14
|
ПроЭктировщик
Регистрация: 09.10.2008
Адрес: Казань
Сообщений: 137
Написано 7 полезных сообщений (для 9 пользователей)
|
Ответ: Непойму...
А почему не работает этот код:
For Menus.TMenu=Each TMenu
If Menus\Show%=1 Then
For Buttons.TButton=Each TButton
DrawImage(Buttons\Id%,Buttons\X%,Buttons\Y%)
Next
EndIf
Next
ведь вроде по логике все правлильно?
второй цикл for должен выполняться если в первом цикле for переменная Menus\Show равняеться 1.
|
(Offline)
|
|
26.01.2010, 19:09
|
#15
|
Бывалый
Регистрация: 16.09.2009
Адрес: Sun system
Сообщений: 831
Написано 442 полезных сообщений (для 1,836 пользователей)
|
Ответ: Непойму...
Он и выполняется. Ошибка в остальном коде.
З.Ы. А ты уверен, что Buttons/Id% - картинка?
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:11.
|