|
Post by honky on Feb 7, 2024 10:31:17 GMT
Hello everyone, Why is the BMP flashes, but not always? The line with Apostrophe (Test Validity) displays the two BMPs. I tried with sprites, and it's the same, it flashes. Note: Put the code in a folder. Thank you for [/div][div] NOMAINWIN mapw=1000: maph= 500: size=20 WindowWidth=mapw+15: WindowHeight=maph+40 UpperLeftX = 10: UpperLeftY = 10 BUTTON #t.go, "Go", [go], UL, 480, 10, 35, 20 BUTTON #t.sto, "Stop", [stop], UL, 540, 10, 35, 20 GRAPHICBOX #t.g, 5, 5, mapw, maph OPEN "EMDR" FOR window_nf AS #t #t, "TRAPCLOSE [quit]" #t.g, "down" colfond$="blue": colfore$="red" #t.g, "fill ";colfond$ #t.g, "color ";colfond$: #t.g, "backcolor ";colfond$ size=20: ste=10: xx=20: yy=100: deb=20: fin=700 largmask=97+size+10: hautmask=397+size+10 '--------------------TEST validity ' #t.g, "color yellow": #t.g, "backcolor green" '----------------------END TEST #t.g, "place ";97-size;" ";397-size #t.g, "boxfilled ";largmask;" ";hautmask #t.g, "getbmp mask ";97-size;" ";397-size;" ";(size*2)+10;" ";(size*2)+10 bmpsave "mask","mask.bmp" loadbmp "mask","mask.bmp" #t.g, "color ";colfore$: #t.g, "backcolor ";colfore$ #t.g, "place ";92+(size/2);" ";394+(size/2): #t.g, "circlefilled ";size #t.g, "getbmp point ";97-size;" ";397-size;" ";(size*2)+10;" ";(size*2)+10 bmpsave "point","point.bmp" loadbmp "point","point.bmp" ' #t.g, "fill ";colfond$ wait [go] t=0 [aller] while t=0 scan yy=100 xx=xx+ste if xx > fin then exit while #t.g, "drawbmp point ";xx;" ";yy gosub [pause] #t.g, "drawbmp mask ";xx;" ";yy wend goto [retour] [retour] while t=0 scan yy=100 xx=xx-ste if xx < deb then exit while #t.g, "drawbmp point ";xx;" ";yy gosub [pause] #t.g, "drawbmp mask ";xx;" ";yy wend goto [aller] wait [stop] t=1: timer 0: wait [pause] timer 5, [temps] wait [temps] timer 0 return [quit] unloadbmp "mask": unloadbmp "point" kill "mask.bmp": kill "point.bmp" CLOSE #t END
|
|
|
Post by tsh73 on Feb 7, 2024 11:36:06 GMT
Then I run it, I see memory usage by JB program increases
Try to use Discard It looks better with flashing on my setup.
[retour] while t=0 scan yy=100 xx=xx-ste if xx < deb then exit while '------------------------------------- #t.g, "discard" 'try add this line '------------------------------------- #t.g, "drawbmp point ";xx;" ";yy gosub [pause] #t.g, "drawbmp mask ";xx;" ";yy wend goto [aller] wait
|
|
|
Post by honky on Feb 7, 2024 11:47:49 GMT
It's better. I never understood what "discard" was doing. What does "discard" do?
|
|
|
Post by tsh73 on Feb 7, 2024 15:38:59 GMT
It is related to how JB (LB) redraws graphic screen. Have you seen that if you draw something programmatically, then minimize/restore form, or obscure it by another window, drawing will be lost? At least it used to be earlier So there is a command "flush" that make JB to take a note: then window is exposed again, restore all drawings prior to "flush" How it does? It stores all the commands you issue If you draw a lot, ad use "flush", and then minimize/restor window - you will see how JB redraws all commands you had issued Kind of fast forward. The problem is, storing these commands takes a memory So you can run out of memory and your program will crash Also, somehow having all that commands stored really slows down drawing (may be some kind of "store=store+command" loop works slower for bigger "store"?) "discard" tells BASIC - forget all commands you saved. I am not going to need it. So it forgets, freeing memory. It is quick and dirty way to solve memory problem, also speeds up drawing a bit Speeding up solves flicker issue, I guess. If you want not "quick and dirty" but proper way, read Getting to grips with Segments alycesrestaurant.com/lbpe/Graphic%20Segments.html
|
|
|
Post by honky on Feb 7, 2024 16:58:13 GMT
Thank you for these explanations. With Discard it works better.
|
|
|
Post by tsh73 on Feb 7, 2024 17:09:58 GMT
"discard", mind you Calling Discord, with capital "D", will summon him
|
|
|
Post by Rod on Feb 7, 2024 18:54:02 GMT
If you want to draw fast moving graphics concentrate on sprites. Sprites can be large. Discard has no place in sprite drawn graphics,
Describe what sort of animation you seek. Graphic size, frames per second.
|
|
|
Post by honky on Feb 8, 2024 9:19:40 GMT
@: tsh73: Oh Yess, I corrected before understanding the meaning of the monster.
@: Rod: The goal is simply a point that comes and goes from left to right and from right to left, with all adjustable parameters (colors, sizes, speed, step, start and end of the trip.
It all works well except that it was blinking, but TSH73 solved the problem with "Discard" (and not discord), thank you Anatoly.
|
|
|
Post by honky on Feb 8, 2024 9:45:27 GMT
The same with sprite (auto-manufactured), wait for process.
NOMAINWIN mapw=1000: maph= 500: size=20 WindowWidth=mapw+15: WindowHeight=maph+40 UpperLeftX = 10: UpperLeftY = 10 BUTTON #t.go, "Go", [go], UL, 480, 10, 35, 20 BUTTON #t.sto, "Stop", [stop], UL, 540, 10, 35, 20 GRAPHICBOX #t.g, 5, 5, mapw, maph OPEN "EMDR" FOR window_nf AS #t #t, "TRAPCLOSE [quit]" #t.g, "down" colfond$="blue": colfore$="red" #t.g, "fill ";colfond$ '-------------- #t.g, "getbmp bkd ";"5";" ";"5";" ";mapw;" ";maph bmpsave "bkd","bkd.bmp" #t.g, "cls" loadbmp "bkd","bkd.bmp" #t.g, "background bkd" ' #t.g, "color ";colfond$: #t.g, "backcolor ";colfond$ size=20: ste=10: xx=20: yy=100: deb=20: fin=700 largmask=97+size+10: hautmask=397+size+10 #t.g, "color black;backcolor black" #t.g, "place ";97-size;" ";397-size #t.g, "boxfilled ";largmask;" ";hautmask #t.g, "getbmp mask ";97-size;" ";397-size;" ";(size*2)+10;" ";(size*2)+10 ' bmpsave "mask","mask.bmp" ' loadbmp "mask","mask.bmp" #t.g, "color ";colfore$: #t.g, "backcolor ";colfore$ #t.g, "place ";92+(size/2);" ";394+(size/2): #t.g, "circlefilled ";size #t.g, "getbmp bmpp ";97-size;" ";397-size;" ";(size*2)+10;" ";(size*2)+10 bmpsave "bmpp","bmpp.bmp" loadbmp "bmpp","bmpp.bmp" gosub [tra] ' #t.g, "fill ";colfond$ wait [go] t=0 [aller] while t=0 scan yy=200 ' #t.g, "fill ";colfond$ #t.g, "color ";colfore$ #t.g, "backcolor ";colfore$ xx=xx+ste if xx > fin then exit while #t.g, "spritexy sprite ";xx;" ";yy #t.g, "drawsprites" gosub [pause] #t.g, "drawbmp mask ";xx-size;" ";yy-size wend goto [retour] [retour] while t=0 scan yy=200 ' #t.g, "fill ";colfond$ #t.g, "color ";colfore$ #t.g, "backcolor ";colfore$ xx=xx-ste if xx < deb then exit while #t.g, "spritexy sprite ";xx;" ";yy #t.g, "drawsprites" gosub [pause] #t.g, "drawbmp mask ";xx-size;" ";yy-size wend goto [aller] wait [stop] t=1: timer 0: wait [pause] timer 20, [temps] wait [temps] timer 0 return [tra] #t.g, "color white;backcolor black" #t.g, "place 200 300": #t.g, "\Wait processing" picFile$="bmpp.bmp" Open picFile$ for Input as #pic pic$=Input$(#pic, LOF(#pic)) Close #pic picWidth = Asc(Mid$(pic$, 19, 1)) + (Asc(Mid$(pic$, 20, 1)) * 256) picHeight = Asc(Mid$(pic$, 23, 1)) + (Asc(Mid$(pic$, 24, 1)) * 256) larg=picWidth: haut=picHeight: bonus=60 WindowWidth = larg+15: WindowHeight = haut*2+bonus UpperLeftX = 10: UpperLeftY = 10 GRAPHICBOX #a.m, 5, 5, larg, haut*2 MENU #a, "Traiter", "Go !", [goo] MENU #a, "Test", "Go !", [test] OPEN "Créa sprite "+ "Larg= ";str$(larg)+" Haut= ";str$(haut) FOR window_nf AS #a #a, "TRAPCLOSE [closesprit]" #a.m "down;fill white;color black; backcolor white;size 1" #a.m, "flush" loadbmp, "image", picFile$: bmp=1 #a.m, "drawbmp image ";"0";" "; haut print larg print haut ' wait [goo] for y=haut to haut*2 #a.m "color black; backcolor white;size 1" for x=1 to larg scan pix$=KCGetPixel$(x, y) if word$(pix$,1)<>"0" and word$(pix$,2)<>"0" and word$(pix$,3)<>"0" then #a.m, "set ";x;" ";y-haut end if next x next y #a.m, "getbmp sprite ";"0";" ";"0";" "; larg-2;" ";haut*2-2 bmpsave "sprite", "sprite.bmp" loadbmp "sprite","sprite.bmp": #t.g, "addsprite sprite sprite" #t.g, "spritexy sprite 200 200" #t.g, "drawsprites" close #a wait'******************** return wait Function KCGetPixel$(x, y) 'x, y = window coordinates #a.m, "Getbmp pixel ";x;" ";y;" 1 1" 'A 1x1 bitmap, contains exactly 1 pixel Bmpsave "pixel", "kcGetPixelData.datkc" 'Save that one pixel as a temporary bmp file Open "kcGetPixelData.datkc" for Binary as #kc 'Open that one pixel bmp file as a binary file Seek #kc, 66 'Blue Info b=Asc(Input$(#kc, 1)) 'Blue Seek #kc, 67 'Green Info g=Asc(Input$(#kc, 1)) 'Green Seek #kc, 68 'Red Info r=Asc(Input$(#kc, 1)) 'Red Close #kc Kill "kcGetPixelData.datkc" 'Delete the temporary bmp file KCGetPixel$=r;" ";g;" ";b 'Place the values in a string End Function ' ))))))))))))))))))))))))))))))) [quit] unloadbmp "bmpp": unloadbmp "bkd" kill "bmpp.bmp": kill "bkd.bmp" CLOSE #t END
|
|
|
Post by honky on Feb 8, 2024 10:02:38 GMT
I tried to generate the sprite with the quick code of Andy Amaya below 'JB-LB BMP To Sprite Mask 'Programmer: Andy Amaya ' Title: Fast Sprite Maker ' Date: 2006.09.29 ' GUI Added: 2020.04.21
NoMainWin
WindowWidth = 900 WindowHeight = 720
UpperLeftX=Int((DisplayWidth-WindowWidth)/2) UpperLeftY=Int((DisplayHeight-WindowHeight)/2)
gw = 700 gh = 700 GraphicBox #win.g, 0, 0, gw, gh Button #win.btn1, "Load Bitmap", [loadBMP], UL, 730, 10, 120, 25 Button #win.btn2, "Make Sprite", [makeSprite], UL, 730, 45, 120, 25 Button #win.btn3, "Help", [showHelp], UL, 730, 80, 120, 25 'Not working ?!?! Button #win.btn4, "Exit", [exitProgram], UL, 730, 640, 120, 25 StaticText #win.stx1 "Elapsed Time",730,140,120,25 Open "Fast JB Sprite Maker" for window as #win #win.g "Down; Fill 0 0 64; Flush;Color cyan;BackColor 0 0 64" #win "TrapClose [exitProgram]"
#win.g "Place 430 24;\Press 'Load Bitmap' to start ----------------->" #win.g "Place 320 58;\Once a bitmap is loaded, press 'Make Sprite' ----------------->" #win.g "Font Ms_Sans_Serif 24 Bold" #win.g "Place 150 320" #win.g "\This sprite masking utility only" #win.g "\works with 24-bit bitmaps."
#win "Font Ms_Sans_Serif 11 Bold" #win.stx1 "!disable"
Dim info$(10,10)
Wait
[loadBMP] 'Load the Image to be masked fileName$ = "" FileDialog "Open Image to MASK","*.bmp", fileName$ If fileName$ = "" Then Notice "Load Image Cancelled." Else Notice "Image "+fileName$+ " loaded." End If Wait
[makeSprite] 'Perform masking on loaded BMP If fileName$ <> "" Then #win.stx1 "Elapsed Time" #win.stx1 "!disable" 'start time in milliseconds st = Time$("ms") Call text 10,gh-35,"Working..."
'Open a test bitmap Open fileName$ For Binary As #bmpIn 'get the length of the file lenFile = LOF(#bmpIn) 'get bmpHeaderInfo info$ = Input$(#bmpIn,54) 'get width of bmp bmpWidth = Asc(Mid$(info$,19,1))+Asc(Mid$(info$,20,1))*256 'get height of bmp bmpHeight = Asc(Mid$(info$,23,1))+Asc(Mid$(info$,24,1))*256 checkPad = (bmpWidth*3) Mod 4 Select Case checkPad Case 0: row = bmpWidth*3: pad = 0:p$ = "" Case 1: row = bmpWidth*3+3: pad = 3:p$ = Chr$(0)+Chr$(0)+Chr$(0) Case 2: row = bmpWidth*3+2: pad = 2:p$ = Chr$(0)+Chr$(0) Case 3: row = bmpWidth*3+1: pad = 1:p$ = Chr$(0) End Select
'Set to start of bitmap color triplets Seek #bmpIn,54 'load bitmap data into 'all$' all$ = Input$(#bmpIn,lenFile-54) Close #bmpIn
If Left$(info$,2)<>"BM" Or Mid$(info$,29,1)<>Chr$(24) Then Notice "File is not a 24-bit windows bitmap."+Chr$(10)+"Choose a 24-bit bitmap or cancel at the 'Open image to MASK' prompt" Goto [loadBMP] End If
'mask BMP information mskLenFile = lenFile * 2 - 54 'number of bits in bitmap numBits = mskLenFile-54 mmsb$ = Chr$(Int(numBits/65536)) msb$ = Chr$(Int( (numBits And 65535) /256)) lsb$ = Chr$(numBits And 255) numberOfBit$ = lsb$+msb$+mmsb$+Chr$(0)
'This will calc 24-bit file size (16777215 bytes maximum) mmsb$ = Chr$(Int(mskLenFile/65536)) msb$ = Chr$(Int( (mskLenFile And 65535) /256)) lsb$ = Chr$(mskLenFile And 255) maskFileSize$ = lsb$+msb$+mmsb$+Chr$(0)
'this will calc 16-bit bitmap height (65535 pixels maximum) mskHeight = bmpHeight + bmpHeight mskHiNib$ = Chr$(Int(mskHeight/256)) mskLoNib$ = Chr$(mskHeight And 255) maskHeight$ = mskLoNib$+mskHiNib$
'define these color constants blk$ = Chr$(0)+Chr$(0)+Chr$(0) wht$ = Chr$(255)+Chr$(255)+Chr$(255)
Open "zzzxyz.dat" For Binary As #ms 'print same header info as bmp to be masked Seek #ms,0 Print #ms,info$ 'change the file size to reflect masked bitmap Seek #ms,2 Print #ms,maskFileSize$ 'change the bmpHeight to reflect masked bitmap Seek #ms,22 Print #ms,maskHeight$ 'change number of bits in bitmap Seek #ms,34 Print #ms,numberOfBit$ 'append bitmap to be masked Seek #ms,54 Print #ms,all$
'append masking bits For i = 0 To bmpHeight-1 'get one scanline of bitmap data oneLine$ = Mid$(all$, i*row+1, row) 'read color triplets in scanline For j = 1 To bmpWidth*3 Step 3 'grab one color triplet triplet$ = Mid$(oneLine$,j,3) 'if it's a black pixel make it white pixel If triplet$ = blk$ Then 'append white pixel bitmap data to BMP Print #ms,wht$ Else 'otherwise make it a black pixel 'append black pixel bitmap data to BMP Print #ms,blk$ End If Next j 'add 32-bit boundary padding if necessary If pad > 0 Then Print #ms,p$ Next i Close #ms et = Time$("ms")-st #win.stx1 "!enable" #win.stx1 "ET: "+Str$(et)+"ms" End If [getFileName] If fileName$ <> "" Then FileDialog "Save Mask BMP as...","*.bmp", saveName$ If saveName$<>"" Then If Right$(saveName$,4)<>".bmp" Then saveName$ = saveName$ + ".bmp" End If If fileExists(DefaultDir$,saveName$)<>0 Then Notice "File: "+saveName$+" already exists"+Chr$(10)+"Choose another name." Goto [getFileName] End If
Name "zzzxyz.dat" As saveName$ LoadBMP "masked", saveName$ #win.g "Cls; Fill 0 0 64;BackColor 0 0 64; Color cyan" #win.g "DrawBMP masked ";Int((gw-bmpWidth)/2);" 0; Flush" UnloadBMP "masked" Else If fileExists(DefaultDir$, "zzzxyz.dat") <> 0 Then Kill "zzzxyz.dat" End If End If End If Wait
[showHelp] 'Show help screen helpFile$ = Chr$(34)+DefaultDir$ + "\Fast Sprite Maker Help.htm"+Chr$(34) '===========================================================================================
'Google Chrome Browser Run "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe "+ helpFile$ '===========================================================================================
'Microsoft Edge Browser 'Run "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe "+ helpFile$ '===========================================================================================
'Internet Explorer 'Run "C:\Program Files\Internet Explorer\iexplore.exe "+ helpFile$ '=========================================================================================== Wait
[exitProgram] 'Done Close #win End
Sub text x, y, message$ #win.g,"Place ";x;" ";y;";\";message$ End Sub
Function fileExists(path$, filename$) 'dimension the array info$( at the beginning of your program Files path$, filename$, info$() fileExists = Val(info$(0, 0)) 'non zero is true End Function
But I did not automatically import the sprite. But I didn't say my last word, I'm going to get there (maybe ...).
|
|
|
Post by tsh73 on Feb 8, 2024 18:59:24 GMT
Hello honky I took a liberty and cut away any annecessary parts from your program
You go not need fancy processing pixel-by-pixel to produce sprite for a red ball. It's just black circle on white square (==mask) and red circle on black square underneath. It all produced by native JB commands, instantly.
Then moving sprite, all you need is to change sprite coords and issue "drawsprites". No color changes, no printing any masks, no hiding sprite on old position, nothing. It just works. Enjoy! ;)
NOMAINWIN mapw=1000: maph= 500: size=20 WindowWidth=mapw+15: WindowHeight=maph+40 UpperLeftX = 10: UpperLeftY = 10 BUTTON #t.go, "Go", [go], UL, 480, 10, 35, 20 BUTTON #t.sto, "Stop", [stop], UL, 540, 10, 35, 20 GRAPHICBOX #t.g, 5, 5, mapw, maph OPEN "EMDR" FOR window_nf AS #t #t, "TRAPCLOSE [quit]" #t.g, "down" 'make a sprite first. For a radius = size it will be (2*size) width, (4*size) height. 'real simple: black circle on a white above is a mask 'red circle on black is image (black would be transparent) '1) mask. Default window is white, draw on it #t.g "backcolor black" #t.g "place ";size;" ";size #t.g, "circlefilled ";size '2) image under it. Now we need black BG #t.g "backcolor black" #t.g "place ";0;" ";2*size #t.g "boxfilled ";2*size;" ";4*size 'now red circle #t.g "color red" 'change pen color, so no black border #t.g "backcolor red" #t.g "place ";size;" ";3*size #t.g, "circlefilled ";size 'get the sprite #t.g, "getbmp sprite ";0;" ";0;" ";(size*2);" ";(size*4) 'check what we captured #t.g, "drawbmp sprite 100 100" notice "Making a sprite - job done"+chr$(13)+_ "See the sprite in top left corner?"+chr$(13)+_ "I just GETBMP it and DRAWBMP to 100, 100"
'continue with preparing blue field colfond$="blue": colfore$="red" #t.g, "fill ";colfond$ '-------------- size=20: ste=10: xx=20: yy=200: deb=20: fin=700 #t.g, "addsprite sprite sprite" #t.g, "spritexy sprite ";xx;" ";yy #t.g, "drawsprites" wait
[go] t=0 [aller] while t=0 scan yy=200 xx=xx+ste if xx > fin then exit while #t.g, "spritexy sprite ";xx;" ";yy #t.g, "drawsprites" gosub [pause] wend goto [retour] [retour] while t=0 scan yy=200 xx=xx-ste if xx < deb then exit while #t.g, "spritexy sprite ";xx;" ";yy #t.g, "drawsprites" gosub [pause] wend goto [aller] wait [stop] t=1: timer 0: wait [pause] timer 20, [temps] wait [temps] timer 0 return [quit] CLOSE #t END
|
|
|
Post by honky on Feb 8, 2024 22:17:15 GMT
I can hear what you say, but I also want to be able to modify the size of the sprite, which involves refabricating during the changing.
In Andy Amaya's rapid code (above). Automatic loading works well, I deleted all the "non -compulsory".
But I can't pass the instruction "Filedialog" Save Mask BMP AS ... ","*. BMP ", Savename $" After: "[Getfilename]" So that the recording is automatic (is done on its own).
|
|
|
Post by honky on Feb 8, 2024 22:31:20 GMT
Youpie...! That's it, I got there !!! Everything is automatic. I will set it up in my code.
|
|
|
Post by tsh73 on Feb 9, 2024 7:42:57 GMT
spritescale?
(results after scaling is not that stellar, but might be just enough)
NOMAINWIN mapw=1000: maph= 500: size=20 WindowWidth=mapw+15: WindowHeight=maph+40 UpperLeftX = 10: UpperLeftY = 10 BUTTON #t.go, "Go", [go], UL, 480, 10, 35, 20 BUTTON #t.sto, "Stop", [stop], UL, 540, 10, 35, 20 GRAPHICBOX #t.g, 5, 5, mapw, maph OPEN "EMDR" FOR window_nf AS #t #t, "TRAPCLOSE [quit]" #t.g, "down" 'make a sprite first. For a radius = size it will be (2*size) width, (4*size) height. 'real simple: black circle on a white above is a mask 'red circle on black is image (black would be transparent) '1) mask. Default window is white, draw on it #t.g "backcolor black" #t.g "place ";size;" ";size #t.g, "circlefilled ";size '2) image under it. Now we need black BG #t.g "backcolor black" #t.g "place ";0;" ";2*size #t.g "boxfilled ";2*size;" ";4*size 'now red circle #t.g "color red" 'change pen color, so no black border #t.g "backcolor red" #t.g "place ";size;" ";3*size #t.g, "circlefilled ";size 'get the sprite #t.g, "getbmp sprite ";0;" ";0;" ";(size*2);" ";(size*4)
'continue with preparing blue field colfond$="blue": colfore$="red" #t.g, "fill ";colfond$ '-------------- size=20: ste=10: xx=20: yy=200: deb=20: fin=700 #t.g, "addsprite sprite sprite" #t.g, "spritexy sprite ";xx;" ";yy #t.g, "drawsprites" wait
[go] t=0 [aller] while t=0 scan yy=200 xx=xx+ste if xx > fin then exit while #t.g, "spritexy sprite ";xx;" ";yy 'so xx 0 -> 100 %, fin -> 100%, fin/2 is 200% scale = (1-abs(xx-fin/2)/(fin/2))*100+100 #t.g, "spritescale sprite ";int(scale) #t.g, "drawsprites" gosub [pause] wend goto [retour]
[retour] while t=0 scan yy=200 xx=xx-ste if xx < deb then exit while 'so xx 0 -> 100 %, fin -> 100%, fin/2 is 50% scale = 100-(1-abs(xx-fin/2)/(fin/2))*50 #t.g, "spritescale sprite ";int(scale) #t.g, "spritexy sprite ";xx;" ";yy #t.g, "drawsprites" gosub [pause] wend goto [aller] wait
[stop] t=1: timer 0: wait
[pause] timer 20, [temps] wait [temps] timer 0 return
[quit] CLOSE #t END
|
|
|
Post by honky on Feb 9, 2024 9:14:53 GMT
Wow Super! Having had some unsuccessful tests with "Sprite Scale", I doubted its effectiveness I just missed the expertise. Here is what will greatly simplify things. Very big thank you TSH73.
|
|