PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопросы новичка


Вопросы новичка

Сообщений 901 страница 930 из 1000

901

Lucagin написал(а):

Хочу, чтобы на экране были разбросаны с десяток простеньких элементов (прямая, квадрат, линия, круг, может объекты более сложной формы) разных цветов. При этом должна быть возможность кликнуть по этим простеньким элементам, с их какой-либо модификацией (исчезли, поменяли цвет и т.п.) Как лучше осуществить этот проект с помощью использования ImageGadget() или можно использовать CreateSprite(). Будет ли выигрышь при использовнаии Sprite и позволят ли они полностью функционально заменить   ImageGadget() (возможность кликать по ним и работа в обычном окне)?

Если нужна игра в 2D , 3D , тогда забывай про ImageGadget. Работа с экранами огромный выигрыш в скорости. Посмотри на игру, сделанную на пурике. http://spaceminers.narod.ru/

0

902

haav написал(а):

Посмотри на игру, сделанную на пурике. http://spaceminers.narod.ru/

Игрушка по видероликам классная, правда на моем P4(2600) сильно тормозит, наверно проц помощнее нужен. А двигающиеся объекты в игре, это спрайты? Интересно,  как реализованы взрывы в игре? Это прорисовка пикселей по какому-то алгоритму или готовая анимация типа gif (последовательная смена картинок)?

Отредактировано Lucagin (13.12.2010 21:34:34)

0

903

Lucagin написал(а):

или готовая анимация типа gif (последовательная смена картинок)?

Не думаю, что это gif. А что мешает спросить у автора, например вот в этой теме: http://purebasic.info/phpBB2/viewtopic.php?t=879
AndyLy единственный кодер игрушек на пурике, кто сделал такой мощный проект!

0

904

haav написал(а):

AndyLy единственный кодер игрушек на пурике, кто сделал такой мощный проект!

Проект мощный, но на моей конфигурации играть прост не возможно. Основное меню выезжает около 3-х минут, мышка практически не двигается. У меня же идет нормально  конта, 2-я халва и другие игры, почему этот проект (не особо мощный по графике) так безбожно тормозит?

0

905

haav написал(а):

AndyLy единственный кодер игрушек на пурике, кто сделал такой мощный проект!

А как же SofT MANiAC, который делал 3D игрушки и продавал их? Думаю что там и помощнее были проекты!
Вот здесь можно найти ссылки на некоторые игры, созданые в PureBasic http://purebasic.com/screenshots.php

0

906

Lucagin написал(а):

У меня же идет нормально  конта, 2-я халва и другие игры, почему этот проект (не особо мощный по графике) так безбожно тормозит?

У меня 2 компа. Один из них со стареньким celeron 2667, видюха (средненькая), игра шла нормально без тормозов. AndyLy я думаю смог бы исправить, если бы у него на компе были тормоза, а так трудно понять в чем дело.

0

907

Пётр написал(а):

А как же SofT MANiAC, который делал 3D игрушки и продавал их? Думаю что там и помощнее были проекты!Вот здесь можно найти ссылки на некоторые игры, созданые в PureBasic

Я про его игры ничего не знаю, какие там его проекты?

0

908

Пётр написал(а):

Вот здесь можно найти ссылки на некоторые игры, созданые в PureBasic http://purebasic.com/screenshots.php

Классные примеры! Понравилось подобие контры, похоже сделано. Но тоже пока один стою, все летает, как кто выходит, проц проседает…

http://www.bradan.eu/projects/hoverbots/en_index.html    Вот эта игра просто летает... :glasses:

http://www.b-software.fr/index.html  вот здесь в видео ролике (демонстрация арканоида, взлет ракеты ОФИГЕННО сделано!!!) Похоже использованы спец эффекты из афтор эффекта, но вот как он их прикрутил туда…  :dontknow:  Одно слово мастера!!! :cool:

Отредактировано Lucagin (13.12.2010 22:50:30)

0

909

Lucagin написал(а):

Но тоже пока один стою, все летает, как кто выходит, проц проседает…

У него там кажется 2D игра, т. е. без ускорения видеокартой.

haav написал(а):

Я про его игры ничего не знаю, какие там его проекты?

Но их продавал - бесплатно не выкладывал.
Вот здесь можно увидеть скрин одной из его игр (он сменил ник на SofTie) http://purebasic.info/phpBB2/viewtopic. … p;start=45

0

910

Jongg  http://purebasic.info/phpBB2/viewtopic.php?p=15673

Chrono Syndrome - если не ошибаюсь, девушка программист...

Тема заезженная, а игра хорошая...

0

911

Ребят, а подскажите, есть в ПБ такое понятие как передний и задний фон, хочу чтобы на одном большом ImageGadget()  было много маленьких. Как сделать, чтобы маленькие были видны а не закрывались большим? Или использование ImageGadget() на другом ImageGadget() не корректно? В этом случае надо использовать ContainerGadget()?

0

912

Lucagin написал(а):

хочу чтобы на одном большом ImageGadget()  было много маленьких.

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

Но если маленькие рисунки будут всегда на одном месте и не изменяться, то можно всех из разместить в одном рисунке.

0

913

Пётр написал(а):

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

Заработало!! Спасибо , Пётр!!! 8-)

Пётр написал(а):

Но если маленькие рисунки будут всегда на одном месте и не изменяться, то можно всех из разместить в одном рисунке.

Меняться будут, при клике на них. Хотел сделать, чтобы все было на одном рисунке, но тогда  сложно наверно будет отследить нажатие на них и точную перерисовку, потому и взял их в отдельные гаджеты…

Отредактировано Lucagin (15.12.2010 01:28:39)

