Working on the Doodle Drawing Recorder/Player. Testers wanted
#1
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

Find my programs here in Dav's QB64 Corner
Reply
#2
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.
Reply
#3
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

Find my programs here in Dav's QB64 Corner
Reply
#4
@mnrvovrfc, Sorry we posted at the same time! I'll look over your fix now. Thanks!

- Dav

Find my programs here in Dav's QB64 Corner
Reply
#5
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

Find my programs here in Dav's QB64 Corner
Reply
#6
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

   

Find my programs here in Dav's QB64 Corner
Reply
#7
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.
Reply
#8
(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

Find my programs here in Dav's QB64 Corner
Reply
#9
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

Find my programs here in Dav's QB64 Corner
Reply




Users browsing this thread: 1 Guest(s)