Working on the Doodle Drawing Recorder/Player. Testers wanted - Dav - 08-30-2023
I'm re-doing the Doodle draw program started a few years ago, which records what you draw on the screen and plays it back to you, showing a hand doing the drawing. This one is using a new drawing method. Would appreciate some testers. See it it works smoothly for you. I'm having a little display glitches now and then, can't seem to narrow down why. Especially after changing the color (Pressing C), the mouse seems to hang in Linux sometimes. And the hand jumps around sometimes oddly. Probably I'm coding mouse usage wrong.
Left Click to draw, Right Click to clear screen. D = Draws, F = FILL, C = Change color, SPACE restarts. Use +/- to change brush size. Press ESC to stop drawing and play back what you drew.
Eventually this will save/load the drawing files, but for now it just works without saving any files. Just draw and press ESC, it will playback what you just drew. Trying to get the basic bugs out of the way first.
The .BAS source is kind of large, so here it is for download.
(EDIT: Download removed. Get the lastest version posted HERE)
- Dav
RE: Working on the Doodle Drawing Recorder/Player. Testers wanted - mnrvovrfc - 08-30-2023
As usual, amazing job, and I like the drawing hand and forearm!
The area around line 63 might benefit from the following:
Code: (Select All) $IF WIN THEN
'This makes no sense, but it fixed the glitch in windows.
DO UNTIL _MOUSEX = mx AND _MOUSEY = my
mi = _MOUSEINPUT
_MOUSEMOVE mx, my
LOOP
$END IF
This fixes the mouse problem on Linux after the color dialog is used.
RE: Working on the Doodle Drawing Recorder/Player. Testers wanted - Dav - 08-30-2023
I think the jumping hand glitch is gone. Had to add a small _DELAY after choosing a new color for some reason. And I removed my horrible Color Picker and used QB64's beautiful _COLORCHOOSERDIALOG instead (forgot it was there!).
After removing my colorpicker function the source is cut in half, so here it is. This seems to replay drawings better now.
- Dav
Code: (Select All) '==========
'DOODLE.BAS v1.2
'==========
'Little screen drawing/recording program.
'Draw something on the screen using the mouse,
'Your drawing will be recorded and played back.
'A Hand will draw it back on the screen.
'Coded by Dav, AUGUST/2023
'==========
'HOW TO USE:
'==========
'Left Click to draw using the mouse
'Right click mouse to clear the screen.
'D = DRAW mode (default - drawing on screen)
'F = FILL mode (like paint - fills area with color)
'C = Change color (selects a new one)
'+/- to Change brush size.
'SPACE erases recording and starts over.
'Pressing ESC will stop the recording and start playback.
'Pressing ESC during playback will stop the playback.
'==========================================================
'=== Setup nice screen size based on users desktop size
Screen _NewImage(Int(_DesktopWidth * .75), Int(_DesktopHeight * .75), 32)
_Delay .25
hand& = BASIMAGE1&
'========
StartOver:
'========
'=== settings
BrushSize% = 3 'size of brush
BrushColor& = _RGB(0, 0, 0) 'color of brush
CanvasColor& = _RGB(255, 255, 255)
DoodleLimit = 500000 'how large doodle string can be (this is about 3 minutes)
Doodle$ = ""
Mode = 0 '0=draw with color, 1=fill with color (paint)
Hand = 1 'Flag for showing hand image or not, default is on
'=== main drawing loop begins
Cls , CanvasColor&
Do
While _MouseInput: Wend
mx = _MouseX: my = _MouseY
If mx > 0 And mx < _Width And my > 0 And my < _Height Then
If _MouseButton(1) Then
If Mode = 0 Then
If stilldown = 1 Then
stepx = lastmx - mx
stepy = lastmy - my
length = Int((stepx ^ 2 + stepy ^ 2) ^ .5)
dx = stepx / length
dy = stepy / length
For i = 0 To length
For j = 1 To BrushSize%
Circle (mx + dx * i, my + dy * i), j, BrushColor&
Next
Next
Else
For j = 1 To BrushSize% Step .36
Circle (mx, my), j, BrushColor&
Next
End If
Else
SPAINT mx, my, BrushColor&
End If
lastmx = mx: lastmy = my
stilldown = 1
Btn$ = "D" 'button pressed down marker
Else
stilldown = 0
Btn$ = "U" 'button up marker, not pressed
End If
'make x position data
x$ = _Trim$(Str$(mx)) 'x position
If Len(x$) = 3 Then x$ = "0" + x$
If Len(x$) = 2 Then x$ = "00" + x$
If Len(x$) = 1 Then x$ = "000" + x$
'make y position data
y$ = _Trim$(Str$(my)) 'y position
If Len(y$) = 3 Then y$ = "0" + y$
If Len(y$) = 2 Then y$ = "00" + y$
If Len(y$) = 1 Then y$ = "000" + y$
'build onto string data only if StartedDrawing flag on
DoodleTemp$ = DoodleTemp$ + (Btn$ + x$ + y$)
End If
'if right button clicked
If _MouseButton(2) Then
Cls , CanvasColor&
DoodleTemp$ = DoodleTemp$ + "C00000000" 'clear screen if right click
End If
'add to image data only if changed from previous x/y data
If DoodleTemp$ <> OldDoodleTemp$ Then
Doodle$ = Doodle$ + DoodleTemp$
End If
'save old data
OldDoodleTemp$ = DoodleTemp$
'reset info
DoodleTemp$ = ""
'=====================================================
'Handle keyboard input
keys$ = UCase$(InKey$)
If keys$ = Chr$(27) Then Exit Do
If keys$ = "C" Then
_MouseMove mx, my
pick& = _ColorChooserDialog("Select a color", _RGB32(0, 255, 255))
_MouseMove mx, my
_Delay .5
'This makes no sense, but it fixed the glitch in windows.
$If WIN Then
Do Until _MouseX = mx And _MouseY = my
mi = _MouseInput
_MouseMove mx, my
Loop
$End If
If pick& <> 0 Then
BrushColor& = pick&
Doodle$ = Doodle$ + "K" + MKL$(BrushColor&) + "0000"
End If
End If
If keys$ = "F" Then
Mode = 1: Doodle$ = Doodle$ + "M10000000"
End If
If keys$ = "D" Then
Mode = 0: Doodle$ = Doodle$ + "M00000000"
End If
If keys$ = "+" Then
If BrushSize% < 100 Then
BrushSize% = BrushSize% + 1
Doodle$ = Doodle$ + "B" + MKL$(BrushSize%) + "0000"
End If
End If
If keys$ = "-" Then
If BrushSize% > 1 Then
BrushSize% = BrushSize% - 1
Doodle$ = Doodle$ + "B" + MKL$(BrushSize%) + "0000"
End If
End If
If keys$ = " " Then GoTo StartOver
_KeyClear
'==========================================================
_Limit 30
'==== below is info only....you can comment out if want
Color _RGB(255, 255, 255), _RGB(196, 0, 0)
Locate 1, 1: Print "ESC STOPS RECORDING ";
Color _RGB(255, 255, 255), _RGB(0, 0, 0)
Print " (C)olor, (+/-) BrushSize:"; RTrim$(Str$(BrushSize%)); ", ";
If Mode = 0 Then
Color _RGB(255, 255, 0), _RGB(0, 0, 0): Print "(D)raw ";
Color _RGB(255, 255, 255), _RGB(0, 0, 0): Print "(F)ill ";
Else
Color _RGB(255, 255, 255), _RGB(0, 0, 0): Print "(D)raw ";
Color _RGB(255, 255, 0), _RGB(0, 0, 0): Print "(F)ill ";
End If
'======================================================
'See if set limit is reached. If so, stop recording
If Len(Doodle$) > DoodleLimit Then Exit Do
Loop
'=== Make simple 24-byte doodle Header with drawing size info
Head$ = "DDV1" 'Dav's Doodle v1 marker
Head$ = Head$ + MKL$(_Width)
Head$ = Head$ + MKL$(_Height)
Head$ = Head$ + Space$(12) 'extra space for future info.
'Add it to beginning of Doodle$ string
Doodle$ = Head$ + Doodle$
'==================================================
'============ Playback what we recorded...
'==================================================
'Load Doodle info from header
If Mid$(Doodle$, 1, 4) <> "DDV1" Then Cls: Print "Invalid Header.": End
sw = CVL(Mid$(Doodle$, 1 + 4, 4))
sh = CVL(Mid$(Doodle$, 1 + 8, 4))
'Open screen size
Screen _NewImage(sw, sh, 32)
'=== set to defaults
Mode = 0
stilldown = 0
CanvasColor& = _RGB(255, 255, 255)
BrushColor& = _RGB(0, 0, 0)
BrushSize% = 3
Cls , CanvasColor&
_Display
_Delay 1
'Play data...
'Skip over header, play data
For d = 25 To Len(Doodle$) Step 9
Btn$ = Mid$(Doodle$, d, 1) 'get marker (B,U or C)
mx = Val(Mid$(Doodle$, d + 1, 4)) 'get x info
my = Val(Mid$(Doodle$, d + 5, 4)) 'get y info
If Btn$ = "D" Then
If Mode = 0 Then
If stilldown = 1 Then
stepx = lastmx - mx
stepy = lastmy - my
length = Int((stepx ^ 2 + stepy ^ 2) ^ .5)
dx = stepx / length
dy = stepy / length
For i = 0 To length
For j = 1 To BrushSize%
Circle (mx + dx * i, my + dy * i), j, BrushColor&
Next
Next
Else
For j = 1 To BrushSize% Step .36
Circle (mx, my), j, BrushColor&
Next
End If
Else
SPAINT mx, my, BrushColor&
End If
lastmx = mx: lastmy = my
stilldown = 1
handx = mx: handy = my
End If
If Btn$ = "U" Then
stilldown = 0
handx = mx: handy = my
End If
If Btn$ = "C" Then
Cls , CanvasColor&: stilldown = 0
'_Display
End If
If Btn$ = "K" Then
BrushColor& = CVL(Mid$(Doodle$, d + 1, 4)): stilldown = 0
End If
If Btn$ = "M" Then
If Mid$(Doodle$, d + 1, 1) = "1" Then Mode = 1
If Mid$(Doodle$, d + 1, 1) = "0" Then Mode = 0
End If
If Btn$ = "B" Then
BrushSize% = CVL(Mid$(Doodle$, d + 1, 4))
End If
If Hand = 1 Then
'save current screen
page& = _CopyImage(_Display)
'shaw drawing hand over it
_PutImage (handx - 44, handy - 24), hand&
_Display
_PutImage (0, 0), page&
_FreeImage page&
Else
_Display
End If
If InKey$ = Chr$(27) Then Exit For
_Limit 45 'play a little faster than recorded, we usually draw slow.
Next
If Hand = 1 Then
_Delay .5
'done....move hand off screen here...
For xx = handx To _Width Step 5
handy = handy + 5
'save current screen
page& = _CopyImage(_Display)
'shaw drawing hand over it
_PutImage (xx - 44, handy - 24), hand&
_Display
_PutImage (0, 0), page&
_FreeImage page&
_Limit 100
Next
End If
_FreeImage hand& 'release me...
Sleep
'just for info
Locate 1, 1
Print "Length of recording ->:"; Len(Doodle$)
Print "Compressed size is -->:"; Len(_Deflate$(Doodle$))
Print "File saving not added yet."
End
Sub SPAINT (x As Integer, y As Integer, clr~&) 'Color everything in the X, Y position regardless of the border color.
'SUB by Petr
Dim m As _MEM, m2 As _MEM
m = _MemImage(_Dest)
W = _Width(_Dest)
H = _Height(_Dest)
P = _PixelSize(_Dest)
Select Case P
Case 4 ' image is 32 bit image
Virtual = _NewImage(W, H, 32)
m2 = _MemImage(Virtual)
Back~& = Point(x, y)
Back2~& = _RGB32(1, 1, 1)
Empty~& = _RGBA32(0, 0, 0, 0)
Do Until a& = m.SIZE - 4
a& = a& + 4
If _MemGet(m, m.OFFSET + a&, _Unsigned Long) = Back~& Then _MemPut m2, m2.OFFSET + a&, Back~& Else _MemPut m2, m2.OFFSET + a&, Back2~&
Loop
d = _Dest
_Dest Virtual
Paint (x, y), clr~&, Back2~&
_Dest d
a& = 0
Do Until a& = m.SIZE - 4
a& = a& + 4
If _MemGet(m2, m2.OFFSET + a&, _Unsigned Long) <> clr~& Then _MemPut m2, m2.OFFSET + a&, Empty~&
Loop
_ClearColor Back2~&, Virtual
_PutImage (0, 0), Virtual
_MemFree m
_MemFree m2
_FreeImage Virtual
Case 1 ' image is 8 bit image (256 colors)
Virtual = _NewImage(W, H, 32)
m2 = _MemImage(Virtual)
Back~& = Point(x, y)
Back2~& = _RGB(1, 1, 1)
Empty~& = _RGBA(0, 0, 0, 0)
Do Until a& = m.SIZE - 1
a& = a& + 1
If _MemGet(m, m.OFFSET + a&, _Unsigned _Byte) = Back~& Then _MemPut m2, m2.OFFSET + a&, Back~& Else _MemPut m2, m2.OFFSET + a&, Back2~&
Loop
d = _Dest
_Dest Virtual
Paint (x, y), clr~&, Back2~&
_Dest d
a& = 0
Do Until a& = m.SIZE - 1
a& = a& + 1
If _MemGet(m2, m2.OFFSET + a&, _Unsigned _Byte) <> clr~& Then _MemPut m2, m2.OFFSET + a&, Empty~&
Loop
_ClearColor Back2~&, Virtual
_PutImage (0, 0), Virtual
_MemFree m
_MemFree m2
_FreeImage Virtual
End Select
End Sub
Function BASIMAGE1&
v& = _NewImage(357, 600, 32)
Dim m As _MEM: m = _MemImage(v&)
A$ = ""
A$ = A$ + "haIkM7STLSLV66N?2j2X8FGM0TQLE4[W\6G5CXEfdLLD4DVdL_1j<\6[QdAH"
A$ = A$ + "^FLWD<b1X11Z2X:0lU9`SaC`VLj^IgEWo_Cb\#EeGnjGn?n2000000000000"
A$ = A$ + "00000000000000000000000000004bOncoS_n7n[om_n3oh?m_EnmYoJ2PkX"
A$ = A$ + "BomgnkoKO7]I0>OUfkdNLI?cSY=3`iHJC^dPoSo`ok_N>6egn?mGnGJcGLOj"
A$ = A$ + "[o\On2Q=n\;Zk;^fS7[dV;dVkOOjcolGWZlcdb_FoiLi]Coe9L7EV5;=gYk?"
A$ = A$ + "^^ghRbOnoioeoggM67JcmQY]gJgM=ZOLYoN0^CZGg5CgSL]7GncWkn1\XlO?"
A$ = A$ + "mGo<_a]hJOM;mhY]idOo0g9UnkdNLY5?gnSWZlnJV]M<^3_Wl_;2>?eo=]Sg"
A$ = A$ + "OlJjaSg_\^LFCgGlSfc[m;3]_jNU[cOCk^U6mSjdf_L67enReUQ\6Oom=GkM"
A$ = A$ + "LCNYf\IfScd[ERcZ1[;3iDVeVknd[fS7gRWk?CGNooia[dO?SV]O637_bLfB"
A$ = A$ + "W=ah6lSjcEVIOmO6L4=ejmCP^<dGFZ;?GgMlII<f_igm?=c^aKc?bcTh8jaE"
A$ = A$ + "Y_]3^jZG_bKY;oXFmM_;?gSK^Gma`A;j^ocGh<\dcGLjbO_g]W]gma4kEn:o"
A$ = A$ + "cGX5Dgof[fT;WMaEjlUC_GdFGYgoU?oU^mW_#?Xn_]nMg[ld^L[dVOefCjnG"
A$ = A$ + ";[EnI;LEEVa:MXm\;WHfmMfoghW;VdTeUQhnUo=Y;eUgBKNliILFkGnE^F6d"
A$ = A$ + "PO?okca8mJFhRkCobDfF_6iNVbefaAfUgB?N^g_YkAVecNUQcaNM>6e?^SHo"
A$ = A$ + "b_ceikLmG=iG[9[;3WSBSJjSWjGM_b5kecMA]`c34<`[9=`iI?>OiakI^^gZ"
A$ = A$ + "Gi[UFiiU7V_;Kob`ihAGWL_bS]TO];oi_\hSk]UT^m`bL>6`iiM_nUWnl9gJ"
A$ = A$ + "W_eRk;N<U0WWBKLJOmEJcYk6LlMIkG6>7em\n>WaLjV1jb`EbNllFDjV1WCG"
A$ = A$ + ">mJEh^HY7;fja<^9[;3WW]nJEbMX;knSLnfLjeZ`MaS>7SUJcYK4G5md]U>K"
A$ = A$ + "Ihll\kg_YmidmQdFc]1cMKedo\NkfBMIhllXW[?Wnh;9MKX5lXcdiAoI;mO_"
A$ = A$ + "GX;3WWe\OiN[Q\W=hYonbcGNceFW[E?mm]GogMh\UQcEY;_d[kZkeSGTN[3]"
A$ = A$ + "f^kB?6KVka2I?ON#f[<L^NdnUGkIY^DGKYOoIfGWkgoX_V7_GgijYegNlNQW"
A$ = A$ + "KOaGUVLQW7iPcccJb[]Q<gmWec>ceef;GCWmIoo8Vk[SU>_QWMoO^dc[CGik"
A$ = A$ + "gDkG6>NeNl[Nn5[mOCoF]V?oCo_?ng?m][onYMdUJ\;mkg3YK[jb#kYl_5]n"
A$ = A$ + "jdaJfKgLMhjn:W[M=^a?M?T7E7OjNFGcI9Lfjem8?^9[;3k[b<e?lSodo^Kn"
A$ = A$ + "Xm7o\^lN]GbmZ1W^gN7JbojNUmlk9\K6oh9NlNMOeVlNeZNDO>M;ECNVm;oE"
A$ = A$ + "kG6f3CKb[mnfJjidNTM[d]C=iE^Oi6Hm<dkVnl^ch^lJk:Gi^YV\^<LFZ?VZ"
A$ = A$ + "7gR[mheNnbja_O?n:eVeUQGgBkANZdm[[Xa]h[FCFG6N=S_NTO4k5No]gMhF"
A$ = A$ + "jinIMIheDOn]hIMI=im_7_dSeU[bIJX;3KgJfWLjneEdSN<:V^UZ;3i<maBm"
A$ = A$ + "dW7MdT?^Vlhfldm:W^Un8Km[?MIHmVKOb>WRc[;o8YK_f_<Tad[5>=iSehKS"
A$ = A$ + "W^oh[H?NJK>mjMXe]VW;hHol:??NT^U^7:oon;dUQ7[n_[L_J>CW5Cg0KE[i"
A$ = A$ + "i_^[DCfnUQeK]_fEoXfkShl#V_7G_]YNKok^OiFjJDnIlJE2lH?keR_Y]hGI"
A$ = A$ + "n_naW^9f2^[WQadoO8fc<<_bceR?k<<f[mSU^7f:ZGcQSOkY_FnMEkajb`:l"
A$ = A$ + "i_\HcL_W5MN6coj_bMJObCKcaGo3=X?m;C6UcjK^NlALNUYkRYKbSoo==nJT"
A$ = A$ + "[nogj^dUM=I0?F];?M_<?jg_G]kd]b4MiaFjl;^;MI]IHNSK[WmmYOjFiIeS"
A$ = A$ + "7ohJOj[c\gUFlDjb`2nlGRNmEU^INV]iYMhUjbgUf\cb0nNem[TLf<M_l<=^"
A$ = A$ + "7GomceVCg;?b>LmajOU^<<X5JbgeflBkC>m?7>cnLmGeUQ_YUJbSMG^>j^cW"
A$ = A$ + "Madn\cHVk^F\7GjDCkbCogkO5<ml;^K]hjIH<fhfLjI38QF[7?^;_dn8CgB?"
A$ = A$ + "Zm9?mJS;m?3>kfLm]eUi^JYm8g2MjWm_[oZdV[MhbgcCoekZYMI]I^;Jac]H"
A$ = A$ + "9Ge^lhVlLmi[^YGo5cmW[;cMA;_?i]dUke6mL?fANUKGNf?_FZke3dViF9lS"
A$ = A$ + "E4=i_oe\fYOo^Gm\Nfhcb`iI`EE?M^5KY=W^cnZ]ia?V[gS6lEY7[;cEGM]l"
A$ = A$ + "BWIA?dY_BkE^ZNMGDonKlgW_BCnZJje>Wf<mVa=hWeKGkkG;HJgZgKcCKbgU"
A$ = A$ + "kS_g]9Goo3Y;C[kEj[m#;N^flEZ;?mJE>m]_]XijbOHOcOEOVfAI=Iii4i]f"
A$ = A$ + "GkaNlE];GoeYO?VnfiF`SjaSkbUkojdcRLO]7Wi#mS]7KcG][7SYOmZ7_]V\"
A$ = A$ + "cIVTZ_VWFL7^?N^;Mie\7jkli>[=C;CCnndU[=IW]ajkbN^cPcVNlfJcYKZ7"
A$ = A$ + "ASn>MO2^UF\m;C2mhI0W\9O5kbefLjKkeTi^[G^NReU?fFlMl\UOefLjIF^f"
A$ = A$ + "dSkg^LmikRg]1OgJaSmbkIfe`<74WUlSejMiJKnAOMDon8m]U]TY?gNHobd:"
A$ = A$ + "\?iW[UkbSOn7JYWOhHNCg;bFkbU7KEYWOiji8JbG]mM_VVLb^lLW7\^l[_fe"
A$ = A$ + "nU9YefTWnh<XHYfkE[9?nfPF\;_W?g3]d7oM]aoXNLmo^^<k]iJXceP[k9[N"
A$ = A$ + "6Ug]VldK?JQ^ldOflZWOadON_dOfM`hN[[C>BXL^HceMND;8mLcA[LkbSjG]"
A$ = A$ + "JKNZ7mmhdnKedGo[_CmhYL66TBIMedic7e0^bk5Nj]=?ZWeJMiJ?M=_N#=G?"
A$ = A$ + "nEJkGI[Y7GNo\GIfKUm:?MnnAcoGi[GSi^miEkbWICNjII<gG[COkUnn8m?3"
A$ = A$ + "f;kajdi>3iYoIeo^B?7ceBY;_V>Bji\c`Lgn<gkG[^OIkgmHY9cIYNM^Z;O="
A$ = A$ + "f_ldc8>m]YGE>GI>:Um:G_fZ^cmhRU^=J^ggF^;?n]COKjEWV<7Qj[oCJb;O"
A$ = A$ + "KdL_o]hiH<GS>m][GIJbLTZGSLJbcK^K;JiVld_NWkni;m]im>=I>JU^lLkI"
A$ = A$ + ">mJocbc^mI^?VF_;?N?ccM]a=nkQdgngSdUi<DKcYG_OfFc]=cma]fcaXEJd"
A$ = A$ + "?ZG?m]CocTFWV<W][leVlD[mfTinHkeVlJfC=;CCV4^;Mi]LKbLOlmLGfe#g"
A$ = A$ + "[ACV4^;=iR]LkbLOlmfiH\dI<o<SOL^=gOnMQV<9LWJb5KifVinhKm^lALM<"
A$ = A$ + "OgJaEJbTbMZ;_eKKVkcA;gUGK7N^OV?mi1Rdo\:==IBi>eT;fj]?cmiX5jbS"
A$ = A$ + "gClhNlFgO\nkgcc?LTDMmGjiPcb[LKdLONJ]^\k3_mSN<YMg^VUOUKSVkccF"
A$ = A$ + "kb7AKN=?7;cfX9CJgYm9GlZg>=gW[FX;?N?ce_VBOKL_biF#;h^eT;NeK[Vn"
A$ = A$ + "iYEJb?ZE[A_NUoM7YW7QRdc2W]mlfZF_;?^??m[kiNkk\bihUNF4:^KkEnM_"
A$ = A$ + "mZN>1S]gMienJC`kLO3>ModS=nk[dolZGFG0k5=i]kMKb?[=?ne:e4kYn>eR"
A$ = A$ + "eTYeLgJb7EGnEKc[i<7>kcoh^eTM^5dJ^KMimhf\cX9?NO[eccHJWfnTKSe3"
A$ = A$ + "`Nj^eTka^LmeIaWmgGim_lWKObJbdgB?Gd[cQ;mio8Jce^lLgOL?bdkg^Ymk"
A$ = A$ + "[RGikWdcM`B:kEn>mLP`NMkfBOngkkg_WM6cY_m\5X9cERc_helX?o7AGNJC"
A$ = A$ + ">m]Q]4=I^JB?CMf>SK_Ne^lSJcceSeWc\60>BYW?jYIb]ngcNgUmjjd[k7na"
A$ = A$ + "Oj]oi?L6^b??amXneF_MjEnkmMf_lL]ijO^fl[;ml6l<gacDnEV=OeoN>Z^l"
A$ = A$ + "h?oY_]\WTNN3NVkJCN;cW_kO?kmi;_7Gk5geFNji=H=dUGfNmgcAeUgjG3Y_"
A$ = A$ + "mn\=nLTGc?_QF`M^9?gLjAmgcNO>6KI?cSOO6oaWnfncBY=WN>3fRkNGn\LT"
A$ = A$ + "Mielgkdgn^#CVNSVlihMKb?Z;_e_>BOKaI`e07m:=iU]WoKlW^Gem\;OW>;R"
A$ = A$ + "GAjI<H[^:MiFnkSbc_8eGK>?Z^lMI?`KAjI;hEdb]\]ZUoNAGnLi\TYGebM\"
A$ = A$ + "[TjI<DO>ikX>SiJKn^OV6JbdcdU?GeW_D?ZVlMOOcUNLiaRNji:hEY9O^:mh"
A$ = A$ + "mJobjbcc[mNdcndG_G??gWfhK[?bc`h>gUC?C1_]?oUhcAgAkaIH\f^lMh<V"
A$ = A$ + "[GKbaWWPM#jiYkXjeSAi]?SfLj_O?3YWSPmBjIYkXYWIdAgUComkI8mL4\G^"
A$ = A$ + "b?Ggg;fSkk_eN>6U[=QjcEnSoHkmcO>mL4\WB??MWE_N<fS7G9?[=?moNigG"
A$ = A$ + "kccmJJBmcIjKSNVdc?`NcNUcYfS?S7G9SEK`SOkY=hNX7GTNn1fK^FUcJli;"
A$ = A$ + "GgglAgTODk]gjbYWOPSP^LKXnlSAi]?Rm;Go_EfKldko_YmgNin7<m\3LDB?"
A$ = A$ + "Ka7ON;jXf_lLWCaHfW<d6B?KaPchiC^NXgn<YWIPSTk[_faNN]H<GOFC6j3Y"
A$ = A$ + "WahSVN>2kEGFC6j3f[LkIle;gNgTki^\W_Ti>#C^m\Wg_OC=gSETNAjI5h\T"
A$ = A$ + "NFSi]Gg_O;9mgOKEji4h\hJENKMbcn_cJolM?3SaoZV<d^Ln5]]mheNeYWY\"
A$ = A$ + "V<dfB?_ab6gTg[[QiN[=WNn0>Kf[LkkX>OidOO]6YW?P4B?gac=ni7SRkBK>"
A$ = A$ + "m\1TPk[_n`Nnj_jdcaXL]bUnk_YB?G0YX9gWfcm:_d[SD9O>S;mL1TddGkhX"
A$ = A$ + "]Md?g5Enk8m[cOYW9PT\GinbAnl_Lj_g:B??0Yij_X_DOM:Ynkg[^Lj__ZB?"
A$ = A$ + "?0]PdcQljn=o^oiUZ;WNF0J1f[LoJ_N]G]5JbYW3PFQcD^?EO>T[nkkmm;WN"
A$ = A$ + ">0J5SO]^Wggh>IZonka^Lji0XUX9OMd[kG>m<0dBLVbG;;eKOdo]dWaLjI0X"
A$ = A$ + "UX9OmlXNkcn_Of=id[oQFSVleckN66WiiHTNm?dRLmGLMebG[LYGg3]:kEnJ"
A$ = A$ + "J==g]ln]gB_^7JIYk7LLfScbh8jbYGc3]<WOaedNeSgkcb8mjMXeY9O?d:kI"
A$ = A$ + ">mjMX7X;Om]WkInMnj8mJMX7X9O?DOnb8IG>mJMX7X9O?\g_^Ho:O=TN]>d;"
A$ = A$ + "dU_n:kCnI_VUDOO?R^Ljeh#?ACnni\g_Ljeh#?ACnNI=WSAmmM_jbYGS3m6M"
A$ = A$ + "ikSeNfbegomH?cYGO3m6?F[_?VnlWmJJ\_KG>mjKX7U^E`ikIkI^nnDneefU"
A$ = A$ + "Wnhn;mjJXGI_bg?e[7SUjbUgWaW[e[\Oid[[QNUVlmDY;oXGC\Wnn_e^Ljee"
A$ = A$ + "#?;MOPlfkcG>mJJXWie?EZfSm<GNOB_V6jIJbD]DSM;kI^nnTNM=dcBg2X]\"
A$ = A$ + "7WSaOh_ngeUQGDj60]QeLMbEOo:ojcJbUgWd[]QNDjF0]QJC^lfkAGfi;3_^"
A$ = A$ + "dm0bKlm]`SJ^SOOLma17Sdm0J7SOLUDnmf_<LnBg1X]DOLU\V77f[Y;GolVN"
A$ = A$ + "M>d;lHjSYFcc;n5[];Kob`fT^1#KI^[MmgMobjb`jI_b\6_knUMMb1[GjiMj"
A$ = A$ + "7f_<L>B?[CK[llUlc^F<NfSoTjWSbkOjek#[cIH`SDjY;eUW^OieN=<WN=?d"
A$ = A$ + "jB?gCkCG6>?YWgY]E_V<Z_^?m\kg?MIhmhl;H;Nf[K9jb`k;mL>mQJ_]dUGc"
A$ = A$ + "IIX;3_6kEVeXN]_E^^SOD[eiH0__dckd7ZWMAiGo=o^oiZjbUgo7eU;O^B_n"
A$ = A$ + "7J=f[<[eJg3lFf_LAjI0XUX9cJEO^T[Nm;_f7K9jb`fX;cSDGWl3oh?mQNlc"
A$ = A$ + "N\UhlUQGWGO[I9SGW\UVld[7SbKKob`jH_b\TY[EV[;_fm;GnlY;3[CjIOJC"
A$ = A$ + "c]FiXjbe?7YW5PFPm:cLFJmbkdUMon1[S^<Sm\e;;eUGZ=kL<P];M7PfaJF_"
A$ = A$ + "\U^Lmc[^<\Nf[<5KI=cFg_Lic_^<\N^fhH[[I>bkg_Rdc4#Bf[<_bjVShlU7"
A$ = A$ + "oi8mL1TDjV0mGC^hAMiiJcSkb;M=IDohdUi^;MGPn[9Gl\^ldnLi__edU]OI"
A$ = A$ + "#Gn^jMGg\UVlJjbCoHC?G09U^?#oeT;fJGNlIIDnJH^F\V<l=YK4dO=iReN>"
A$ = A$ + "6EU[iWYggOJb`g;MSPn\9G\UVlLGobJb`lBg9X?Kb5UG?ofjNVGZ7[93OCj>"
A$ = A$ + "1mI?^J[=ImHhiBg;XOKb5ja`nbSa_[_SN=TN<\_dU_f>Se#KmlUC_V7JMYk6"
A$ = A$ + "dg=iRefUC_F7j5YK7dg=iRWeUC_67j=Yk7dg=iRUjbYGK3mZd=4jkV<`n;M7"
A$ = A$ + "1=IP?:M;1=IP?:M?1=IP1o`_<AW^YPV<`POjoFG^WUNm3`n;MG1=IP?:MK1="
A$ = A$ + "IP_Gj63Jb0ODj>3Jb03BgI#G6hSBgI#C6hSBgJ#C6H#jF3Jb0ODjN3Jb03Bg"
A$ = A$ + "K#C6hSBgL#C6hSBgM#C6H#j^3Jb03BgMBYlJ=Gj_6dT1VCjf3Jb0ODjn3Jb0"
A$ = A$ + "3BgO#C6H#jn3Jb0ODj64Jb03lJhGK9mj1P\nSOmo9N72=IP1Yk#X93<8M72="
A$ = A$ + "IP1Yk#X93lAYKAX93<8M;2=IP1YKAX93lAYkAX93<8M?2MIP1ce7jQWcQ_JB"
A$ = A$ + "_>0X=T^5QV<`7U^7QV<`P]d>L^6Jb07;??aUGje00]3??aUGje00]Ud=YgeE"
A$ = A$ + "h<EB_60XMd[WOaEX5[93<EjN4Jb03BgS#G6H#jF4Jb03BgR#G6H`Oj_l_RgR"
A$ = A$ + "#C6hKnQOlWRgR#G6hK\?ifCje40iX9gNB_V08WolWo7aK#X93<8M32=IP1YK"
A$ = A$ + "#X93<8M32MIP1^OnJ?YGC0TCjn3jb03\?ifDje50IlY?ocak?X93l=_ceXlE"
A$ = A$ + "jiFnFCje50iT^oPV<`Pdm7dT16T^oP^<`0Gk5]Yd[;0b`c5A]Yd[;0b8Mk1="
A$ = A$ + "IP1YK?X93lAYk?X93<8Mo1=IP1Yk?X93<8Mo1=IP1Yk?X93<8Mo1MIP1YK?X"
A$ = A$ + "93<`S_jfDje50Il3oh?5_oPV<`gX9gVB_^083WMAK:mj2P<BgN#C6H#jf3Jb"
A$ = A$ + "03Lf5]Yd[;0bhCOnWSgO#C6hKdTKCYGG0TQGoWJGYGK04`WobZK4>kI=IPSe"
A$ = A$ + "WnjjKbX93LlBgN#C6H#jf3Jb03BgN#C6H#jf3Jb03BgN#C6H`Jj3^>hdT1>7"
A$ = A$ + "YK?X93<8Mk1=IP1YK?X93<8Mk1MIP1Yk>X93<8Mg1=IP1Yk>X93<8Mg1=IP1"
A$ = A$ + "NN]_MUN]1`iCC^MUN]1`iCC^MUN]1`iCC^MUN]1`i;Mg1=IP1Yk>X93<`IGd"
A$ = A$ + "^B_f0hlY9gfB_n0hTmi_4_kPV<`glY_Z9gjB_61hLU^iPV<`Pd=7dT16T^iP"
A$ = A$ + "V<`ghj^XmUN=2`iAC^mUN=2`9be2Gc;nJ4PCSm9gnB_61hlX9oNn]onoVV<`"
A$ = A$ + "^:MG[WY93\gBge#G6H#jN3Jb03BgK#C6H#jN3Jb03BgK#C6H#jN3jb03nCoU"
A$ = A$ + "oElN3Jb0OSVLO8mj4PcAjF3Jb03lh[^?TNM2`i#CneM6?fZeTQK6?OMf5R_>"
A$ = A$ + "1hDHObmQd[C0>7OjcoLlN3Jb0OSVLo8mJ5PSW[?inAje:07_dM6dU16T^aPV"
A$ = A$ + "<`Pd=6dT1nV?mEGKbk9_nl1l^Bga#C6H#j63jb03BgGjIWicg5Jb`m#j^6Jb"
A$ = A$ + "03BgGjM9f[Lje<073?6njgfLje>0k?=inEje>0k?=inEje>0k??g9ggB_n1H"
A$ = A$ + "OY9ggB_n1HOii>inFje?0k;kC^_UNm3`>c[?ZM_h[Q0f=fWle#jeA0k3WWlk"
A$ = A$ + "9ecg5Jb`eTm9[93d>dT_6B_>2HoT^WP^<`Pd]4dT16T^UPV<`Pd]4dT1n6g7"
A$ = A$ + "OG7YG;1lndT_>B_F2hmU^SPV<`PdM4dU16T^QPV<`Pd=4dT16T^QPV<`Pd=4"
A$ = A$ + "dT16T^QP^<`Pdm3dT16T^OP^<`Pd]3dT16T^MPV<`Pd]3dT16T^MPV<`Pd]3"
A$ = A$ + "dT16T^MP^<`PdM3dT16T^KPV<`PdM3dT16T^KPV<`PdMSNg_mgogRoePV<LM"
A$ = A$ + "T^KL5dZMid[]0fVF_YP^<LWT^GPV<`7U^IP^<`Pdm2dT16T^GPV<`Pdm2dT1"
A$ = A$ + "6T^GP^<`Pd]2dT16T^EPV<`Pd]2dU16T^CP^<`gT^?PV<`Pdm1dT16T^?PV<"
A$ = A$ + "`Pdm1dT16T^?P^<`Pd]1dT16T^=PV<`PiVGmJ>beGjeM0c;MK0MIP1c=[FfW"
A$ = A$ + "\m:OmUN]7`gKYiE=i[_d[m0nNceN[kCFGnJ;mJ?P?JYIea=IMi[[d[o0nX7="
A$ = A$ + "_Z7O?TN=8`Po`Om_odV\^leFjeP03Z]g7=cZ9OmUNM8`gDK^j^TN]8`jJbje"
A$ = A$ + "g3YG;2gMoYobojGK^j^TNm8LgEKb5jbTNm8Lg=NNDCVd[7Qk^olWo7ojlXN<"
A$ = A$ + "5YGC2gIYWoYmTN=9LWUNnWfCjeT`MFjiOJ?YGC2gES?;IX:mjBh^ZLM`ineS"
A$ = A$ + "YB_^4^[B?kCK:mjBh^:m\?]Yd[;QkZdcndVB_^4^[FclYcKnN:mJCh>jIcUj"
A$ = A$ + "agKYGO2g=YWiY]UNm9LgTNVWfFjeW`MCI^ciC`STN=:LWTNNWfGjeX`MbhW?"
A$ = A$ + "kQiTN=:LGhij2F[d[EQk0kAVe:mJEh>#CV]8mjEhZ;m<>mUd[GQ[^dchdGB_"
A$ = A$ + "N5^jB?SCo9mJFh:K;cRU7G9N\U#je\`EFjiKj?YGc2GIYW_Y?UNM;LEUNfVn"
A$ = A$ + "Dje]`EEjIKjGYGk2GAYW[YOUN];L5UN^VnEje^`EDjiJjGYGk2GAYW[YOUN]"
A$ = A$ + ";L5UN^VnEje^`ESWChhMTNm;LeX9ck8mjGhZa[a8l>B_n5^JB?CCo;mJHh:9"
A$ = A$ + "ml<m_d[QQ[TdccdoB_66^BB??Co;mJHh:9ml<m_d[QQ[TdccdoB_66^BB??c"
A$ = A$ + "e#jea`EAjII^6B_>6^2lh5QmDjec#_;m<<G;YG?3m^dc`L]TNm<dkB?3ceCj"
A$ = A$ + "ed#?;ml;G?YGC3m\dc_L=UNM=d[6?7mKomo]hcbL=TNM=d[V>;Y;cN8mjJXG"
A$ = A$ + "UNfU[Yd[[QNEjIG^^B_f6jAYWKij:mJKX7UN^U[[d[]QNdSVYLomak:mjKXg"
A$ = A$ + "lXi9=INGYGO3mVdc\LmUN=>dCFkLUm<c[:mJLXW\fi:=INEYGS3mTdc[LmUN"
A$ = A$ + "=>dCNdnO]gHf;YGW3mRij^Ja\gB_>7j5UiUY=hj_GKVmBjei#_HYI8MIfCYG"
A$ = A$ + "W3mRj<Sf;7]d[eQN#Y5k<Ui<TN]>d3Zc;J`LdB_F7j1eiUU^OnPmBjej#?X<"
A$ = A$ + "[\diG0k]d[gQFGI>ACVcBjek#[[>[X9cI8mjMXeUN6UkUd[gQFGjID^OB_V7"
A$ = A$ + "JI[M>bIK`N9mJNXUYebI;mJNXEUNfTkYd[kQFEjIC^_B_f7JAYW;in:mJOX5"
A$ = A$ + "]dlRcHVSFjen#;Z<KXoB:YGo3]VbLacNLE[IcA9mjOXelXi5]H>JYGo3]VbL"
A$ = A$ + "Qf;9UN60J9YW7Qdc0#;Y<ChiYCB:m<0d:n3oeonoNV`[?eTDji0XEDW9ljS:"
A$ = A$ + "9UN>0J5eI2WM19UN>0J5[MVA_VSDji0XETNF4:B?70]RYc6f?<YTNF0J1UIQ"
A$ = A$ + "jI9[7CJYW7PdZc2jbd2B??0YEW56gSeU9Udc3#JUi0k?VFBjI28Yb<Pc]PFB"
A$ = A$ + "jI28Yb<`hV\^<YUNV0BZ<3X9C[9mL1TBImodV\^<YUN^0BA?VFDji28UUJbJ"
A$ = A$ + "cTFjI38QiJbjad2B?K09X7C[:m\1TPm9C[:m\1TPF<]Zdc6#2?jnhCSVTB?K"
A$ = A$ + "09hL;XEUNf0B`i9C[:m\1T`JjaJdTBji3h\mXV\F<YUNn0>K;Mf5>33J1YW?"
A$ = A$ + "PcVV<]\dc7`ICCVFGjI4h<Y9C[;m<2LVNFCFKVdB?S0WYefTeU9Ydc9`IA?V"
A$ = A$ + "N#ji4h\l^mHmJ>3YWCPcbFfWldOMjK37Udc9`IiEKaeO_V<WUdc:`IhE>g2W"
A$ = A$ + "e<9TNF1>3KIObSY9cI;m\2L6dTYWTNN1>J_jm_WV<9TNN1>J_ce2WV<W]dc;"
A$ = A$ + "`AjEOlRhnhSDB?c07Ygia`WV<YTN^1>:[]9_deU\V<9TN^1>:_BCN;Wg<LDB"
A$ = A$ + "?k07Q]dTOdNUC?ObmDji7H_]eVlF_^<PSDji7H_Y9C_;m<4\WdTYgUN6J>oo"
A$ = A$ + "R3cl%%%0"
btemp$ = ""
For i& = 1 To Len(A$) Step 4: B$ = Mid$(A$, i&, 4)
If InStr(1, B$, "%") Then
For C% = 1 To Len(B$): F$ = Mid$(B$, C%, 1)
If F$ <> "%" Then C$ = C$ + F$
Next: B$ = C$: End If: For j = 1 To Len(B$)
If Mid$(B$, j, 1) = "#" Then
Mid$(B$, j) = "@": End If: Next
For t% = Len(B$) To 1 Step -1
B& = B& * 64 + Asc(Mid$(B$, t%)) - 48
Next: X$ = "": For t% = 1 To Len(B$) - 1
X$ = X$ + Chr$(B& And 255): B& = B& \ 256
Next: btemp$ = btemp$ + X$: Next
btemp$ = _Inflate$(btemp$, m.SIZE)
_MemPut m, m.OFFSET, btemp$: _MemFree m
BASIMAGE1& = _CopyImage(v&): _FreeImage v&
End Function
RE: Working on the Doodle Drawing Recorder/Player. Testers wanted - Dav - 08-30-2023
@mnrvovrfc, Sorry we posted at the same time! I'll look over your fix now. Thanks!
- Dav
RE: Working on the Doodle Drawing Recorder/Player. Testers wanted - Dav - 08-30-2023
You're right, @mnrvovrfc, that did work. I put that in the code. Thank you! I also shortened the delay to .5 as that seems to be enough on my my computer to work. The hand image started as a photo of my hand holding a pencil, I converted it to 16 colors to make it a smaller file size. Thank you for your testing!
- Dav
RE: Working on the Doodle Drawing Recorder/Player. Testers wanted - Dav - 08-30-2023
Yes, the hand jumping is gone now using _ColorChooserDialog instead, but I've discovered that the dialog can't be seen when using a screen in _FULLSCREEN. Anyway, after doing a bunch a drawings and seeing no hand glitches I'd say the drawing work is working ok, now will move onto things like file saving/loading, maybe work on a menu of some kind. Speed control/pause during playback. Perhaps add printed TEXT to a drawing. Here's a sample animated drawing. Played back perfect.
- Dav
RE: Working on the Doodle Drawing Recorder/Player. Testers wanted - James D Jarvis - 08-30-2023
That's a fun program.
I'm using a windows machine, and I can see _ColorChooserDialog in _fullscreen mode.
Code: (Select All) '=== main drawing loop begins
_FullScreen
Cls , CanvasColor&
just shoved it in there to see what would happen and it worked fine.
RE: Working on the Doodle Drawing Recorder/Player. Testers wanted - Dav - 08-30-2023
(08-30-2023, 02:49 PM)James D Jarvis Wrote: That's a fun program.
I'm using a windows machine, and I can see _ColorChooserDialog in _fullscreen mode.
Code: (Select All) '=== main drawing loop begins
_FullScreen
Cls , CanvasColor&
just shoved it in there to see what would happen and it worked fine.
Hmm, and it's working for me too now. Odd. Sometimes yes, sometimes no? I've been doing the Alt+Enter switch. Well, I can live with it. Hey, thanks for trying it out, James!
- Dav
RE: Working on the Doodle Drawing Recorder/Player. Testers wanted - Dav - 08-30-2023
There's definitely a problem displaying the color chooser dialog once in a while under _FULLSCREEN on my windows 7. Maybe it's just a video driver problem on my system.
Whenever the dialog won't appear, if I click on the screen somewhere, Windows plays a system sound (like when clicking out of bounds a defined area) and the color dialog will then appear. So apparently the dialog is opened every-time, but probably just behind my fullscreen window until I click the mouse somewhere and bring it up to view?
If I run this simplified code, and switch in/out of _fullscreen, eventually it will happen (press C to bring up color box, ESC to end, Alt+Enter to go in and out of fullscreen). I ran it 20 times, 4 times the dialog wouldn't appear without clicking on the screen.
- Dav
Code: (Select All) Screen _NewImage(800, 600, 32)
_Display
_FullScreen
Do
If InKey$ = "c" Then
pick& = _ColorChooserDialog("Select a color", _RGB32(0, 255, 255))
End If
Loop Until _KeyHit = 27
|