0

914

В программе генерируется цвет фона, изображение слева: RGB фона +знач. бегунк. При нажатии на кнопку "Подобрать цвет" появляется правое изображение и вызывается палитра, где можно попытаться подобрать цвет, похожий на цвет левого изображения. . Активация CheckBox увеличивает число генерируемых цветов.Одиночный Клик по ImageGadget  дает  его цвет (Пипетка:). Двойной клик по правому изображению его отключает (уничтожает).
ТЕПЕРЬ ПРОБЛЕМА! При нажатии "Подобрать цвет" открывается окно палитры, если это окно перенести так, чтобы оно частично наложилось  на правый ImageGadget, то после закрытия окна палитры на изображении остается след с цветом фона, как этого избежать???

Код:
;{ константы ID
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Image_0
  #Image_1
  #Image_50
  #TrackBar_0
  #Button_0
  #Button_1
  #Text_0
  #Text_1
  #Text_3
  #Text_4
  #CheckBox_0
  #CheckBox_1
  #CheckBox_2
EndEnumeration

;- Fonts
Global FontID1
FontID1 = LoadFont(1, "Arial", 16)
Global FontID2
FontID2 = LoadFont(2, "Arial", 12)
;}



Procedure Open_Window_0()
  If OpenWindow(#Window_0, 392, 181, 840, 600, "Цвето_восприятие",  #PB_Window_SystemMenu |  #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      
      CreateImage(#Image_50, 840, 320)
      ImageGadget(#Image_50, 0, 0, 840, 320, Image0, #PB_Image_Border)      
      TrackBarGadget(#TrackBar_0, 40, 500, 170, 40, 0, 10, #PB_TrackBar_Ticks)      
      DisableGadget(#Image_50,1)
      CreateImage(#Image_0, 400, 300)
      ImageGadget(#Image_0, 10, 10, 400, 300, Image0, #PB_Image_Border)
      CreateImage(#Image_1, 400, 300)
      ;ImageGadget(#Image_1, 430, 10, 400, 300, Image1, #PB_Image_Border)     
      ButtonGadget(#Button_0, 30, 420, 190, 70, "Случайный цвет")
      SetGadgetFont(#Button_0, FontID1)
      ButtonGadget(#Button_1, 560, 420, 190, 70, "Подобрать цвет")
      SetGadgetFont(#Button_1, FontID1)
      TextGadget(#Text_0, 7, 340, 420, 40, "Сгенерированный цвет:")
      SetGadgetFont(#Text_0, FontID1)      
      TextGadget(#Text_1, 440, 340, 420, 40, "Выбраный цвет:")
      SetGadgetFont(#Text_1, FontID1)
      TextGadget(#Text_3, 320, 380, 390, 40, "Пипетка: ") 
      SetGadgetFont(#Text_3, FontID1)           
      TextGadget(#Text_4, 40, 540, 390, 40, "Шаг изменения: 0 ")
      SetGadgetFont(#Text_4, FontID1)      
      CheckBoxGadget(#CheckBox_0, 260, 430, 60, 30, "Red")
      SetGadgetFont(#CheckBox_0, FontID2)
      CheckBoxGadget(#CheckBox_1, 260, 470, 70, 40, "Green")
      SetGadgetFont(#CheckBox_1, FontID2)
      CheckBoxGadget(#CheckBox_2, 260, 510, 70, 40, "Blue")
      SetGadgetFont(#CheckBox_2, FontID2)      
    EndIf
      HideWindow(#Window_0, 1)
  EndIf
EndProcedure

Procedure Zalivka_Box (ID, R,G,B)
    
  If IsImage(ID) ; Существует ли рисунок с таким ID
    W = ImageWidth(ID)
    H = ImageHeight(ID)    
    If StartDrawing(ImageOutput(ID))
      Box(0, 0, W,H, RGB(R, G, B))
      StopDrawing() 
      SetGadgetState(ID, ImageID(ID))
    EndIf
  EndIf
    
EndProcedure


Open_Window_0()

HideWindow(#Window_0, 0)

;{Основной цикл
Repeat
  Event = WaitWindowEvent()
  EventType = EventType() 
  Gadget = EventGadget()  
        
If Event=#PB_Event_Gadget
    
   If Gadget=#TrackBar_0
      Result = GetGadgetState(#TrackBar_0)
      SetGadgetText(#Text_4,"Шаг изменения: "+Str(Result))
    
   ElseIf Gadget=#Button_0
      If GetGadgetState(#CheckBox_0)=1 
        a=Random(255)
          While a+30>255
            a=Random(255)
          Wend  
      EndIf  
      If GetGadgetState(#CheckBox_1)=1 
        b=Random(255)
          While b+30>255
            b=Random(255)
          Wend 
      EndIf  
      If GetGadgetState(#CheckBox_2)=1 
        c=Random(255)
          While c+30>255
            c=Random(255)
          Wend 
      EndIf
      
      Zalivka_Box (#Image_50, a,b,c)      
        SmartWindowRefresh(#Window_0, 1) ;Уменьшает мерцание окна
      Zalivka_Box (#Image_0, a+Result,b+Result,c+Result)  
        SmartWindowRefresh(#Window_0, 1)
      SetGadgetText(#Text_0,"Сгенерированный цвет: RGB("+Str(a)+":"+Str(b)+":"+Str(c)+")")
        If IsGadget(#Image_1)
          Zalivka_Box (#Image_1, Red(color),Green(color),Blue(color))
          SmartWindowRefresh(#Window_0, 1)
        EndIf          
      
   ElseIf Gadget=#Button_1
   
     If  IsGadget(#Image_1)=0
       ImageGadget(#Image_1, 430, 10, 400, 300, Image1, #PB_Image_Border)
     EndIf  
   
     color=ColorRequester()      
     Zalivka_Box (#Image_1, Red(color),Green(color),Blue(color))     
     SetGadgetText(#Text_1,"Выбраный цвет: RGB("+Str(Red(color))+":"+Str(Green(color))+":"+Str(Blue(color))+")")    
   ElseIf Gadget=#Image_0 Or Gadget=#Image_1
     
     StartDrawing(ImageOutput(Gadget))
     Cvet = Point(5, 5)     
     SetGadgetText(#Text_3,"Пипетка: RGB("+Str(Red(Cvet))+":"+Str(Green(Cvet))+":"+Str(Blue(Cvet))+")")     
     StopDrawing()
     
       If Gadget=#Image_1
         If  EventType=#PB_EventType_LeftDoubleClick
           FreeGadget(#Image_1)
         EndIf 
       EndIf              
     
    EndIf 
   
EndIf 
 
 
  
 Until Event=#PB_Event_CloseWindow
 ;}
 
 
End

Есть ли встроенная функция определения,-  активирован или деактивирован гаджет в данный момент?

Отредактировано Lucagin (15.12.2010 03:45:21)

0

915

Lucagin написал(а):

Есть ли встроенная функция определения,-  активирован или деактивирован гаджет в данный момент?

Подойдет или нет:

GetActiveGadget

Lucagin написал(а):

ТЕПЕРЬ ПРОБЛЕМА! При нажатии "Подобрать цвет" открывается окно палитры, если это окно перенести так, чтобы оно частично наложилось  на правый ImageGadget, то после закрытия окна палитры на изображении остается след с цветом фона, как этого избежать???

У меня не остается никаких следов.

0

916

Это проблема перерисовки...
Откажись от общего фона  #Image_50 - программа выглядит не хуже... или если он статический и нужен, нарисуй его через png файл

http://mirashic.narod.ru/var1.png

http://mirashic.narod.ru/var2.png

0

917

haav написал(а):

Подойдет или нет: GetActiveGadget

Ну не совсем, эта функция возвращает в фокусе ли гаджет, а мне надо, чтобы определило, деактивирован ли гаджет  DisableGadget(#Gadget, 1). Я конечно понимаю, что можно свою переменную ввести, которая отслеживала бы деактивацию. Просто интересно есть ли встроенная функция (я просто не нашел…) …

haav написал(а):

У меня не остается никаких следов.

вот видео что происходит у меня...
http://ifolder.ru/20817258

Отредактировано Lucagin (15.12.2010 11:24:26)

0

918

mirashic написал(а):

Это проблема перерисовки...Откажись от общего фона  #Image_50 - программа выглядит не хуже... или если он статический и нужен, нарисуй его через png файл

Понимаешь, от фона отказаться не могу, в программе как-бы 2-ве тренирующие функции.
1.Ты учишься видеть маленькие отклонения  между цветом фонового рисунка (Имадж50) и  цвета гаджета (Имадж_0) задаваемые бегунком…2.Вторая уже второстепенная функция,  пытаешься подобрать нужный цвет… На мой взгляд первая функция важнее, ради нее все затевалось…

Цвет фона как раз и генерируется случайно а цвет гаджета (левого) отклонение от него на значение бегунка, статический рисунок не подходит… :nope:

Правый гаджет можно отключить двойным кликом...

Отредактировано Lucagin (15.12.2010 11:37:58)

0

919

Можно так, но надо отказаться от бордюров:

Код:
Enumeration 
 #Window_0
 #Image_50     
 #Image_1
 #Button_1
 #Button_0
 #tamer  
EndEnumeration

Global    R1=250,G1=250,B1=250 
 
CreateImage(#Image_50, 840, 320) 
CreateImage(#Image_0, 400, 300)
CreateImage(#Image_1, 400, 300)

Procedure Zalivka_Box(R,G,B)
StartDrawing(ImageOutput(#Image_50)) 
 Box(0, 0, 840,320, RGB(R,G,B))
StopDrawing()
SetGadgetState(#Image_50,ImageID(#Image_50)) 
EndProcedure 

Procedure Zalivka_Box1()
StartDrawing(ImageOutput(#Image_1)) 
 Box(0, 0, 840,320, RGB(R1,G1,B1))
StopDrawing()
SetGadgetState(#Image_1,ImageID(#Image_1)) 
EndProcedure

OpenWindow(#Window_0, 392, 181, 840, 600, "Цвето_восприятие",  #PB_Window_SystemMenu |  #PB_Window_TitleBar )
  AddWindowTimer(#Window_0, #tamer, 100)
  
  ImageGadget(#Image_50, 0, 0, 840, 320, Image0)   
  ImageGadget(#Image_1, 430, 10, 400, 300, Image1)  

  ButtonGadget(#Button_1, 560, 420, 190, 70, "Подобрать цвет")
  ButtonGadget(#Button_0, 30, 420, 190, 70, "Случайный цвет")
  
Repeat
Event =  WaitWindowEvent() 
Window = EventWindow() 
Gadget = EventGadget()
   Select Event
        Case #PB_Event_Timer 
           Zalivka_Box1()
        Case #PB_Event_Gadget
          Select EventGadget()
             Case #Button_0  ;  Случайный цвет
               Zalivka_Box(Random(255),Random(255),Random(255))
             Case #Button_1 ; "Подобрать цвет"
               color=ColorRequester()
               If color <> -1
               R1=Red(color)
               G1=Green(color)
               B1=Blue(color)
               Zalivka_Box1()
               EndIf               
             Case 3
          EndSelect
   EndSelect
If Event = #PB_Event_CloseWindow 
Break                           
EndIf
ForEver

0

920

Вроде так работает как надо, если я все правильно понял.

Код:
;{ константы ID
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Image_0
  #Image_1
  #Image_50
  #TrackBar_0
  #Button_0
  #Button_1
  #Text_0
  #Text_1
  #Text_3
  #Text_4
  #CheckBox_0
  #CheckBox_1
  #CheckBox_2
EndEnumeration

;- Fonts
Global FontID1
FontID1 = LoadFont(1, "Arial", 16)
Global FontID2
FontID2 = LoadFont(2, "Arial", 12)
;}



Procedure Open_Window_0()
  If OpenWindow(#Window_0, 392, 181, 840, 600, "Цвето_восприятие",  #PB_Window_SystemMenu |  #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      
      CreateImage(#Image_50, 840, 320)
      ImageGadget(#Image_50, 0, 0, 840, 320, Image0, #PB_Image_Border)      
      TrackBarGadget(#TrackBar_0, 40, 500, 170, 40, 0, 10, #PB_TrackBar_Ticks)      
      ;DisableGadget(#Image_50,1)
      CreateImage(#Image_0, 400, 300)
      ImageGadget(#Image_0, 10, 10, 400, 300, Image0, #PB_Image_Border)
      SetParent_(GadgetID(#Image_0), GadgetID(#Image_50))
      CreateImage(#Image_1, 400, 300)
      ;ImageGadget(#Image_1, 430, 10, 400, 300, Image1, #PB_Image_Border)     
      ButtonGadget(#Button_0, 30, 420, 190, 70, "Случайный цвет")
      SetGadgetFont(#Button_0, FontID1)
      ButtonGadget(#Button_1, 560, 420, 190, 70, "Подобрать цвет")
      SetGadgetFont(#Button_1, FontID1)
      TextGadget(#Text_0, 7, 340, 420, 40, "Сгенерированный цвет:")
      SetGadgetFont(#Text_0, FontID1)      
      TextGadget(#Text_1, 440, 340, 420, 40, "Выбраный цвет:")
      SetGadgetFont(#Text_1, FontID1)
      TextGadget(#Text_3, 320, 380, 390, 40, "Пипетка: ") 
      SetGadgetFont(#Text_3, FontID1)           
      TextGadget(#Text_4, 40, 540, 390, 40, "Шаг изменения: 0 ")
      SetGadgetFont(#Text_4, FontID1)      
      CheckBoxGadget(#CheckBox_0, 260, 430, 60, 30, "Red")
      SetGadgetFont(#CheckBox_0, FontID2)
      CheckBoxGadget(#CheckBox_1, 260, 470, 70, 40, "Green")
      SetGadgetFont(#CheckBox_1, FontID2)
      CheckBoxGadget(#CheckBox_2, 260, 510, 70, 40, "Blue")
      SetGadgetFont(#CheckBox_2, FontID2)      
    EndIf
      HideWindow(#Window_0, 1)
  EndIf
EndProcedure

Procedure Zalivka_Box (ID, R,G,B)
    
  If IsImage(ID) ; Существует ли рисунок с таким ID
    W = ImageWidth(ID)
    H = ImageHeight(ID)    
    If StartDrawing(ImageOutput(ID))
      Box(0, 0, W,H, RGB(R, G, B))
      StopDrawing() 
      SetGadgetState(ID, ImageID(ID))
    EndIf
  EndIf
    
EndProcedure


Open_Window_0()

HideWindow(#Window_0, 0)

;{Основной цикл
Repeat
  Event = WaitWindowEvent()
  EventType = EventType() 
  Gadget = EventGadget()  
        
If Event=#PB_Event_Gadget
    
   If Gadget=#TrackBar_0
      Result = GetGadgetState(#TrackBar_0)
      SetGadgetText(#Text_4,"Шаг изменения: "+Str(Result))
    
   ElseIf Gadget=#Button_0
      If GetGadgetState(#CheckBox_0)=1 
        a=Random(255)
          While a+30>255
            a=Random(255)
          Wend  
      EndIf  
      If GetGadgetState(#CheckBox_1)=1 
        b=Random(255)
          While b+30>255
            b=Random(255)
          Wend 
      EndIf  
      If GetGadgetState(#CheckBox_2)=1 
        c=Random(255)
          While c+30>255
            c=Random(255)
          Wend 
      EndIf
      
      Zalivka_Box (#Image_50, a,b,c)      
        ;SmartWindowRefresh(#Window_0, 1) ;Уменьшает мерцание окна
      Zalivka_Box (#Image_0, a+Result,b+Result,c+Result)  
        ;SmartWindowRefresh(#Window_0, 1)
      SetGadgetText(#Text_0,"Сгенерированный цвет: RGB("+Str(a)+":"+Str(b)+":"+Str(c)+")")
        If IsGadget(#Image_1)
          Zalivka_Box (#Image_1, Red(color),Green(color),Blue(color))
          ;SmartWindowRefresh(#Window_0, 1)
        EndIf          
      
   ElseIf Gadget=#Button_1
   
      
   
     color=ColorRequester()
     If color> -1
       If  IsGadget(#Image_1)=0
         ImageGadget(#Image_1, 430, 10, 400, 300, Image1, #PB_Image_Border)
         SetParent_(GadgetID(#Image_1), GadgetID(#Image_50))
       EndIf 
       Zalivka_Box (#Image_1, Red(color),Green(color),Blue(color))     
       SetGadgetText(#Text_1,"Выбраный цвет: RGB("+Str(Red(color))+":"+Str(Green(color))+":"+Str(Blue(color))+")")    
     EndIf
   ElseIf Gadget=#Image_0 Or Gadget=#Image_1
     
     StartDrawing(ImageOutput(Gadget))
     Cvet = Point(5, 5)     
     SetGadgetText(#Text_3,"Пипетка: RGB("+Str(Red(Cvet))+":"+Str(Green(Cvet))+":"+Str(Blue(Cvet))+")")     
     StopDrawing()
     
       If Gadget=#Image_1
         If  EventType=#PB_EventType_LeftDoubleClick
           FreeGadget(#Image_1)
         EndIf 
       EndIf              
     
    EndIf 
   
EndIf 
 
 
  
 Until Event=#PB_Event_CloseWindow
 ;}
 
 
End

0

921

mirashic написал(а):

Можно так, но надо отказаться от бордюров:

Т.е. ты каждые 100 Мсек перерисовываешь #Image_1. Тоже идея. Работает четко!!!  Интересно  сколько Min. надо   перерисовок, чтобы остатка изображения не было, чтобы потом удалить таймер? Хочу сейчас попробовать переделать программу, заменив фоновое изображение на ContainerGadget().  Посмотрим что получится…

Отредактировано Lucagin (15.12.2010 14:11:28)

0

922

Пётр написал(а):

Вроде так работает как надо, если я все правильно понял.

Спасибо Петр, все четко работает!!!
А что делает API-функция SetParent_(GadgetID(#Image_1), GadgetID(#Image_50))?

0

923

Lucagin написал(а):

А что делает API-функция SetParent_(GadgetID(#Image_1), GadgetID(#Image_50))

Если в двух словах, то меняет окно-родитель, для дочернего окна.
Если раньше для #Image_0 и #Image_1 окном-родителем было окно программы, то после выполнения этой функции, окном-родителем станет #Image_50.
Таким образом будет работать все корректно, т. к. за правильную прорисовку отвечает на наша программа, а операционная система.

http://www.firststeps.ru/mfc/winapi/win/r.php?93

0

924

Пётр написал(а):

http://www.firststeps.ru/mfc/winapi/win/r.php?93

Здорово, Пётр!!! Огромное спасибо!!! Как раз то, что надо. Команда по большому счету превращает #Image_50 в ContainerGadget()… Вот только не понятно, почему определение цвета ImageGadget стало определяться не одинарным кликом, а двойным (143-я строк кода… )??? У меня изначально на двойной клик мыши было установлено удаление правой картинки. Но в принципе это можно поменять… :о)

Код:
;{ константы ID
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Image_0
  #Image_1
  #Image_50
  #TrackBar_0
  #Button_0
  #Button_1
  #Text_0
  #Text_1
  #Text_3
  #Text_4
  #CheckBox_0
  #CheckBox_1
  #CheckBox_2
EndEnumeration

;- Fonts
Global FontID1
FontID1 = LoadFont(1, "Arial", 16)
Global FontID2
FontID2 = LoadFont(2, "Arial", 12)
;}



Procedure Open_Window_0()
  If OpenWindow(#Window_0, 392, 181, 840, 600, "Цвето_восприятие",  #PB_Window_SystemMenu |  #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      
      CreateImage(#Image_50, 840, 320)
      ImageGadget(#Image_50, 0, 0, 840, 320, Image0, #PB_Image_Border)      
      TrackBarGadget(#TrackBar_0, 40, 500, 170, 40, 0, 10, #PB_TrackBar_Ticks)      
      ;DisableGadget(#Image_50,1)
      CreateImage(#Image_0, 400, 300)
      ImageGadget(#Image_0, 10, 10, 400, 300, Image0);, #PB_Image_Border)
      SetParent_(GadgetID(#Image_0), GadgetID(#Image_50))
      CreateImage(#Image_1, 400, 300)
      ;ImageGadget(#Image_1, 430, 10, 400, 300, Image1, #PB_Image_Border)     
      ButtonGadget(#Button_0, 30, 420, 190, 70, "Случайный цвет")
      SetGadgetFont(#Button_0, FontID1)
      ButtonGadget(#Button_1, 560, 420, 190, 70, "Подобрать цвет")
      SetGadgetFont(#Button_1, FontID1)
      TextGadget(#Text_0, 7, 340, 420, 40, "Сгенерированный цвет:")
      SetGadgetFont(#Text_0, FontID1)      
      TextGadget(#Text_1, 440, 340, 420, 40, "Выбраный цвет:")
      SetGadgetFont(#Text_1, FontID1)
      TextGadget(#Text_3, 320, 380, 390, 40, "Пипетка: ") 
      SetGadgetFont(#Text_3, FontID1)           
      TextGadget(#Text_4, 40, 540, 390, 40, "Шаг изменения: 0 ")
      SetGadgetFont(#Text_4, FontID1)      
      CheckBoxGadget(#CheckBox_0, 260, 430, 60, 30, "Red")
      SetGadgetFont(#CheckBox_0, FontID2)
      CheckBoxGadget(#CheckBox_1, 260, 470, 70, 40, "Green")
      SetGadgetFont(#CheckBox_1, FontID2)
      CheckBoxGadget(#CheckBox_2, 260, 510, 70, 40, "Blue")
      SetGadgetFont(#CheckBox_2, FontID2)      
    EndIf
      HideWindow(#Window_0, 1)
  EndIf
EndProcedure

Procedure Zalivka_Box (ID, R,G,B)
    
  If IsImage(ID) ; Существует ли рисунок с таким ID
    W = ImageWidth(ID)
    H = ImageHeight(ID)    
    If StartDrawing(ImageOutput(ID))
      Box(0, 0, W,H, RGB(R, G, B))
      StopDrawing() 
      SetGadgetState(ID, ImageID(ID))
    EndIf
  EndIf
    
EndProcedure


Open_Window_0()

HideWindow(#Window_0, 0)

;{Основной цикл
Repeat
  Event = WaitWindowEvent()
  EventType = EventType() 
  Gadget = EventGadget()  
        
If Event=#PB_Event_Gadget
    
   If Gadget=#TrackBar_0
      Result = GetGadgetState(#TrackBar_0)
      SetGadgetText(#Text_4,"Шаг изменения: "+Str(Result))
    
   ElseIf Gadget=#Button_0
      If GetGadgetState(#CheckBox_0)=1 
        a=Random(255)
          While a+Result>255
            a=Random(255)
          Wend  
      EndIf  
      If GetGadgetState(#CheckBox_1)=1 
        b=Random(255)
          While b+Result>255
            b=Random(255)
          Wend 
      EndIf  
      If GetGadgetState(#CheckBox_2)=1 
        c=Random(255)
          While c+Result>255
            c=Random(255)
          Wend 
      EndIf
      
      Zalivka_Box (#Image_50, a,b,c)      
        ;SmartWindowRefresh(#Window_0, 1) ;Уменьшает мерцание окна
      Zalivka_Box (#Image_0, a+Result,b+Result,c+Result)  
        ;SmartWindowRefresh(#Window_0, 1)
      SetGadgetText(#Text_0,"Сгенерированный цвет: RGB("+Str(a)+":"+Str(b)+":"+Str(c)+")")
        If IsGadget(#Image_1)
          Zalivka_Box (#Image_1, Red(color),Green(color),Blue(color))
          ;SmartWindowRefresh(#Window_0, 1)
        EndIf          
      
   ElseIf Gadget=#Button_1
   
      
   
     color=ColorRequester()
     If color> -1
       If  IsGadget(#Image_1)=0
         ImageGadget(#Image_1, 430, 10, 400, 300, Image1, #PB_Image_Border)
         SetParent_(GadgetID(#Image_1), GadgetID(#Image_50))
       EndIf 
       Zalivka_Box (#Image_1, Red(color),Green(color),Blue(color))     
       SetGadgetText(#Text_1,"Выбраный цвет: RGB("+Str(Red(color))+":"+Str(Green(color))+":"+Str(Blue(color))+")")    
     EndIf
   ElseIf Gadget=#Image_0 Or Gadget=#Image_1     ; <= Здесь вроде условие на однинарный клик мышки...???
     
     StartDrawing(ImageOutput(Gadget))
     Cvet = Point(5, 5)     
     SetGadgetText(#Text_3,"Пипетка: RGB("+Str(Red(Cvet))+":"+Str(Green(Cvet))+":"+Str(Blue(Cvet))+")")     
     StopDrawing()
     
       If Gadget=#Image_1
         If  EventType=#PB_EventType_LeftDoubleClick
           FreeGadget(#Image_1)
         EndIf 
       EndIf              
     
    EndIf 
   
EndIf 
 
 
  
 Until Event=#PB_Event_CloseWindow
 ;}
 
 
End

Отредактировано Lucagin (15.12.2010 14:51:37)

0

925

Да, одиночный клик где-то теряется.
Можно удалять рисунок кликом правой кнопки.

0

926

Пётр написал(а):

Да, одиночный клик где-то теряется.Можно удалять рисунок кликом правой кнопки.

Так и сделаю. Спасибо!!! :cool:

0

927

Пётр написал(а):

Да, одиночный клик где-то теряется.

Уже не теряется

Код:
;{ константы ID
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Image_0
  #Image_1
  #Image_50
  #TrackBar_0
  #Button_0
  #Button_1
  #Text_0
  #Text_1
  #Text_3
  #Text_4
  #CheckBox_0
  #CheckBox_1
  #CheckBox_2
EndEnumeration

;- Fonts
Global FontID1
FontID1 = LoadFont(1, "Arial", 16)
Global FontID2
FontID2 = LoadFont(2, "Arial", 12)
;}

Procedure Simulate_GadgetEvent(Gadget, EventType) 
   Protected wp=Gadget+EventType<<(SizeOf(Word)*8) 
   Protected lp=GadgetID(Gadget) 
   ;get parent window 
   Protected win=GetParent_(GadgetID(Gadget)) 
   While GetParent_(win) : win=GetParent_(win) : Wend 
   ;send message to window 
   PostMessage_(win, #WM_COMMAND, wp, lp) 
EndProcedure 

Procedure Im_CallBack(hwnd, msg, wParam, lParam)
  
  *PointOldImFunc=GetWindowLong_(hWnd,#GWL_USERDATA)
  If msg=#WM_LBUTTONDOWN
    Simulate_GadgetEvent(GetDlgCtrlID_(hwnd), #PB_EventType_LeftClick)  
  EndIf
ProcedureReturn CallWindowProc_(*PointOldImFunc,hwnd, msg, wParam, lParam)
EndProcedure


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 392, 181, 840, 600, "Цвето_восприятие",  #PB_Window_SystemMenu |  #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      
      CreateImage(#Image_50, 840, 320)
      ImageGadget(#Image_50, 0, 0, 840, 320, Image0, #PB_Image_Border)      
      TrackBarGadget(#TrackBar_0, 40, 500, 170, 40, 0, 10, #PB_TrackBar_Ticks)      
      ;DisableGadget(#Image_50,1)
      CreateImage(#Image_0, 400, 300)
      ImageGadget(#Image_0, 10, 10, 400, 300, Image0);, #PB_Image_Border)
        SetParent_(GadgetID(#Image_0), GadgetID(#Image_50))
        *Func=GetWindowLong_(GadgetID(#Image_0), #GWL_WNDPROC)
        SetWindowLong_(GadgetID(#Image_0),#GWL_USERDATA, *Func)
        SetWindowLong_(GadgetID(#Image_0), #GWL_WNDPROC, @Im_CallBack())
      CreateImage(#Image_1, 400, 300)
      ;ImageGadget(#Image_1, 430, 10, 400, 300, Image1, #PB_Image_Border)     
      ButtonGadget(#Button_0, 30, 420, 190, 70, "Случайный цвет")
      SetGadgetFont(#Button_0, FontID1)
      ButtonGadget(#Button_1, 560, 420, 190, 70, "Подобрать цвет")
      SetGadgetFont(#Button_1, FontID1)
      TextGadget(#Text_0, 7, 340, 420, 40, "Сгенерированный цвет:")
      SetGadgetFont(#Text_0, FontID1)      
      TextGadget(#Text_1, 440, 340, 420, 40, "Выбраный цвет:")
      SetGadgetFont(#Text_1, FontID1)
      TextGadget(#Text_3, 320, 380, 390, 40, "Пипетка: ") 
      SetGadgetFont(#Text_3, FontID1)           
      TextGadget(#Text_4, 40, 540, 390, 40, "Шаг изменения: 0 ")
      SetGadgetFont(#Text_4, FontID1)      
      CheckBoxGadget(#CheckBox_0, 260, 430, 60, 30, "Red")
      SetGadgetFont(#CheckBox_0, FontID2)
      CheckBoxGadget(#CheckBox_1, 260, 470, 70, 40, "Green")
      SetGadgetFont(#CheckBox_1, FontID2)
      CheckBoxGadget(#CheckBox_2, 260, 510, 70, 40, "Blue")
      SetGadgetFont(#CheckBox_2, FontID2)      
    EndIf
      HideWindow(#Window_0, 1)
  EndIf
EndProcedure

Procedure Zalivka_Box (ID, R,G,B)
    
  If IsImage(ID) ; Существует ли рисунок с таким ID
    W = ImageWidth(ID)
    H = ImageHeight(ID)    
    If StartDrawing(ImageOutput(ID))
      Box(0, 0, W,H, RGB(R, G, B))
      StopDrawing() 
      SetGadgetState(ID, ImageID(ID))
    EndIf
  EndIf
    
EndProcedure


Open_Window_0()

HideWindow(#Window_0, 0)

;{Основной цикл
Repeat
  Event = WaitWindowEvent()
  EventType = EventType() 
  Gadget = EventGadget()  
        
If Event=#PB_Event_Gadget
    
   If Gadget=#TrackBar_0
      Result = GetGadgetState(#TrackBar_0)
      SetGadgetText(#Text_4,"Шаг изменения: "+Str(Result))
    
   ElseIf Gadget=#Button_0
      If GetGadgetState(#CheckBox_0)=1 
        a=Random(255)
          While a+Result>255
            a=Random(255)
          Wend  
      EndIf  
      If GetGadgetState(#CheckBox_1)=1 
        b=Random(255)
          While b+Result>255
            b=Random(255)
          Wend 
      EndIf  
      If GetGadgetState(#CheckBox_2)=1 
        c=Random(255)
          While c+Result>255
            c=Random(255)
          Wend 
      EndIf
      
      Zalivka_Box (#Image_50, a,b,c)      
        ;SmartWindowRefresh(#Window_0, 1) ;Уменьшает мерцание окна
      Zalivka_Box (#Image_0, a+Result,b+Result,c+Result)  
        ;SmartWindowRefresh(#Window_0, 1)
      SetGadgetText(#Text_0,"Сгенерированный цвет: RGB("+Str(a)+":"+Str(b)+":"+Str(c)+")")
        If IsGadget(#Image_1)
          Zalivka_Box (#Image_1, Red(color),Green(color),Blue(color))
          ;SmartWindowRefresh(#Window_0, 1)
        EndIf          
      
   ElseIf Gadget=#Button_1
   
      
   
     color=ColorRequester()
     If color> -1
       If  IsGadget(#Image_1)=0
         ImageGadget(#Image_1, 430, 10, 400, 300, Image1, #PB_Image_Border)
         SetParent_(GadgetID(#Image_1), GadgetID(#Image_50))
         *Func=GetWindowLong_(GadgetID(#Image_1), #GWL_WNDPROC)
         SetWindowLong_(GadgetID(#Image_1),#GWL_USERDATA, *Func)
         SetWindowLong_(GadgetID(#Image_1), #GWL_WNDPROC, @Im_CallBack())
       EndIf 
       Zalivka_Box (#Image_1, Red(color),Green(color),Blue(color))     
       SetGadgetText(#Text_1,"Выбраный цвет: RGB("+Str(Red(color))+":"+Str(Green(color))+":"+Str(Blue(color))+")")    
     EndIf
   ElseIf Gadget=#Image_0 Or Gadget=#Image_1     ; <= Здесь вроде условие на однинарный клик мышки...???
     
     StartDrawing(ImageOutput(Gadget))
     Cvet = Point(5, 5)     
     SetGadgetText(#Text_3,"Пипетка: RGB("+Str(Red(Cvet))+":"+Str(Green(Cvet))+":"+Str(Blue(Cvet))+")")     
     StopDrawing()
     
       If Gadget=#Image_1
         If  EventType=#PB_EventType_LeftDoubleClick
           
           SetWindowLong_(GadgetID(#Image_1), #GWL_WNDPROC, GetWindowLong_(GadgetID(#Image_1),#GWL_USERDATA))
           FreeGadget(#Image_1)
         EndIf 
       EndIf              
     
    EndIf 
   
EndIf 
 
 
  
 Until Event=#PB_Event_CloseWindow
 ;}
 
 
End

0

928

Накидал программку, которая показывает на экране изображение указанное число милиСекунд. Почему-то при пороге <18 МСек картинка не успевает полностью отобразиться на экране (какая-то половинчатость выходит). Сколько, интересно, надо времени на прорисовку картинки на экране и как реально оценить соответствует ли время отображения картинки заданным Милисекундам??? Что-то у меня большие сомнения,  что я вижу картинку именно заданное число Мсек.??   

Код:
;{константы
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Image_0
  #Button_0
  #Text_0
  #TrackBar_0
EndEnumeration

UseJPEGImageDecoder()

;- Fonts
Global FontID1
FontID1 = LoadFont(1, "Arial", 48)
Global FontID2
FontID2 = LoadFont(2, "Arial", 26)
Global FontID3
FontID3 = LoadFont(3, "Arial", 12)
Global FontID4
FontID4 = LoadFont(4, "Arial", 20)
Global FontID5
FontID5 = LoadFont(5, "Arial", 16)
Global FontID6
FontID6 = LoadFont(6, "Arial", 14)
;- Image Plugins

;- Image Globals
Global Image0

;- Catch Images
Image0 = CatchImage(0, ?Image0)

;- Images
DataSection
Image0:
  IncludeBinary "1.jpg"
EndDataSection
;}

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 465, 101, 782, 729, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      ImageGadget(#Image_0, 140, 10, 500, 500, 0)
      ButtonGadget(#Button_0, 380, 590, 230, 100, "Загрузить")
      SetGadgetFont(#Button_0, FontID2)
      TextGadget(#Text_0, 40, 640, 240, 30, "Время задуржки: 1 Мсек")
      SetGadgetFont(#Text_0, FontID6)
      TrackBarGadget(#TrackBar_0, 30, 590, 240, 40, 1, 100)
      
    EndIf
  EndIf
EndProcedure


Open_Window_0()

;{Основной цикл
Repeat
  Event = WaitWindowEvent()
  Gadget = EventGadget()
  
  If Gadget=#TrackBar_0
      Result = GetGadgetState(#TrackBar_0)
      SetGadgetText(#Text_0,"Время задержки: " +Str(Result)+"Мсек")
      
  ElseIf Event=#PB_Event_Gadget
      If Gadget=#Button_0
        SetGadgetState(#Image_0, ImageID(0))       
           Delay(Result)
        SetGadgetState(ID, 0) 
      EndIf    
  EndIf    
 Until Event=#PB_Event_CloseWindow
 ;}
 
End

Здесь код с картинкой http://willvs822.ifolder.ru/20824815

Отредактировано Lucagin (15.12.2010 17:45:34)

0

929

Выше вроде объясняли про Delay и то, что нужно обрадатывать события програмы с помощью функции  WaitWindow или EventWindowEvent.

Код:
;{константы
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Image_0
  #Button_0
  #Text_0
  #TrackBar_0
EndEnumeration

UseJPEGImageDecoder()

;- Fonts
Global FontID1
FontID1 = LoadFont(1, "Arial", 48)
Global FontID2
FontID2 = LoadFont(2, "Arial", 26)
Global FontID3
FontID3 = LoadFont(3, "Arial", 12)
Global FontID4
FontID4 = LoadFont(4, "Arial", 20)
Global FontID5
FontID5 = LoadFont(5, "Arial", 16)
Global FontID6
FontID6 = LoadFont(6, "Arial", 14)
;- Image Plugins

;- Image Globals
Global Image0

;- Catch Images
Image0 = CatchImage(0, ?Image0)

;- Images
DataSection
Image0:
  IncludeBinary "1.jpg"
EndDataSection
;}

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 465, 101, 782, 729, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      ImageGadget(#Image_0, 140, 10, 500, 500, 0)
      ButtonGadget(#Button_0, 380, 590, 230, 100, "Загрузить")
      SetGadgetFont(#Button_0, FontID2)
      TextGadget(#Text_0, 40, 640, 240, 30, "Время задуржки: 1 Мсек")
      SetGadgetFont(#Text_0, FontID6)
      TrackBarGadget(#TrackBar_0, 30, 590, 240, 40, 1, 100)
      
    EndIf
  EndIf
EndProcedure


Open_Window_0()

;{Основной цикл
Repeat
  Event = WaitWindowEvent()
  Gadget = EventGadget()
  
  If Gadget=#TrackBar_0
      Result = GetGadgetState(#TrackBar_0)
      SetGadgetText(#Text_0,"Время задержки: " +Str(Result)+"Мсек")
      
  ElseIf Event=#PB_Event_Gadget
      If Gadget=#Button_0
        SetGadgetState(#Image_0, ImageID(0))       
          ;Delay(Result)
          EndTime=ElapsedMilliseconds()+Result
          Repeat
            WaitWindowEvent(1)
          Until ElapsedMilliseconds()>EndTime
        SetGadgetState(ID, 0) 
      EndIf    
  EndIf    
 Until Event=#PB_Event_CloseWindow
 ;}
 
End

0

930

Пётр написал(а):

Выше вроде объясняли про Delay и то, что нужно обрадатывать события програмы с помощью функции  WaitWindow или EventWindowEvent.

Различий в работе программы вроде не заметно, те же 18 Мсек, предел корректно отображения? Это чем-то определено?

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопросы новичка