Какая-то лабуда рисуется.
Светодиодная матрица - МОДЖЕТ (антигаджет) на Пурике
Сообщений 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.