2D scene system with cameras

Monkey Archive Forums/Monkey Projects/2D scene system with cameras

Skn3(Posted 2014) [#1]
I haven't had an opportunity to touch Monkey code properly for a long time! But today I got some fun bit of code working in my lunch break.

Controls
-Hold 1,2 or 3 to select the different cameras/objects
-While 1,2 or 3 are held:
-- c rotates selected cameras
-- o rotates selected objects
-- up,down,left,right moves selected objects
-- page-up/page-down zooms selected cameras

http://www.skn3.com/junk/skn3engine/demos/cameras/index.html

The scene is setup like so:
object1 = Skn3EntityRect.Create("object1", 32, 32, 32, 32, 0, 0, 255)
AddChild(object1)

'add child object
object2 = Skn3EntityRect.Create("object2", 64, 0, 16, 16, 0, 255, 255)
object1.AddChild(object2)

'add child-child object
object3 = Skn3EntityRect.Create("object3", 32, 0, 8, 8, 255, 0, 255)
object2.AddChild(object3)

'add a camera to the scene and set its target to teh child object
camera1 = AddCamera(Skn3Camera.Create("camera1", 20, 20, 320, 440))
camera1.BackgroundTo(128, 128, 128)
camera1.BorderTo(255, 0, 0)
camera1.CrosshairTo(255, 0, 0, 0.3)
camera1.SetTarget(object3)

camera2 = AddCamera(Skn3Camera.Create("camera2", 360, 20, 260, 160))
camera2.BackgroundTo(128, 128, 128)
camera2.BorderTo(255, 0, 0)
camera2.CrosshairTo(255, 0, 0, 0.3)
camera2.SetTarget(object2)

camera3 = AddCamera(Skn3Camera.Create("camera3", 360, 200, 260, 260))
camera3.BackgroundTo(128, 128, 128)
camera3.BorderTo(255, 0, 0)
camera3.CrosshairTo(255, 0, 0, 0.3)
camera3.SetTarget(object1)


Just thought Id post it here because I was happy I got it working!


ziggy(Posted 2014) [#2]
Very nice!


navyRod(Posted 2014) [#3]
interesting


Skn3(Posted 2014) [#4]
Today I got some image caching stuff going, a console started (try pressing escape) and a system to automate mouse/touch input from screen/world into camera viewports.

http://www.skn3.com/junk/skn3engine/demos/cameras02/MonkeyGame.html

So Im working towards quite a powerful scene system which automates a lot of stuff. Here is the scene code for teh above demo:

Class SceneGame Extends Skn3Scene
	Field camera1:Skn3Camera
	Field camera2:Skn3Camera
	Field camera3:Skn3Camera
	Field object1:Skn3EntityRect
	Field object2:Skn3EntityRect
	Field object3:Skn3EntityRect
	Field image:Skn3Image
	
	'constructor/destructor
	Function Create:SceneGame(id:String)
		' --- create the scene ---
		'create new scene
		Local scene:= New SceneGame
		
		'setup
		scene.OnSetupEntity(id)
		scene.OnSetupScene()
		
		'perform create
		scene.OnCreate()
		
		'return it
		Return scene
	End
	
	'inherited events
	Method OnCreate:Void()
		' --- scene has been created ---
		'set size of the scene
		SizeTo(DeviceWidth(), DeviceHeight())
		
		'add parent object
		object1 = Skn3EntityRect.Create("object1", 32, 32, 32, 32, 0, 0, 255)
		AddChild(object1)
		
		'add child object
		object2 = Skn3EntityRect.Create("object2", 64, 0, 16, 16, 0, 255, 255)
		object1.AddChild(object2)
		
		'add child-child object
		object3 = Skn3EntityRect.Create("object3", 32, 0, 8, 8, 255, 0, 255)
		object2.AddChild(object3)
		
		'add cameras to the scene
		camera1 = AddCamera(Skn3Camera.Create("camera1", 20, 20, 320, 440))
		camera1.BackgroundTo(128, 128, 128)
		camera1.BorderTo(255, 0, 0)
		camera1.CrosshairTo(255, 0, 0, 0.3)
		camera1.ScaleTo(0.5)
		
		camera2 = AddCamera(Skn3Camera.Create("camera2", 360, 20, 260, 160))
		camera2.BackgroundTo(128, 128, 128)
		camera2.BorderTo(255, 0, 0)
		camera2.CrosshairTo(255, 0, 0, 0.3)
		camera2.ScaleTo(0.1)
		
		camera3 = AddCamera(Skn3Camera.Create("camera3", 360, 200, 260, 260))
		camera3.BackgroundTo(128, 128, 128)
		camera3.BorderTo(255, 0, 0)
		camera3.CrosshairTo(255, 0, 0, 0.3)
		camera3.ScaleTo(0.2)
		
		'load an image
		image = Skn3Image.Create("scrap/monkey.jpg")
	End
	
	Method OnUpdate:Void()
		' --- scene is updating ---
		'position object2 at mouse coords depending on what camera we are hovering over, the true param indicates that we are position at scene world coords
		If Skn3Runtime.MouseActive() object2.MoveTo(Skn3Runtime.MouseX(), Skn3Runtime.MouseY(), True)
		
		'make stuff happen to each camera
		camera1.RotateBy(30)
		camera2.RotateBy(-15)
		camera3.RotateBy(5)
		camera3.ScaleTo(1 + ( (Cos(Skn3Runtime.Ms() * 0.1) + 1) * 0.5))
	End
	
	Method OnRender:Void()
		'draw monkey image
		SetAlpha(0.5)
		SetColor(255, 255, 255)
		image.Draw(0.0, 0.0, DeviceWidth(), DeviceHeight())
		
		'draw the lines connecting the objects
		Local pos1:Float[2]
		Local pos2:Float[2]
		Local pos3:Float[2]
		object1.GetWorldPosition(pos1)
		object2.GetWorldPosition(pos2)
		object3.GetWorldPosition(pos3)
		SetAlpha(1.0)
		SetColor(45, 45, 45)
		DrawLine(pos1[0], pos1[1], pos2[0], pos2[1])
		DrawLine(pos2[0], pos2[1], pos3[0], pos3[1])
	End
End



Skn3(Posted 2014) [#5]
Added a generic tilemap renderer plus made more progress with lots of stuff.

The blow examples sets up the grid like so:


Move around with up,down,left,right

http://www.skn3.com/junk/skn3engine/demos/grid01/MonkeyGame.html