SpriteControl problems

Blitz3D Forums/Blitz3D Programming/SpriteControl problems

Jeroen(Posted 2003) [#1]
Hi! This is for users that are familiar with SpriteControl (http://www.blitzbasic.com/codearcs/codearcs.php?code=456) :-)

Include "Sprite Control.bb"
Graphics3D 640,480
SetBuffer BackBuffer()

treasureMapSize = GraphicsHeight() ;based on the graphicsheight, I will also size the map to 
								   ;the screenwidth, since width is always bigger than height.
pieceSize = treasureMapSize / 4

Type kaartstukje
	Field entity
	Field id
End Type


mycamera=CreateCamera()
myspritecam = CreateSpriteCamera()


kaart = LoadImage3D ("kaart.jpg",1)
palen = LoadImage3D ("vb.png",2)

HandleImage3D kaart,-1,-1
DrawImage3D kaart,0,0
ResizeImage3D kaart,treasureMapSize,treasureMapSize 

HandleImage3D palen,-1,-1
DrawImage3D palen,0,0
ResizeImage3D palen,treasureMapSize,treasureMapSize 


RenderWorld
Flip
kaart_id=1

; chop the images in pieces
For y=0 To 3 
	For x=0 To 3  
		k.kaartstukje = New kaartstukje
		k\entity = GrabImage3D(x*pieceSize, y*pieceSize, pieceSize, pieceSize)
		k\id = kaart_id
		kaart_id=kaart_id+1
	Next
Next

; remove the big images, no need for them anymore
FreeEntity kaart
FreeEntity palen

;FlushKeys
;WaitKey

; draw them again
x=0 : y=0
For k.kaartstukje = Each kaartstukje
  	HandleImage3D k\entity,-1,-1	
	DrawImage3D k\entity, x*pieceSize+2, y*pieceSize+2
	x = x + 1 
	If x > 3 
		x = 0
		y = y + 1
		End If
		
Next
RenderWorld
Flip
	

WaitKey
End


Now what this code does: chop two displayed images into 16 pieces, and show them again (draw each chopped piece).
Weird enough piece #7 is also piece #5. And the loop is correct! I checked which coordinates are grabbed, and displayed again, so this shouldn't be possible!
First question: Someone knows what going on?

Second question: it grabs what is displayed on screen, but I do not want the user to see this. I tried hideEntity and cameraProjMode 0 but then the result is that nothing gets grabbed (because it is hidden).
How can I NOT show what's going on but still grab the image?

Thank you!


Sunteam Software(Posted 2003) [#2]
I would add a couple more fields to kaartstukje type to store the x and y position on screen for display. That way there is no confusion on destination drawing position.

When you render a scene it usually renders to the backbuffer, so why not grab it from the backbuffer and remove the need to flip the buffers.


Ross C(Posted 2003) [#3]
I can't really see whats going on as some functions are missing. What does GrabImage3d do? Oh, are you using turtles userlib/ddl thingy?


Ethan3850(Posted 2003) [#4]
>are you using turtles userlib/ddl thingy?

The link says it's by Syntax Error.

>When you render a scene it usually renders to the backbuffer, so why not grab it from the backbuffer and remove the need to flip the buffers

That would work, but it depends on how GrabImage3d is coded - Jeroen might need Syntax Error's permission to change his code.


EOF(Posted 2003) [#5]
Hi Jeroen,

Try this example with the *new* updated SpriteControl.

; GrabImage3D test

tilesX=5 : tilesY=4

; the include file
Include "Sprite Control.bb"

; set up the 3d display
Graphics3D 640,480,0,2
SetBuffer BackBuffer()

img=LoadImage("f:\640x480.jpg")
DrawImage img,0,0

cam=CreateCamera()
piv=CreateSpritePivot(cam,0.0002)

Dim s(1000)

iw=640/tilesX : ih=480/tilesY

For x=0 To (tilesX-1)
For y=0 To (tilesY-1)
	num=num+1
	s(num)=GrabImage3D(x*iw,y*ih,iw,ih)
	HandleImage3D s(num),-1,-1
	DrawImage3D s(num),x*iw,y*ih
Next
Next

RenderWorld

Flip
WaitKey
End


Should be fine now.
To grab the images without the user 'seeing' them do as Sainfohi suggests.
GrabImage3D() works on the current buffer. Just grab your stuff without Flipping and do a cls to clear the buffer.

Example:
; GrabImage3D test2

; the include file
Include "Sprite Control.bb"

; set up the 3d display
Graphics3D 640,480,0,2
SetBuffer BackBuffer()
cam=CreateSpriteCamera()

img=LoadImage("f:\640x480.jpg")
DrawImage img,0,0
sprite=GrabImage3D(20,40,128,128)
Cls

Repeat
	Cls
	DrawImage3D sprite,MouseX(),MouseY()
	RenderWorld
	Flip
Until KeyHit(1)

End



Jeroen(Posted 2003) [#6]
Hey guys,

Thanks for all the help. I implemented the example above and now it works like a charm!