How to apply a ascii character to a cube
Blitz3D Forums/Blitz3D Beginners Area/How to apply a ascii character to a cube
| ||
I've been digging around in my folders and I know somewhere I figured this out before, but I cannot find it. Can someone please remind me how to apply a particular ascii character to a cube after it has been created without having to created a bitmap in a paint program? I would like to do it programmatically to save having to create a 100 different bit maps. My goal is I'm making a game board with the numbers 1 to 100 superimposed on each different cube. So I suppose I ultimately want to be able to apply up to 3 characters i.e."100" to a cube. |
| ||
SetBuffer() is your friend... Actually I'm not sure whether you can use standard drawing commands on a texture buffer, can't remember, but at any rate if you can't, you can always draw what you need to BackBuffer() and then CopyRect it over. |
| ||
Yeah, you can draw text or use any 2d command on any buffer. Only situtaion you can't do this, is when you lock a buffer. You can only use writepixel and read pixel (and copyrect?), until you unlock the buffer again. |
| ||
You can create a texture, set the buffer to that texture (SetBuffer TextureBuffer(Texture)) and use Text on it. I know it can be done, because my game is doing that. |
| ||
thanks for the replies folks, will try it later. |
| ||
I am not sure, but I 'think' that using 100 frames of one textrue is ''better' than using 100 textrues each with one frame (???) Here's an example: The Text Size and font should be set up beforehand, but note that a small text size will be less texture memory used up but the text will look blocky whilst a large text size will look smoother, but take up more of the memory :) Global Texture%=CreateTexture(StringWidth("100"),StringHeight("100"),0,100) Global Cubes%[100] Function BuildAndTextureCubes() Local nCount% For nCount%=0 To 99 Cubes%[nCount%]=CreateCube() SetBuffer TextureBuffer(Texture%,nCount%) Text GraphicsWidth() Shr True, GraphicsHeight() Shr True,Str(nCount%+1),True,True SetBuffer BackBuffer() EntityTexture Cubes[nCount%],Texture%,nCount% Next End Function |
| ||
When trying your example above, I get a variable type mismatch error on the line: "Cubes%[nCount%]=CreateCube()" Removing the % from the array fixed it. |
| ||
I remember there were transparency problems with this and also some weird drawing bugs when drawing text to texture buffers. There was a work around somewhere but i have no idea where or what it was called... |
| ||
When trying your example above, I get a variable type mismatch error on the line: "Cubes%[nCount%]=CreateCube()" Removing the % from the array fixed it. Sorry PowerPC603, and thanks for posting what fixes it - I just typed that out here rather than in Blitz so I didnt eeven try it... bad me! Nate - I guess something related to how TTF fonts are scaled could do something like that? If it's only when drawing to textrue buffers, then maybe a two-step approach could be done building an Image first, writing text on that, and then copying the imagebuffer to the texture buffer? Remembering free the image after all's said & done (???) |
| ||
@Malice, thanks for the func. Didn't quite get around to putting the numbers on, was having to much fun developing a make_game_board function, which I got carried away with and slapped in some stairs functionality.: (I WILL be applying some numbers later though!) A little snapshot of calling the function with 3,3 being passed with 25 madsteps being set within the function:- |
| ||
found this as well:; TextureBuffer Example ; --------------------- Graphics3D 640,480 SetBuffer BackBuffer() camera=CreateCamera() light=CreateLight() RotateEntity light,90,0,0 cube=CreateCube() PositionEntity cube,0,0,5 ; Create texture of size 256x256 tex=CreateTexture(256,256) ; Set buffer - texture buffer SetBuffer TextureBuffer(tex) ; Clear texture buffer with background white color ClsColor 255,255,255 Cls ; Draw text on texture font=LoadFont("arial",24) SetFont font Color 0,0,0 Text 0,0,"This texture" Text 0,40,"was created using" : Color 0,0,255 Text 0,80,"CreateTexture()" : Color 0,0,0 Text 0,120,"and drawn to using" : Color 0,0,255 Text 0,160,"SetBuffer TextureBuffer()" ; Texture cube with texture EntityTexture cube,tex ; Set buffer - backbuffer SetBuffer BackBuffer() While Not KeyDown( 1 ) pitch#=0 yaw#=0 roll#=0 If KeyDown( 208 )=True Then pitch#=-1 If KeyDown( 200 )=True Then pitch#=1 If KeyDown( 203 )=True Then yaw#=-1 If KeyDown( 205 )=True Then yaw#=1 If KeyDown( 45 )=True Then roll#=-1 If KeyDown( 44 )=True Then roll#=1 TurnEntity cube,pitch#,yaw#,roll# RenderWorld Flip Wend End |
| ||
@malice, I am attempting to use a version of your code to apply texture to a 100 separate ODE cubes. I save the 100 diffeterent ODE cubes memory locations into an array, and then loop through the 100 cubes applying the text on the texture to each cube, however I cannot understand why the final number of the loop index is being applied to all of the cubes:- |
| ||
Hmm, confused I am... Tried applying a separate texture of 91 to the 91st cube outside of the loop index - and all 75 cubes also have 91 applied to them. I'm beginning to think I need a 100 textures......... In fact I think I've just learned the hardway if a texture is applied to anything in a game and updated - wherever that texture is will be updated also. Hmm. |
| ||
I think see what's happening... You are only ever defining one texture. 'text' This is fine if you wish to use a separate texture FRAME for each number, but you also only have a single frame. So, even if you change the texture before applying to a new cube, EVERY INSTANCE of the texture is changed, including those already applied. What you need is to add in something to ensure you aer actually using a different texture (or different texture frame) to each cube. Try this: ; Create texture of size 256x256 Global FLAGS=1 ;Malice Added this because you need to specify the texture flags value before how many frames. 1=colour and is the default tex=CreateTexture(256,256,FLAGS,100) ;Malice This now gives the texture 100 frames font=LoadFont("arial",96,1,0,0) SetFont font Color 0,0,0 For countcubes=1 To 100 ;Malice Moved the setbuffer and cls inside loop and removed duplicate for efficiency. ; Draw text on texture ; Set buffer - texture buffer ;-Malice: Added Second Parameter for frame reference (frames are counted from 0-99) SetBuffer TextureBuffer(tex,countcubes-1) ; Clear texture buffer with background white color ClsColor 255,255,255 Cls Text 0,80," "+countcubes : Color 255,125,255 ;Flip -Malice We don't need flip as we are only drawing to the texture buffer. ;Malice Again, added a second parameter for texture frame EntityTexture colorthis(countcubes),tex,countcubes-1 Next ; Malice Setbuffer back to backbuffer OUTSIDE of loop for efficiency. SetBuffer BackBuffer() |
| ||
@Malice, thankyou for the extra clarification, it is appreciated. |
| ||
Just implemented the code, works a treat: |
| ||
As Nate said, doing 2D Stuff on a Texturebuffer fails on a number of machines. It might work on yours, but not on the one of your customer. Drawing to the backbuffer and then Copyrect to the texturebuffer always works. |
| ||
In lieu of jfk's post, just in case, here's a modified version of my code that copies the tetures from the backbuffer as suggested: Overall it will be slightly slower, but assuming these cubes and their twxtures are all generated prior to 'gameplay' actually begins, it shouldn't be an issue. ; Create texture of size 256x256 Global FLAGS=1 ;Malice Added this because you need to specify the texture flags value before how many frames. 1=colour and is the default tex=CreateTexture(256,256,FLAGS,100) ;Malice This now gives the texture 100 frames font=LoadFont("arial",96,1,0,0) SetFont font SetBuffer BackBuffer() Color 0,0,0 ClsColor 255,255,255 Cls ;First loop to wtrite out 0 - 99 on the backbuffer all together to save constantly re-drawing etc. For countcubes=1 To 100 SetBuffer TextureBuffer(tex,countcubes) ; Malice: Not entirely sure if these are req'd but Cls ; Just in case, clear the texture buffers in white. SetBuffer BackBuffer() Text 0+StringWidth(Str(countcubes)),0,Str(countcubes),True,True Next ;second loop to copy the relevant text from the backbuffer onto the texture frame buffers For countcubes=1 To 100 xx=StringWidth(countcubes) yy=StringHeight(countcubes) CopyRect 0+xx,0,xx,yy,128-(xx Shr True),128-(yy Shr True) ,BackBuffer(),TextureBuffer(tex,countcubes-1) ;Flip -Malice We don't need flip as we need to keep the back buffer ;Malice Again, added a second parameter for texture frame EntityTexture colorthis(countcubes),tex,countcubes-1 Next ; Malice Setbuffer to back buffer is already done. |
| ||
As Nate and jfk already said, avoid trying to use 2D drawing commands directly onto a texture. First create an image (or use the backbuffer to draw on), draw your text or any 2D stuff you want to see on your texture, and finally Copyrect the image to your texture. I've had lots of troubles when trying to write text directly onto a texture. On my laptop it worked fine, but on the pc, the text didn't show up. I had a sprite with a texture on it, but the text didn't show up. It only showed up when editing another texture (for use on another model), but only for 1 frame before disappearing again. After changing the code to draw to an image first, everything worked fine. Also masking a texture didn't work when the text was directly written to the texture, even on the laptop. Again, using an image first, then CopyRect it to the texture and after that, using a MaskTexture function from the code-archives, gave the texture proper masking. |
| ||
Thank you for the extra pointers, I'd simply resigned myself to thinking it would not work on the laptop. |