Hide/Show and Position Problem

Blitz3D Forums/Blitz3D Programming/Hide/Show and Position Problem

Buggy(Posted 2008) [#1]
So I'm working an a turn-based little demo game as a learning project, and I have an entity that is shown around the player whose turn it is when that player's making his/her decision, but is hidden when the turn is "playing itself out," if you understand what I'm saying.

In an if statement that determines when the turn is done playing itself out and it's the next player's turn, this entity is both shown with ShowEntity and positioned to the next player's position with PositionEntity in two consecutive lines of code. But for some reason, in one game loop, the entity is un-hidden, and in the next it's re-positioned, and I can't for the life of me figure out why.

I use render-tweening, and was wondering if this could create this problem. Any ideas?


mtnhome3d(Posted 2008) [#2]
could you post code? it would really help


Shambler(Posted 2008) [#3]
Sounds like your program flow is

UpdateWorld
ShowEntity
PositionEntity
Renderworld

and should be

ShowEntity
PositionEntity
Updateworld
Renderworld

i.e. your rendering of entities is getting updated before you have updated their positions.


Zethrax(Posted 2008) [#4]
With render-tweening, try doing any abrupt changes in position immediately before the CaptureWorld command, if possible.

If collisions are involved, try doing a ResetEntity on the moved entity, immediately after you re-position it.


Buggy(Posted 2008) [#5]
No collisions are involved, Bill, but I think all of my code is done after the CaptureWorld command. Is that not right? I was under the impression that - to use Mark's sample code - it was done like so:

While Not KeyDown(1)
	
	Repeat
		
		elapsed = MilliSecs() - time
		
	Until elapsed
	
	ticks = elapsed / period
	
	tween# = Float#(elapsed Mod period) / period
	
	For k = 1 To ticks
		
		time = time + period
		
		If k = ticks
			
			CaptureWorld
			
		EndIf
		
		UpdateGame()
		
		UpdateWorld()
		
	Next
	
	RenderWorld(tween#)
	
	Flip
	
Wend


...with all of my game mechanics done within the UpdateGame() parent function.


Zethrax(Posted 2008) [#6]
Buggy, the way you're doing it seems to be the correct way for the most part. Trying to do it differently causes a lot of jittery effects.

If you're moving something over a large distance (teleporting, etc), though; jitteriness is less of an issue, and interpolation will cause the object being moved to be rendered at various points along the line it is being moved along; which may be undesirable. Doing the positioning immediately before CaptureWorld eliminates this, as the new position of the object is captured and interpolation begins at the captured position, rather than the original one.

Whether any of this relates to your problem is a whole other question, though.


Buggy(Posted 2008) [#7]
So if I want to have all of my game code within the UpdateGame() function, then there's no easy alternative? I think I could come up with a workaround, but it certainly wouldn't be easy or pretty.


John Blackledge(Posted 2008) [#8]
Try:
HideEntity
MoveEntity
ShowEntity


6(Posted 2008) [#9]
Or rather than using HideEntity, use EntityAlpha with a value of 0 when hidden and 1 when active.


John Blackledge(Posted 2008) [#10]
6, that will still cause a 'jittery' transition.
The entity needs to be hidden to exclude it from calculations, until it's time to show it again.