Какая-то лабуда рисуется.
Светодиодная матрица - МОДЖЕТ (антигаджет) на Пурике
Сообщений 271 страница 300 из 446
Поделиться27212.07.2011 18:35:24
Должно быть так?
А разве нет?
Разве не цель в том, чтобы нарисовать матрицу в окне и вывести на нее символы?
Какая-то лабуда рисуется.
Тот пример что я выложил, нормально работает - выводит текст?
Поделиться27312.07.2011 18:37:27
Тот пример что я выложил, нормально работает - выводит текст?
Да.
Поделиться27412.07.2011 18:38:28
Какая-то лабуда рисуется.
Код.
Structure DrawInfo row.b[8] EndStructure CreateImage(0,148,148); Procedure Draw_Image(*Infa.DrawInfo) If StartDrawing(ImageOutput(0)) Box(83,0,148,148,0) ; Очистка рисунка For col = 7 To 1 Step -1 For row = 0 To 7 x = 8 * row + col y = 8 * row + col If *Infa\row[row] << col & %10000000 Color = RGB(255, 102, 00) Else Color = RGB(102, 102, 102) EndIf Circle(x, y, 5, Color) Next row Next col For row = 0 To 7 x = row y = row Next row StopDrawing() EndIf SetGadgetState(0, ImageID(0)) EndProcedure Procedure Timer1() ImageDraw.DrawInfo For i=0 To 7 ImageDraw\row[i] = Random(255) Next i Draw_Image(@ImageDraw) EndProcedure Image.DrawInfo If OpenWindow(0, 0, 0, 277, 260, "О", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) ImageGadget(0,20,20,148,148, 0) Draw_Image(@Image) SetTimer_(WindowID(0),2,100, @Timer1() ) Repeat Event = WaitWindowEvent() Until Event = #PB_Event_CloseWindow EndIf
Поделиться27512.07.2011 18:50:47
Чем не подошел такой вариант процедуры?
Зачем было переделывать?
Procedure Draw_Image(*Infa.DrawInfo) If StartDrawing(ImageOutput(0)) Box(0,0,148,148,0) ; Очистка рисунка For col = 0 To 7 For row = 0 To 7 x = 20 + col * 15 y = 20 + row * 15 If *Infa\row[row] << col & %10000000 Color = RGB(210, 27, 45) Else Color = RGB(131, 137, 141) EndIf Circle(x, y, 5, Color) Next Next StopDrawing() EndIf SetGadgetState(0, ImageID(0)) EndProcedure
Поделиться27612.07.2011 18:54:09
Значит тогда матрицу надо рисовать в Procedure Timer1()?
Поделиться27712.07.2011 18:57:47
Timer1() надо вызывать по таймеру, а текст размещать в переменной ShiftString_String.
При каждой замене текста, нужно обнулять переменные ShiftString_Pos и ShiftString_String_Pos.
Поделиться27812.07.2011 19:00:54
С текстом понятно. А как тогда нарисовать эффект "Матрица"?
Отредактировано max (12.07.2011 19:01:53)
Поделиться27912.07.2011 19:08:57
Нужен сдвиг сверху вниз?
Поделиться28112.07.2011 19:31:37
Нужно "двигать" данные в структуре - копии матрицы, ведь именно от ее содержимого зависит картинка.
Если изменить данные в структуре, изменяться данные, отображаемые матрицой.
Structure DrawInfo row.a[8] EndStructure CreateImage(0,148,148); Procedure Draw_Image(*Infa.DrawInfo) If StartDrawing(ImageOutput(0)) Box(83,0,148,148,0) ; Очистка рисунка For col = 0 To 7 For row = 0 To 7 x = 20 + col * 15 y = 20 + row * 15 If *Infa\row[row] << col & %10000000 Color = RGB(255, 102, 00) Else Color = RGB(102, 102, 102) EndIf Circle(x, y, 5, Color) Next Next StopDrawing() EndIf SetGadgetState(0, ImageID(0)) EndProcedure Procedure Timer1() Static Draw.DrawInfo, i For i=6 To 0 Step -1 Draw\row[i+1] = Draw\row[i] Next i Draw\row[0]=Random(255) Draw_Image(Draw) EndProcedure If OpenWindow(0, 0, 0, 277, 260, "О", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) ImageGadget(0,20,20,148,148, 0) Timer1() SetTimer_(WindowID(0),0,800, @Timer1()) Repeat Event = WaitWindowEvent() Until Event = #PB_Event_CloseWindow EndIf
Поделиться28212.07.2011 19:41:51
Спасибо! А чтобы соеденить два эффекта, нужно одну процедуру Timer1() переименовать в Procedure Timer2()?
Поделиться28312.07.2011 19:44:30
Можно и так, а можно сделать все в одной процедуре, выбирая требуемый эффект с помощью условий.
Это уже как будет удобнее.
Поделиться28412.07.2011 19:45:34
Понял, спасибо.
Поделиться28512.07.2011 20:38:27
Пытался сделать выбор эффекта, но как всегда грабли.
Structure DrawInfo row.a[8] EndStructure CreateImage(0,148,148); Procedure Draw_Image(*Infa.DrawInfo) If StartDrawing(ImageOutput(0)) Box(83,0,148,148,0) ; Очистка рисунка For col = 0 To 7 For row = 0 To 7 x = 20 + col * 15 y = 20 + row * 15 If *Infa\row[row] << col & %10000000 Color = RGB(255, 102, 00) Else Color = RGB(102, 102, 102) EndIf Circle(x, y, 5, Color) Next Next StopDrawing() EndIf SetGadgetState(0, ImageID(0)) EndProcedure Procedure Timer1() Static Draw.DrawInfo, i For i=0 To 7 Draw\row[i] = Random(255) Next i Draw_Image(Draw) EndProcedure Procedure Timer2() Static Draw.DrawInfo, i For i=6 To 0 Step -1 Draw\row[i+1] = Draw\row[i] Next i Draw\row[0]=Random(255) Draw_Image(Draw) EndProcedure OpenWindow(0, 0, 0, 277, 260, "О", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) OptionGadget(14, 214, 23, 60, 20, "1") OptionGadget(15, 214, 43, 90, 20, "2") SetGadgetState(14, 1) ImageGadget(0,20,20,148,148, 0) ;Timer1() ;Timer2() ;SetTimer_(WindowID(0),2,100, @Timer1()) ;SetTimer_(WindowID(0),0,800, @Timer2()) Repeat Event = WaitWindowEvent() ;{----------События компонентов---------- If Event=#PB_Event_Gadget Select EventGadget() Case 14 Timer1() SetTimer_(WindowID(0),2,100, @Timer1()) Case 15 Timer2() SetTimer_(WindowID(0),0,800, @Timer2()) EndSelect EndIf ;}------------------------------------- Until Event = #PB_Event_CloseWindow
Поделиться28612.07.2011 22:09:15
"Вешать" все эффекты нужно на таймер с одним и тем же идентификатором (зачем разные, если в один и тот же промежуток времени работает только один таймер?) и нужно завершать работу предыдущего таймера при выборе нового эффекта.
Грабли были из-за того что одновременно работали два таймера, т. е. два эффекта были одновременно.
Structure DrawInfo row.a[8] EndStructure CreateImage(0,148,148); Procedure Draw_Image(*Infa.DrawInfo) If StartDrawing(ImageOutput(0)) Box(83,0,148,148,0) ; Очистка рисунка For col = 0 To 7 For row = 0 To 7 x = 20 + col * 15 y = 20 + row * 15 If *Infa\row[row] << col & %10000000 Color = RGB(255, 102, 00) Else Color = RGB(102, 102, 102) EndIf Circle(x, y, 5, Color) Next Next StopDrawing() EndIf SetGadgetState(0, ImageID(0)) EndProcedure Procedure Timer1() Static Draw.DrawInfo, i For i=0 To 7 Draw\row[i] = Random(255) Next i Draw_Image(Draw) EndProcedure Procedure Timer2() Static Draw.DrawInfo, i For i=6 To 0 Step -1 Draw\row[i+1] = Draw\row[i] Next i Draw\row[0]=Random(255) Draw_Image(Draw) EndProcedure OpenWindow(0, 0, 0, 277, 260, "О", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) OptionGadget(14, 214, 23, 60, 20, "1") OptionGadget(15, 214, 43, 90, 20, "2") SetGadgetState(14, 1) ImageGadget(0,20,20,148,148, 0) ;Timer1() ;Timer2() ;SetTimer_(WindowID(0),2,100, @Timer1()) ;SetTimer_(WindowID(0),0,800, @Timer2()) Repeat Event = WaitWindowEvent() ;{----------События компонентов---------- If Event=#PB_Event_Gadget Select EventGadget() Case 14 KillTimer_(WindowID(0),2) Timer1() SetTimer_(WindowID(0),2,100, @Timer1()) Case 15 KillTimer_(WindowID(0),2) Timer2() SetTimer_(WindowID(0),2,800, @Timer2()) EndSelect EndIf ;}------------------------------------- Until Event = #PB_Event_CloseWindow
Поделиться28713.07.2011 18:31:57
зачем разные, если в один и тот же промежуток времени работает только один таймер?
Согласен.
нужно завершать работу предыдущего таймера при выборе нового эффекта.
Про это не знал.
Спасибо.
А что-бы регулировать кол-во светодиодов нужно менять значение Random? И если да, то как это привязать к двжку?
По поводу скорости вообще никаких соображений.
Отредактировано max (13.07.2011 19:15:46)
Поделиться28813.07.2011 19:25:11
А что-бы регулировать кол-во светодиодов нужно менять значение Random?
В смысле, их там ведь 64 или нет?
По поводу скорости вообще никаких соображений.
Третий аргумент функции SetTimer задает время в миллисекундах через которое будет регулярно вызываться процедура.
Изменяя это время, можно изменять скорость.
Поделиться28913.07.2011 19:37:32
В смысле, их там ведь 64 или нет?
То есть регулировать кол-во заженных пикселей в строке.
В оригенальной проге это движок "Massa".
Третий аргумент функции SetTimer задает время в миллисекундах через которое будет регулярно вызываться процедура.
Изменяя это время, можно изменять скорость.
А в каких пределах можно изменять этот аргумент?
Отредактировано max (13.07.2011 20:10:58)
Поделиться29013.07.2011 20:15:55
А в каких пределах можно изменять этот аргумент?
От десяти до нескольких тысяч.
Поделиться29113.07.2011 20:57:43
Изменяя это время, можно изменять скорость.
Может я что-то не понял?
pt.w Structure DrawInfo row.a[8] EndStructure CreateImage(0,148,148); Procedure Draw_Image(*Infa.DrawInfo) If StartDrawing(ImageOutput(0)) Box(83,0,148,148,0) ; Очистка рисунка For col = 0 To 7 For row = 0 To 7 x = 20 + col * 15 y = 20 + row * 15 If *Infa\row[row] << col & %10000000 Color = RGB(255, 102, 00) Else Color = RGB(102, 102, 102) EndIf Circle(x, y, 5, Color) Next Next StopDrawing() EndIf SetGadgetState(0, ImageID(0)) EndProcedure Procedure Timer1() Static Draw.DrawInfo, i For i=0 To 7 Draw\row[i] = Random(255) Next i Draw_Image(Draw) EndProcedure Procedure Timer2() Static Draw.DrawInfo, i For i=6 To 0 Step -1 Draw\row[i+1] = Draw\row[i] Next i Draw\row[0]=Random(255) Draw_Image(Draw) EndProcedure OpenWindow(0, 0, 0, 535, 186, "МОДЖЕТ 8x8", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered) OptionGadget(14, 214, 23, 60, 20, "1") OptionGadget(15, 214, 43, 90, 20, "2") SetGadgetState(14, 1) TrackBarGadget(19, 300, 57, 165, 35, 0, 100, #PB_TrackBar_Ticks) TextGadget(23, 300, 90, 50 ,13,"Скорость") ImageGadget(0,20,20,148,148, 0) Repeat Event = WaitWindowEvent() ;{----------События компонентов---------- If Event=#PB_Event_Gadget Select EventGadget() Case 14 KillTimer_(WindowID(0),2) Timer1() SetTimer_(WindowID(0),2,pt, @Timer1()) Case 15 KillTimer_(WindowID(0),2) Timer2() SetTimer_(WindowID(0),2,pt, @Timer2()) Case 19 If EventType()=1 Select GetGadgetState(19) Case 0 pt=1000 Case 1 Case 2 Case 3 Case 4 Case 5 Case 6 Case 7 Case 8 Case 9 Case 10 Case 11 Case 12 Case 13 Case 14 Case 15 Case 16 Case 17 pt=10 EndSelect EndIf EndSelect EndIf ;}------------------------------------- Until Event = #PB_Event_CloseWindow
Поделиться29213.07.2011 21:14:06
Как-то так.
pt.w = 2 Structure DrawInfo row.a[8] EndStructure CreateImage(0,148,148); Procedure Draw_Image(*Infa.DrawInfo) If StartDrawing(ImageOutput(0)) Box(83,0,148,148,0) ; Очистка рисунка For col = 0 To 7 For row = 0 To 7 x = 20 + col * 15 y = 20 + row * 15 If *Infa\row[row] << col & %10000000 Color = RGB(255, 102, 00) Else Color = RGB(102, 102, 102) EndIf Circle(x, y, 5, Color) Next Next StopDrawing() EndIf SetGadgetState(0, ImageID(0)) EndProcedure Procedure Timer1() Shared pt_counter.w, pt Static Draw.DrawInfo, i If pt_counter<=0 pt_counter = pt For i=0 To 7 Draw\row[i] = Random(255) Next i Draw_Image(Draw) Else pt_counter - 1 EndIf EndProcedure Procedure Timer2() Shared pt_counter.w, pt Static Draw.DrawInfo, i If pt_counter<=0 pt_counter = pt For i=6 To 0 Step -1 Draw\row[i+1] = Draw\row[i] Next i Draw\row[0]=Random(255) Draw_Image(Draw) Else pt_counter - 1 EndIf EndProcedure OpenWindow(0, 0, 0, 535, 186, "МОДЖЕТ 8x8", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered) OptionGadget(14, 214, 23, 60, 20, "1") OptionGadget(15, 214, 43, 90, 20, "2") SetGadgetState(14, 1) TrackBarGadget(19, 300, 57, 165, 35, 2, 20, #PB_TrackBar_Ticks) TextGadget(23, 300, 90, 50 ,13,"Скорость") ImageGadget(0,20,20,148,148, 0) Repeat Event = WaitWindowEvent() ;{----------События компонентов---------- If Event=#PB_Event_Gadget Select EventGadget() Case 14 KillTimer_(WindowID(0),2) Timer1() SetTimer_(WindowID(0),2,10, @Timer1()) Case 15 KillTimer_(WindowID(0),2) Timer2() SetTimer_(WindowID(0),2,10, @Timer2()) Case 19 pt = GetGadgetState(19) EndSelect EndIf ;}------------------------------------- Until Event = #PB_Event_CloseWindow
Поделиться29313.07.2011 21:28:19
Спасибо.
Поделиться29413.07.2011 21:38:58
А что-бы регулировать кол-во светодиодов нужно менять значение Random? И если да, то как это привязать к двжку?
Пётр написал(а):В смысле, их там ведь 64 или нет?
max написал(а):То есть регулировать кол-во заженных пикселей в строке.
В оригенальной проге это движок "Massa".
Можно какую-нибудь идею?
Поделиться29513.07.2011 22:34:16
Можно какую-нибудь идею?
У Василия это как реализовано?
Нужно идею "слизать".
Поделиться29614.07.2011 14:33:11
Нужно идею "слизать".
'RND If RadioButton1.Checked = True Then Timer1.Interval = TrackBar2.Value * 10 Dim col, row For col = 0 To 7 For row = 0 To 7 st_led = (8 * col + row) ellipseRect = New Rectangle(x(st_led), y(st_led), 13, 13) random = Int(Rnd() * (20 - TrackBar1.Value)) If random = 0 Then If CheckBox2.Checked = False Then myPath1.AddEllipse(ellipseRect) buf_USB(st_led) = 0 Else myPath.AddEllipse(ellipseRect) buf_USB(st_led) = 1 End If Else If CheckBox2.Checked = False Then myPath.AddEllipse(ellipseRect) buf_USB(st_led) = 1 Else myPath1.AddEllipse(ellipseRect) buf_USB(st_led) = 0 End If End If Next Next End If
За скорость отвечает TrackBar1.
Поделиться29714.07.2011 16:34:27
Попробовал сделать:
pt.w = 2 tp.w Structure DrawInfo row.a[8] EndStructure CreateImage(0,148,148); Procedure Draw_Image(*Infa.DrawInfo) If StartDrawing(ImageOutput(0)) Box(83,0,148,148,0) ; Очистка рисунка For col = 0 To 7 For row = 0 To 7 x = 20 + col * 15 y = 20 + row * 15 If *Infa\row[row] << col & %10000000 Color = RGB(255, 102, 00) Else Color = RGB(102, 102, 102) EndIf Circle(x, y, 5, Color) Next Next StopDrawing() EndIf SetGadgetState(0, ImageID(0)) EndProcedure Procedure Timer1() Shared pt_counter.w, pt Static Draw.DrawInfo, i If pt_counter<=0 pt_counter = pt For i=0 To 7 Draw\row[i] = Random(5 * (20 - tp)) Next i Draw_Image(Draw) Else pt_counter - 1 EndIf EndProcedure Procedure Timer2() Shared pt_counter.w, pt Static Draw.DrawInfo, i If pt_counter<=0 pt_counter = pt For i=6 To 0 Step -1 Draw\row[i+1] = Draw\row[i] Next i Draw\row[0]=Random(5 * (20 - tp)) Draw_Image(Draw) Else pt_counter - 1 EndIf EndProcedure OpenWindow(0, 0, 0, 535, 186, "МОДЖЕТ 8x8", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered) OptionGadget(14, 214, 23, 60, 20, "1") OptionGadget(15, 214, 43, 60, 20, "2") SetGadgetState(14, 1) TrackBarGadget(19, 300, 57, 165, 35, 2, 100, #PB_TrackBar_Ticks) TextGadget(23, 300, 90, 50 ,13,"Скорость") TrackBarGadget(18, 300, 6, 165, 35, 0, 18, #PB_TrackBar_Ticks) TextGadget(22, 300, 39, 50 ,18,"Пиксели") ImageGadget(0,20,20,148,148, 0) Repeat Event = WaitWindowEvent() ;{----------События компонентов---------- If Event=#PB_Event_Gadget Select EventGadget() Case 14 KillTimer_(WindowID(0),2) Timer1() SetTimer_(WindowID(0),2,10, @Timer1()) Case 15 KillTimer_(WindowID(0),2) Timer2() SetTimer_(WindowID(0),2,10, @Timer2()) Case 18 tp = GetGadgetState(18) Case 19 pt = GetGadgetState(19) EndSelect EndIf ;}------------------------------------- Until Event = #PB_Event_CloseWindow
Но как всегда...
Добавил это
Shared pt_counter.w, pt, tp
заработало, но как-то странно.
Отредактировано max (14.07.2011 16:51:03)
Поделиться29814.07.2011 20:19:21
Как вариант:
pt.w = 2 tp.w Structure DrawInfo row.a[8] EndStructure CreateImage(0,148,148); Procedure Draw_Image(*Infa.DrawInfo) If StartDrawing(ImageOutput(0)) Box(83,0,148,148,0) ; Очистка рисунка For col = 0 To 7 For row = 0 To 7 x = 20 + col * 15 y = 20 + row * 15 If *Infa\row[row] << col & %10000000 Color = RGB(255, 102, 00) Else Color = RGB(102, 102, 102) EndIf Circle(x, y, 5, Color) Next Next StopDrawing() EndIf SetGadgetState(0, ImageID(0)) EndProcedure Procedure Timer1() Shared pt_counter.w, pt, tp Static Draw.DrawInfo, i If pt_counter<=0 pt_counter = pt For i=0 To 7 For x=1 To 8 If Random(20) - (20-tp) >= 0 Draw\row[i] | 1 Else Draw\row[i] & %11111110 EndIf If x<8 : Draw\row[i]<<1 : EndIf Next x Next i Draw_Image(Draw) Else pt_counter - 1 EndIf EndProcedure Procedure Timer2() Shared pt_counter.w, pt, tp Static Draw.DrawInfo, i If pt_counter<=0 pt_counter = pt For i=6 To 0 Step -1 Draw\row[i+1] = Draw\row[i] Next i For x=1 To 8 If Random(20) - (20-tp) >= 0 Draw\row[0] | 1 Else Draw\row[0] & %11111110 EndIf If x<8 : Draw\row[0]<<1 : EndIf Next x Draw_Image(Draw) Else pt_counter - 1 EndIf EndProcedure OpenWindow(0, 0, 0, 535, 186, "МОДЖЕТ 8x8", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered) OptionGadget(14, 214, 23, 60, 20, "1") OptionGadget(15, 214, 43, 60, 20, "2") SetGadgetState(14, 1) TrackBarGadget(19, 300, 57, 165, 35, 2, 100, #PB_TrackBar_Ticks) TextGadget(23, 300, 90, 50 ,13,"Скорость") TrackBarGadget(18, 300, 6, 165, 35, 0, 18, #PB_TrackBar_Ticks) TextGadget(22, 300, 39, 50 ,18,"Пиксели") ImageGadget(0,20,20,148,148, 0) Repeat Event = WaitWindowEvent() ;{----------События компонентов---------- If Event=#PB_Event_Gadget Select EventGadget() Case 14 KillTimer_(WindowID(0),2) Timer1() SetTimer_(WindowID(0),2,10, @Timer1()) Case 15 KillTimer_(WindowID(0),2) Timer2() SetTimer_(WindowID(0),2,10, @Timer2()) Case 18 tp = GetGadgetState(18) Case 19 pt = GetGadgetState(19) EndSelect EndIf ;}------------------------------------- Until Event = #PB_Event_CloseWindow
Поделиться29914.07.2011 20:35:08
Спасибо. Самое то.
Поделиться30014.07.2011 21:44:04
А как организовать инверсию? У Василия что-то не нашел. В коде поста 296 за инверсию отвечает CheckBox2.