forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=13)
-   -   Непойму... (http://forum.boolean.name/showthread.php?t=11761)

ArtemkA 19.01.2010 12:45

Непойму...
 
Добрый день.

создал функцию:
Код:

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. Хоть я ее сделал глобальной. Почему так?

H@NON 19.01.2010 13:30

Ответ: Непойму...
 
потому что ты не приравнял значение к этой глобальной переменной. Все параметры в функции являются локальными, тебе нужно было задать локальным переменным другие названия (чтобы отделить глобальные переменные) и затем в самой функции приравнять глобальные к локальным значениям.
Вот так :
Код:

Global D2D_count
Function D2dLoadAnimImage(count)
    D2D_count = count
end function


EvilChaotic 19.01.2010 15:28

Ответ: Непойму...
 
Код:

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

Теперь должно вернуть.
Параметры функции локальны. Поэтому тебе надо записать их в функции.

ArtemkA 19.01.2010 21:43

Ответ: Непойму...
 
Спасибо вам обоим. Все понятно теперь. )

ArtemkA 24.01.2010 10:24

Ответ: Непойму...
 
Не буду создавать новую тему, продлжу тут....
скажу сразу, что вопрос касаеться типов...

Создал такой тип:
Код:

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-ой день и еще не освоил их...

Reizel 24.01.2010 11:12

Ответ: Непойму...
 
Код сильно не копал, но помогу тебе с логикой : Почитай про REctsOverlap. :)

ArtemkA 24.01.2010 11:15

Ответ: Непойму...
 
А причем тут 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, типа такой объект не найден)

Reizel 24.01.2010 11:24

Ответ: Непойму...
 
Цитата:

Сообщение от ArtemkA (Сообщение 134599)
Потом создал функцию, которая проверяет, находиться ли указатель мыши над данным элементом или нет.
Код:

                        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


вот для этой операции

ArtemkA 24.01.2010 11:33

Ответ: Непойму...
 
спасибо за совет, но я почему-то недолюбливаю RectsOverlap. :)
#7

Reizel 24.01.2010 11:48

Ответ: Непойму...
 
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


ArtemkA 24.01.2010 12:18

Ответ: Непойму...
 
Цитата:

ЗЫ а твой код неверный.
Не подскажешь где сдесь ошибка, я с типами еще плохо работаю....

ЗЫ. ладно, учту, буду привыкать к RectsOverlap'у )

Reizel 24.01.2010 12:30

Ответ: Непойму...
 
А тут и не в типах дело :) просто цикл пролетает по ВСЕМ элементам, например в середине встретил нужный элемент, записал значение нужное, полетел дальше, а уже следующий элемент не подходит, поэтому значение записывается в 3 :) там Exit стоит если ты не заметил

ЗЫ а код то работает хоть

ArtemkA 24.01.2010 13:40

Ответ: Непойму...
 
Блин, из-за какого-то маленького Exit'a была возня.... Спасибо большое теперь буду знать))) :)

Цитата:

там Exit стоит если ты не заметил
Да, незаметил сначало )
Код:

ЗЫ а код то работает хоть
Да, щас работает. Спасибо.

ArtemkA 24.01.2010 14:35

Ответ: Непойму...
 
А почему не работает этот код:
Код:

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.

FireOwl 26.01.2010 19:09

Ответ: Непойму...
 
Он и выполняется. Ошибка в остальном коде.
З.Ы. А ты уверен, что Buttons/Id% - картинка?


Часовой пояс GMT +4, время: 04:35.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot