Dear friend,
As you know, I see BASIC-256 as a platform for childrens to create funny games. So they can learn the easiest way by having fun.
After rewriting SPRITE module and SOUND module (not finished yet) there is a big lack for user to make little games with BASIC-256: IMAGES.
So, I proudly presents: IMAGES MODULE!
The statements/functions are: imagenew, imageload, imagecopy, imagecrop, imageresize, imageautocrop, imagesetpixel, imageflip, imagerotate, imagedraw, imagecentered, imagetransformed, imagesmooth, imagewidth, imageheight, imagepixel
clg img=imageload("http://www.allacrost.org/wiki/images/a/ab/Sprite_animation_guide.png") imagecrop img,0,32,32*6,64*3 p =imagepixel(img,0,0) for y=0 to imagewidth(img)-1 for x=0 to imagewidth(img)-1 if imagepixel(img,x,y)=p then imagesetpixel(img,x,y,clear) next x next y dim move(7,4) for y=0 to 2 for x=0 to 5 move[x,y]=imagecopy(img,x*32,y*64,32,64) next x move[6,y]=move[5,y] move[5,y]=move[4,y] move[4,y]=move[3,y] tmp = move[3,y] move[3,y]=move[1,y] move[2,y]=move[2,y] move[1,y]=tmp next y unload img for x=0 to 6 move[x,3]=imagecopy(move[x,2]) imageflip(move[x,3], true) next x background = imageload("http://www.viktorjung.com/Port/Background02.jpg") imageresize(background,512,348) bush = imageload("http://vignette2.wikia.nocookie.net/dragons-world/images/4/4a/BushStore.png/revision/latest?cb=20150920141552") imageresize bush, 100, 100 dim bushes(10,2) for x=0 to 9 bushes[x,0]=rand*240 bushes[x,1]=rand*12+110+12*x next x graphsize 512,348 fastgraphics x=200 y=225 direction=1 stage=0 color darkgreen loop: ismoving=false if keypressed(16777235) then direction=0 if y>110 then y=y-3 stage=(stage+1)%6 ismoving=true end if end if if keypressed(16777237) then direction=1 if y<280 then y=y+3 stage=(stage+1)%6 ismoving=true end if end if if keypressed(16777234) then direction=3 if x>0 then x=x-4 stage=(stage+1)%6 ismoving=true end if end if if keypressed(16777236) then direction=2 if x<340 then x=x+4 stage=(stage+1)%6 ismoving=true end if end if if ismoving=false then stage=-1 if keypressed(16777216) then end imagedraw(background,0,0) f=0 for f=0 to 9 if bushes[f,1]+29>y then exitfor imagedraw bush,bushes[f,0],bushes[f,1] next f imagedraw move[stage+1,direction],x,y for f=f to 9 imagedraw bush,bushes[f,0],bushes[f,1] next f refresh pause 0.05 goto loop
This kind of animation is possible ONLY because of a true image module. The caracter is moving naturally because of many frames used. Also it is moving through the bushes correctly, which it was impossible with sprites.
-= CREATE/DESTROY =- img = imagenew(w, h, [color]) //create new empty image img = imageload(path) //create from file or network img = imagecopy() //create from screen img = imagecopy(x, y, w, h) //create from screen by cutting a part img = imagecopy(img) //create from other img img = imagecopy(img, x, y, w, h)//create from other img by cutting a part unload (image/sound) //unload resource from memory -= MANIPULATION =- imagecrop(img, x, y, w, h) //negative x,y - offset imageresize(img, s) //s is scale ?smooth? imageresize(img, w, h) ?smooth? imageautocrop(img) //crop the transparent pixels around the picture imageautocrop(img, color) //crop the pixels imagesetpixel(img, x, y, [rgb]) imageflip(img, w, [h]) imagerotate(img, angle) ?smooth? -= USE =- imagedraw(img, x, y, [opacity]) imagedraw(img, x, y, w, h, [opacity]) //if w or w is negative, then image is flipped imagecentered(img, x, y, scale, rotate, opacity) imagetransformed(img, x1, y1, x2, y2, x3, y3, x4, y4, [opacity]) imagesmooth(bool) -= INFO =- w = imagewidth(img) h = imageheight(img) rgb = imagepixel(img, x, y)
img = imagenew(w, h, [color]) //create new empty image img = imageload(path) //create from file or network img = imagecopy() //create from screen img = imagecopy(x, y, w, h) //create from screen by cutting a part img = imagecopy(img) //create from other img img = imagecopy(img, x, y, w, h)//create from other img by cutting a part unload (image/sound) //unload resource from memory
This part is very intuitive.
imagenew creates a new empty image in memory. By default, the color used is transparent, but you can specify the desired color to fill up new image.
imageload will load specified resource into memory.
imagecopy is versatile. It can be used to copy entire screen image, or a part of it. In this case, this command will ignore the sprites layer. Also, if another image is given as argument (source), then the copy process will use this source instead of screen.
All those 3 functions will return the ID of loaded image resource, as string. As you expect, the format of ID is: "image:blablabla" - just like sounds resources.
This version brings also the unload statement. This will unload the specified resource from memory. This is designed to be used with any current/further types of resources. Currently it handle the images and sounds resources.
THis part is also intuitive, the coomands have namest that speak for themselves:
imagecrop(img, x, y, w, h) //negative x,y - offset imageresize(img, s) //s is scale ?smooth? imageresize(img, w, h) //?smooth? imageautocrop(img) //crop the transparent pixels around the picture imageautocrop(img, color) //crop the pixels imagesetpixel(img, x, y, [rgb]) imageflip(img, w, [h]) imagerotate(img, angle) ?smooth?
imagecrop this crop the specified image to desired dimensions. If new dimensions are smaller, then the rest of image is lost. If new dimensions are bigger, then the new part of image is filled with transparent color. If you can specify negative offset x,y. (SEE EXAMPLE BELOW)
imageresize will resize the specified image by stretching or shrinking to desired dimensions. It can be used also by using a scale parameter.
imageautocrop will autocrop the specified image to contend by cutting the transparent part around it. You can specify a desired color to be used in which case the image is cut to the content, ignoring the color around it. Remember that imageautocrop(img) is not the same as imageautocrop(img,clear). The first statement will reduce the size of image if full transparent colors are found around it. The second statement imageautocrop(img,clear) will cut ONLY if the pixels are 0. (SEE EXAMPLE BELOW)
imagesetpixel will change the pixen in specified image to the curent color (default). You can specify another color to be used.
imageflip flip the image horizontal and vertical. The parameters are bool type. The first is horizontal flip option true/false and the second (optional) is the vertical option true/false.
imagerotate will rotate the image by angle - in radians.
Note that those statements changes the images specified. Those not create new ones.
img = imageload("https://static-s.aa-cdn.net/img/ios/958743926/5a5139c454a5f9805f845b62a9104a4d") clg color black,clear print "normal size" imagedraw img,0,0 rect 0,0,imagewidth(img),imageheight(img) gosub wait print "bigger size" clg imagecrop img,0,0,300,300 imagedraw img,0,0 rect 0,0,imagewidth(img),imageheight(img) gosub wait print "smaller size" clg imagecrop img,0,0,100,100 imagedraw img,0,0 rect 0,0,imagewidth(img),imageheight(img) gosub wait print "negative offset" clg imagecrop img,-50,-50,200,200 imagedraw img,0,0 rect 0,0,imagewidth(img),imageheight(img) wait: if key=0 then pause 0.1:goto wait return
img = imageload("http://res.cloudinary.com/lmn/image/upload/fl_lossy,q_80/f_auto/v1/gameskinny/65ecfc922df6b5bb8190c66e04d0d4b5.png") color rgb(200,200,200,200),clear clg print "* normal image" imagedraw img,0,0 rect 0,0,imagewidth(img),imageheight(img) gosub wait clg print "* autocrop - any transparent color around" imageautocrop img imagedraw img,0,0 rect 0,0,imagewidth(img),imageheight(img) gosub wait unload(img) img = imageload("https://s-media-cache-ak0.pinimg.com/564x/1d/96/c5/1d96c5b61704ad6f5d704651f889a090.jpg") clg print "* normal image" imagedraw img,0,0 rect 0,0,imagewidth(img),imageheight(img) gosub wait clg print "* autocrop - color 'white' around" imageautocrop img,white imagedraw img,0,0 rect 0,0,imagewidth(img),imageheight(img) gosub wait unload(img) clg print "* normal empty image" img=imagenew(300,300) imagedraw img,0,0 rect 0,0,imagewidth(img),imageheight(img) gosub wait clg print "* autocrop - any transparent color around" imageautocrop img imagedraw img,0,0 rect 0,0,imagewidth(img),imageheight(img) wait: if key=0 then pause 0.1:goto wait return
simple!
imagedraw(img, x, y, [opacity]) imagedraw(img, x, y, w, h, [opacity]) //if w or w is negative, then image is flipped imagecentered(img, x, y, scale, rotate, opacity) imagetransformed(img, x1, y1, x2, y2, x3, y3, x4, y4, [opacity]) imagesmooth(bool)
imagedraw will draw image at x,y. You can specify new dimensions for image (streach/shrink) without keeping proportions by using imagedraw(img, x, y, w, h). In both casese user can specify the opacity factor, which is optional. Remember that givving negative dimensions, this will make the image to be flipped on screen (horizontally or vertically).
imagecentered is used to draw image using center as coordonates (just like SPRITES).
imagetransformed is very powerfully. It is the only statement that make possible 3D games. (SEE EXAMPLE BELOW)
imagesmooth - hahaha... this is very, very, very usefull. It say to drawing system if it will use a smooth transformations for images or not. This have impact over imageresize, imagerotate, imagetransformed and any imagecentered that resize/rotate an image. (SEE EXAMPLE BELOW)
graphsize 500,300 fastgraphics clg darkgray res=imageload("http://www.areyep.com/Texturelibrary/Texlibbrickstonesamples.gif") d=300 y1=0 x1=0 for f=1 to 7 x4=x1 y4=y1+d x2=x1+d/6 y2=y1+d/10 x3=x2 y3=y2+d*.8 r=int(rand*8) wallimg = imagecopy(res,2+r*66,2+1*66,64,64) imagetransformed wallimg,x1,y1,x2,y2,x3,y3,x4,y4 imagetransformed wallimg,500-x1,y1,500-x2,y2,500-x3,y3,500-x4,y4 unload wallimg r=int(rand*8) floorimg = imagecopy(res,2+r*66,2+2*66,64,64) imagetransformed floorimg,x4,y4,x3,y3,500-x3,y3,500-x4,y4 unload floorimg d=d*.8 x1=x2 y1=y2 next f refresh
graphsize 500,300 clg a = imageload ("http://2.bp.blogspot.com/-Lq3SSlpXCYg/UOyAf_Fzs9I/AAAAAAAAAUg/LqPADR68pSg/s1600/cars.png") imagesmooth(false) imagecentered a, 80, 120, 1, 1 imagesmooth(true) imagecentered a, 300, 120, 1, 1 print "nice smooth!..." loop: if key=0 then pause 0.1: goto loop clg imagecrop(a,0,0,60,60) imagesmooth(true) imagecentered a, 80, 120, 4, 0 imagesmooth(false) imagecentered a, 300, 120, 4, 0 print "this is not..."
w = imagewidth(img) h = imageheight(img) rgb = imagepixel(img, x, y)
imagewidth and imageheight returns the dimansions of image.
imagepixel return the color of specified pixel.
1) first effect is a BLUR and fadeout effect realised just with 'imagesmooth true' and 'imageresize'
2) second effect is SQUARES and fadein effect realised just with'imagesmooth false' and 'imageresize'. If you look closely, it is almost exactly like the first example, only this use 'imagesmooth false'.
3) no signal TV - pixel manipulation and flip for more random effect
a =imageload("http://www.retroguru.com/sqrxz/sqrxz_screenshot3.png") w=imagewidth(a) h=imageheight(a) graphsize w, h fastgraphics clg black imagedraw a,0,0 refresh #BLUR and fadeout with 'imagesmooth true' and 'imageresize' imagesmooth true gosub waitanykey for x=1 to 50 pause 0.01 i=imagecopy(a) imageresize i,w-(w/50*x),h-(h/50*x) clg black imagedraw i,0,0,w,h,1-(x/50) refresh next x #SQUARES and fadein with 'imagesmooth false' and 'imageresize' imagesmooth false gosub waitanykey for x=50 to 1 step -1 pause 0.01 i=imagecopy(a) imageresize i,w/x,h/x clg black imagedraw i,0,0,w,h,1-(x/50) refresh next x imagedraw a,0,0 gosub waitanykey #generate NOISE n=imagenew(w+200,h+200,white) for yy=0 to h+199 for xx=0 to w+199 if(rand>=0.5) then imagesetpixel n,xx,yy,black next xx next yy #NOISE effect color rgb(0,0,0,20) for f = 0 to 1000 t=imagecopy(n,rand*200, rand*200,w,h) imageflip(t,rand>=0.5,rand>=0.5) o=1 if f>900 then o=1.0-(f-900)/100 clg black imagedraw t,0,0,o unload t rect 0,h-(f%(h*1.25)),w,h/4 refresh pause 0.001 next f end waitanykey: if key=0 then pause 0.1: goto waitanykey return
Respectfully,
Florin Oprea
PS No need to appear in the new book - no stress.
I would have liked that this module to be like IMGxxxx.
But it would be some problems with the old command IMGLAOD and old programs.
Enjoy! :)