09-21-2022, 08:41 PM
This a modification of my earlier minimal text animator. I promise there will be a demo program that shows how to make use of the files produced with ascii graphics for video-game style tiles/sprites (not that it would be all that hard to write your own).
When you run the program you'll see a frame, that's where the tiles will be drawn. The default size is 8 by 8.
Click on the arrows to resize the tiles in the tileset; you'll get asked if you want to continue and then the program will gladly ignore all data you are clipping off if you reduce the size of the tiles in the tile set. Press "h" or "?" for help.
Currently set up for 256 tiles as the maximum but you can of course edit that.
There's some little bits from the previous program hanging about I haven't cleaned out yet btu it's functional.
When you run the program you'll see a frame, that's where the tiles will be drawn. The default size is 8 by 8.
Click on the arrows to resize the tiles in the tileset; you'll get asked if you want to continue and then the program will gladly ignore all data you are clipping off if you reduce the size of the tiles in the tile set. Press "h" or "?" for help.
Currently set up for 256 tiles as the maximum but you can of course edit that.
There's some little bits from the previous program hanging about I haven't cleaned out yet btu it's functional.
Code: (Select All)
'ASCII tile maker
'by James D. Jarvis Sept 21,2022 v 0.1c
'
' a very minimal program to create a set of ascii tiles menat for use as sprites and backgrounds
'S - Save file
'L - load file
' can save files unencoded (encodingg 0), or tile channel endcoded (encoding 1)
' currently hardcoded to use encoding 1
'use mouse to draw
'? or H for help to see other commands
'
'nothing fancy here at all, just a minimal program that functions
'$dynamic
Screen _NewImage(80, 25, 0)
_Title "ASCII TileMaker"
Type gcelltype
t As String * 1
fgk As _Byte
bgk As _Byte
End Type
Dim Shared maxtx, maxty, maxtiles, pen$, fg_klr, bg_klr, pen_klr
Dim Shared tileX, tileY, smallerxx, smallerxy, smalleryy, smalleryx, largeryy, largeryx, largerxx, largerxy
Dim Shared showonion, tilerate, lasttile, tileno, tileshow, encoding, hightile
tileX = 8
tileY = 8
smalleryx = tileX + 3
smalleryy = 2
largeryx = tileX + 3
largeryy = tileY + 3
smallerxx = 1
smallerxy = tileY + 4
largerxx = tileX + 2
largerxy = tileY + 4
tilerate = 20
tileshow = -1
encoding = 1
maxtx = _Width
maxty = _Height
maxtiles = 256
pen$ = "*"
showonion = 0
hightile = 1
Print "ASCII TileMaker"
_ControlChr Off
Dim Shared gcell(maxtiles, maxtx, maxty) As gcelltype
For f = 1 To maxtiles
For y = 1 To _Height
For x = 1 To _Width
gcell(f, x, y).t = " "
gcell(f, x, y).fgk = 15
gcell(f, x, y).bgk = 0
Next x
Next y
Next f
tileno = 1
fg_klr = 15
bg_klr = 0
pen_klr = 15
oflag = 0
Color fg_klr, bg_klr
'main program loop
drawtile tileno
Do
_Limit 60
Do While _MouseInput ' Check the mouse status
If _MouseButton(1) Then 'draw that square if the
mx = _MouseX: my = _MouseY
_PrintString (1, 1), Str$(mx): _PrintString (12, 1), Str$(my)
If mx > 1 And my > 2 And my < tileY + 3 And mx < tileX + 3 Then
gcell(tileno, mx - 1, my - 2).t = pen$
gcell(tileno, mx - 1, my - 2).fgk = pen_klr
gcell(tileno, mx - 1, my - 2).bgk = bg_klr
Color pen_klr, gcell(tileno, mx - 1, my - 2).bgk
_PrintString (mx, my), gcell(tileno, mx - 1, my - 2).t
End If
tsize = 0
If mx = smalleryx And my = smalleryy Then
aak$ = ynbox$("Resize ALL Tiles?", mx, my)
If aak$ = "Y" Or aak$ = "y" Then
tileY = tileY - 1
If tileY < 2 Then tileY = 2
tsize = 1
End If
End If
If mx = largeryx And my = largeryy Then
aak$ = ynbox$("Resize ALL Tiles?", mx, my)
If aak$ = "Y" Or aak$ = "y" Then
tileY = tileY + 1
If tileY > 20 Then tileY = 20
tsize = 1
End If
End If
If mx = smallerxx And my = smallerxy Then
aak$ = ynbox$("Resize ALL Tiles?", mx, my)
If aak$ = "Y" Or aak$ = "y" Then
tileX = tileX - 1
If tileX < 2 Then tileX = 2
tsize = 1
End If
End If
If mx = largerxx And my = largerxy Then
aak$ = ynbox$("Resize ALL Tiles?", mx, my)
If aak$ = "Y" Or aak$ = "y" Then
tileX = tileX + 1
If tileX > 40 Then tileX = 40
tsize = 1
End If
End If
If aak$ = "N" Or aak$ = "n" Then drawtile tileno
If tsize = 1 Then
smalleryx = tileX + 3
smalleryy = 2
largeryx = tileX + 3
largeryy = tileY + 3
smallerxx = 1
smallerxy = tileY + 4
largerxx = tileX + 2
largerxy = tileY + 4
drawtile tileno
End If
Color 15, 0
End If
Loop
Select Case kk$
Case "n", "N"
Cls
tileno = tileno + 1
hightile = hightile + 1
If hightile > maxtiles Then hightile = maxtiles
' If showonion = 1 And tileno > 1 Then drawonion (tileno - 1)
drawtile tileno
Case "p", "P" 'play the animation
playanimation 1, lasttile
Case ",", "<" 'cycle down through drawn tiles
tileno = tileno - 1
If tileno < 1 Then tileno = hightile
drawtile tileno
Case ".", ">" 'cycle up through drawn tiles
tileno = tileno + 1
If tileno > hightile Then tileno = 1
Cls
drawtile tileno
Case "f", "F"
pen_klr = select_pencolor
Cls
drawtile tileno
Case "b", "B"
bg_klr = select_backgroundcolor
Cls
drawtile tileno
Case "S"
savefile
Cls
drawtile tileno
Case "L"
loadfile
Cls
playanimation 1, lasttile
tileno = 1
Case "h", "H", "?"
helpme
Cls
drawtile tileno
Case "r", "R"
tilerate = newrate
Cls
drawtile tileno
Case "c", "C"
pen$ = Chr$(newchar)
Cls
drawtile tileno
Case "v", "V" 'eyedropper that copies cell from previous tile in the same position.
If tileno > 1 Then eyedropper _MouseX, _MouseY
Case "z", "Z" 'zap a cell .... well erase it
zapcell _MouseX, _MouseY
Case "D" 'duplicate
duplicatetile tileno
tileno = tileno + 1
lasttile = tileno
Cls
drawtile tileno
Case "X"
newanimation
drawtile tileno
Case "1" 'show tilecount
tileshow = tileshow * -1
drawtile tileno
Case "T", "t"
inserttext _MouseX, _MouseY, pen_klr, bg_klr
End Select
kk$ = InKey$
If kk$ = "f" Then _PrintString (1, 1), Str$(tileno)
Loop Until kk$ = Chr$(27)
Sub drawtile (f As Integer)
Cls
For y = 1 To tileY
For x = 1 To tileX
If gcell(f, x, y).t <> " " Then
Color gcell(f, x, y).fgk, gcell(f, x, y).bgk
_PrintString (x + 1, y + 2), gcell(f, x, y).t
End If
Next
Next
Color 15, 0
If tileshow = 1 Then
_PrintString (_Width - 4, 1), Str$(tileno)
End If
tbar$ = String$(tileX + 2, Asc("+"))
_PrintString (1, 2), tbar$ + Chr$(30)
For y = 1 To tileY
_PrintString (1, y + 2), "+"
_PrintString (2 + tileX, y + 2), "+"
Next
_PrintString (1, 3 + tileY), tbar$ + Chr$(31)
tbar$ = Chr$(17) + String$(tileX, " ") + Chr$(16)
_PrintString (1, 4 + tileY), tbar$
End Sub
Sub drawonion (f As Integer)
'i don't work and it makes no sense that I'm here in this program
'noted for delete
For y = 1 To _Height
For x = 1 To _Width
Color 24, 0
_PrintString (x, y), gcell(f, x, y).t
Next
Next
Color 15, 0
End Sub
Sub eyedropper (cx, cy)
gcell(tileno, cx, cy).t = gcell(tileno - 1, cx, cy).t
gcell(tileno, cx, cy).fgk = gcell(tileno - 1, cx, cy).fgk
gcell(tileno, cx, cy).bgk = gcell(tileno - 1, cx, cy).bgk
Color gcell(tileno, cx, cy).fgk, gcell(tileno, cx, cy).bgk
_PrintString (cx, cy), gcell(tileno, cx, cy).t
End Sub
Sub duplicatetile (fr)
For cy = 1 To _Height
For cx = 1 To _Width
gcell(fr + 1, cx, cy).t = gcell(fr, cx, cy).t
gcell(fr + 1, cx, cy).fgk = gcell(fr, cx, cy).fgk
gcell(fr + 1, cx, cy).bgk = gcell(fr, cx, cy).bgk
Next cx
Next cy
End Sub
Sub inserttext (cx, cy, fk, bk)
Cls
Print "Enter Text You Wish to Insert"
Input txt$
Cls
For tp = 1 To Len(txt$)
If (cx - 1 + tp) <= _Width Then
gcell(tileno, cx - 1 + tp, cy).t = Mid$(txt$, tp, 1)
gcell(tileno, cx - 1 + tp, cy).fgk = fk
gcell(tileno, cx - 1 + tp, cy).bgk = bk
End If
Next
drawtile tileno
End Sub
Sub newanimation
Cls
Print "Erase Animation and Start New One?"
Print " Y or N "
nflag = 0
Do
k$ = Input$(1)
Select Case k$
Case "Y", "y"
ask$ = "Y"
nflag = 1
Case "N", "n"
ask$ = "N"
nflag = 1
End Select
Loop Until nflag = 1
If ask$ = "Y" Then
ReDim gcell(maxtiles, maxtx, maxty) As gcelltype
For f = 1 To maxtiles
For y = 1 To _Height
For x = 1 To _Width
gcell(f, x, y).t = " "
gcell(f, x, y).fgk = 15
gcell(f, x, y).bgk = 0
Next x
Next y
Next f
tileno = 1
fg_klr = 15
bg_klr = 0
pen_klr = 15
oflag = 0
Color fg_klr, bg_klr
End If
End Sub
Sub zapcell (cx, cy)
gcell(tileno, cx, cy).t = " "
gcell(tileno, cx, cy).fgk = 0
gcell(tileno, cx, cy).bgk = 0
Color gcell(tileno, cx, cy).fgk, gcell(tileno, cx, cy).bgk
_PrintString (cx, cy), gcell(tileno, cx, cy).t
End Sub
Sub playanimation (ff, lf)
For f = ff To lf
Cls
_Limit tilerate
For y = 1 To _Height
For x = 1 To _Width
Color gcell(f, x, y).fgk, gcell(f, x, y).bgk
_PrintString (x, y), gcell(f, x, y).t
Next
Next
_Display
Next f
_AutoDisplay
Color 15, 0
End Sub
Function select_pencolor
Cls
Color 15, 0
Print "SELECT PEN COLOR"
Print
Print " 0.",: Color 0, 0: Print Chr$(219),: Color 15, 0: Print "16.",: Color 16, 0: Print Chr$(219): Color 15, 0
Print " 1.",: Color 1, 0: Print Chr$(219),: Color 15, 0: Print "17.",: Color 17, 0: Print Chr$(219): Color 15, 0
Print " 2.",: Color 2, 0: Print Chr$(219),: Color 15, 0: Print "18.",: Color 18, 0: Print Chr$(219): Color 15, 0
Print " 3.",: Color 3, 0: Print Chr$(219),: Color 15, 0: Print "19.",: Color 19, 0: Print Chr$(219): Color 15, 0
Print " 4.",: Color 4, 0: Print Chr$(219),: Color 15, 0: Print "20.",: Color 20, 0: Print Chr$(219): Color 15, 0
Print " 5.",: Color 5, 0: Print Chr$(219),: Color 15, 0: Print "21.",: Color 21, 0: Print Chr$(219): Color 15, 0
Print " 6.",: Color 6, 0: Print Chr$(219),: Color 15, 0: Print "22.",: Color 22, 0: Print Chr$(219): Color 15, 0
Print " 7.",: Color 7, 0: Print Chr$(219),: Color 15, 0: Print "23.",: Color 23, 0: Print Chr$(219): Color 15, 0
Print " 8.",: Color 8, 0: Print Chr$(219),: Color 15, 0: Print "24.",: Color 24, 0: Print Chr$(219): Color 15, 0
Print " 9.",: Color 9, 0: Print Chr$(219),: Color 15, 0: Print "25.",: Color 25, 0: Print Chr$(219): Color 15, 0
Print "10.",: Color 10, 0: Print Chr$(219),: Color 15, 0: Print "26.",: Color 26, 0: Print Chr$(219): Color 15, 0
Print "11.",: Color 11, 0: Print Chr$(219),: Color 15, 0: Print "27.",: Color 27, 0: Print Chr$(219): Color 15, 0
Print "12.",: Color 12, 0: Print Chr$(219),: Color 15, 0: Print "28.",: Color 28, 0: Print Chr$(219): Color 15, 0
Print "13.",: Color 13, 0: Print Chr$(219),: Color 15, 0: Print "29.",: Color 29, 0: Print Chr$(219): Color 15, 0
Print "14.",: Color 14, 0: Print Chr$(219),: Color 15, 0: Print "30.",: Color 30, 0: Print Chr$(219): Color 15, 0
Print "15.",: Color 15, 0: Print Chr$(219),: Color 15, 0: Print "31.",: Color 31, 0: Print Chr$(219): Color 15, 0
Do
Locate 20, 3: Input "enter color from 0 to 31 ", kk$
Loop Until Val(kk$) > -1 Or Val(kk$) < 32
select_pencolor = Val(kk$)
End Function
Function newrate
Cls
Print "Change tile Rate ?"
Print
Print "Current tile rate is "; tilerate
Print
Do
Locate 20, 3: Input "enter rate from 1 to 60 ", kk$
Loop Until Val(kk$) > 0 Or Val(kk$) < 61
newrate = Val(kk$)
End Function
Function ynbox$ (msg$, mx, my)
tx = mx: ty = my
lr = Len(msg$) + 4
If tx + lr > _Width Then tx = _Width - (lr + 5)
If ty + 4 > _Height Then ty = _Height + 5
_PrintString (tx, ty), String$(lr, Asc("*"))
_PrintString (tx, ty + 1), "* " + msg$ + " *"
_PrintString (tx, ty + 2), "*" + String$(lr - 2, Asc(".")) + "*"
_PrintString (tx + lr / 2 - 4, ty + 2), " Y or N "
_PrintString (tx, ty + 3), String$(lr, Asc("*"))
Do
ak$ = Input$(1)
Loop Until UCase$(ak$) = "Y" Or UCase$(ak$) = "N"
ynbox$ = ak$
End Function
Function select_backgroundcolor
Cls
Color 15, 0
Print "SELECT Background COLOR"
Print
Print " 0.",: Color 0, 0: Print Chr$(219),: Color 15, 0
Print " 1.",: Color 1, 0: Print Chr$(219): Color 15, 0
Print " 2.",: Color 2, 0: Print Chr$(219),: Color 15, 0
Print " 3.",: Color 3, 0: Print Chr$(219): Color 15, 0
Print " 4.",: Color 4, 0: Print Chr$(219),: Color 15, 0
Print " 5.",: Color 5, 0: Print Chr$(219): Color 15, 0
Print " 6.",: Color 6, 0: Print Chr$(219),: Color 15, 0
Print " 7.",: Color 7, 0: Print Chr$(219): Color 15, 0
Print " 8.",: Color 8, 0: Print Chr$(219),: Color 15, 0
Print " 9.",: Color 9, 0: Print Chr$(219): Color 15, 0
Print "10.",: Color 10, 0: Print Chr$(219),: Color 15, 0
Print "11.",: Color 11, 0: Print Chr$(219): Color 15, 0
Print "12.",: Color 12, 0: Print Chr$(219),: Color 15, 0
Print "13.",: Color 13, 0: Print Chr$(219): Color 15, 0
Print "14.",: Color 14, 0: Print Chr$(219),: Color 15, 0
Print "15.",: Color 15, 0: Print Chr$(219): Color 15, 0
Do
Locate 20, 1: Input "enter color from 0 to 31", kk$
Loop Until Val(kk$) > -1 Or Val(kk$) < 32
select_backgroundcolor = Val(kk$)
End Function
Sub helpme
Cls
Print "HELP"
Print
Print "S - Save file "
Print "L - load file "
Print "use mosue to draw, click on arrows to resize the tileset (be careful)"
Print "N,n - create a new tile (limited to 200 as coded but you can edit that if you wish"
Print "P,p - play tiles as animation"
Print "C,c - change pen foreground color , you'll have to enter color number afterward"
Print "B,b - change pen background color, you'll have to enter color number afterward"
Print "R,r - change tile rate for animation playback.....not all that important relly"
Print "V,v - eyedropper, copies cell from previous tile"
Print "Z,z - zap the cell, erase it by setting it to a space with a foreground and background of zero"
Print "T,t - insert text string, will be prompeted for text to insert"
Print "D - Duplicate tile, be careful this will replace the next tile"
Print "X - Delete tiles, prompted to verify delete"
Print "1 - show current tile in top right corner, will not be recodeed"
Print "esc - to quit program.... be careful this just dumps you out and you'll lose any work currently"
Print
Print "Press any key to continue"
any$ = Input$(1)
End Sub
Function newchar
Dim mc(0 To 256, 2)
Cls
x = 0
y = 3
newc = -1
Print "Click on the Character you wish to use."
For c = 0 To 255
x = x + 2
If x > 60 Then
x = 2
y = y + 2
End If
_PrintString (x, y), Chr$(c)
mc(c, 1) = x
mc(c, 2) = y
Next c
Do
_Limit 60
Do While _MouseInput ' Check the mouse status
If _MouseButton(1) Then 'draw that square if the
mx = _MouseX: my = _MouseY
c = 0
Do
If mc(c, 1) = mx And mc(c, 2) = my Then newc = c
c = c + 1
If c = 256 Then newc = -2
Loop Until newc <> -1
If newc = -2 Then newc = -1
End If
Color 15, 0
Loop
Loop Until newc <> -1
newchar = newc
End Function
Sub savefile
Locate 1, 1
Print "Enter file name "
Locate 2, 1
Input filename$
Open filename$ For Output As #1
Write #1, tilerate, tileX, tileY, hightile, encoding
'encoding = 0
If encoding = 0 Then
For f = 1 To hightile
For y = 1 To tileY
For x = 1 To tileX
Write #1, gcell(f, x, y).t, gcell(f, x, y).fgk, gcell(f, x, y).bgk,
Print gcell(f, x, y).t, gcell(f, x, y).fgk, gcell(f, x, y).bgk,
Next x
Next y
Next f
End If
If encoding = 1 Then
For f = 1 To hightile
ttile$ = ""
ftile$ = ""
btile$ = ""
For y = 1 To tileY
For x = 1 To tileX
ttile$ = ttile$ + gcell(f, x, y).t
ftile$ = ftile$ + Chr$(gcell(f, x, y).fgk)
btile$ = btile$ + Chr$(gcell(f, x, y).bgk)
Next x
Next y
Write #1, ttile$
Write #1, ftile$
Write #1, btile$
Next f
End If
Close #1
Locate 3, 1
Print filename$; " saved"
Print "press any key to continue"
any$ = Input$(1)
End Sub
Sub loadfile
Locate 1, 1
Print "Enter file name "
Locate 2, 1
Input filename$
Open filename$ For Input As #1
Input #1, tilerate, tileX, tileY, hightile, encoding
'encoding = 1
If encoding = 0 Then 'no encoding just read each cell
For f = 1 To hightile
For y = 1 To tileY
For x = 1 To tileX
Input #1, gcell(f, x, y).t, gcell(f, x, y).fgk, gcell(f, x, y).bgk
Print gcell(f, x, y).t, gcell(f, x, y).fgk, gcell(f, x, y).bgk
Next x
Next y
Next f
End If
If encoding = 1 Then 'discrete run length encoding
'each tile breaks the data down into a channel for the the charcter, a channel for foreground and a channel for background
' encoding is limited to line by line
For f = 1 To hightile
Input #1, ttile$
Input #1, ftile$
Input #1, btile$
For y = 1 To tileY
For x = 1 To tileX
gcell(f, x, y).t = Mid$(ttile$, (y - 1) * tileY + x, 1)
gcell(f, x, y).fgk = Asc(Mid$(ftile$, (y - 1) * tileY + x, 1))
gcell(f, x, y).bgk = Asc(Mid$(btile$, (y - 1) * tileY + x, 1))
Next x
Next y
Next f
End If
Close #1
Locate 3, 1
Print filename$; " loaded"
Print "press any key to continue"
any$ = Input$(1)
End Sub