ShapeEntity System

Blitz3D Forums/Blitz3D Beginners Area/ShapeEntity System

Hi, there!

I am currently working on a ShapeEntity System that will simplify (hopefully) the creation of vector games.

Here are the engine files (kline.bb, kShape.bb, glow.png, no example):
http://www.kochonet.com/kSES/kSES.zip

This is an alpha version with lot of missing functions, surely a bunch of bugs and no help files. The best way to learn it is to download separate examples and post your questions here.

latest example showing you how it's easy to make a simple asteroids clone:


The source:
Include "kShape.bb"

; FrameTiming Globals
;=========================================================================
Global fps
Global fps_count
Global fps_mil

; Initialisation
;=========================================================================
Graphics3D 640, 480, 32, 2
SetBuffer BackBuffer()

Global cam = CreateCamera()
Global dl = kDL_Create(cam, True, True, "glow.png")
kDL_Area(dl, 660, 500)

SeedRnd MilliSecs()

; Shapes Creation
;=========================================================================
Global shp_ship.kShape = kCreateShape() 
kBeginShape(shp_ship)
kShapeAdd(0, -10)
kShapeAdd(10, 10)
kShapeAdd(0, 0)
kShapeAdd(-10, 10)
kEndShape(True)

Global shp_grid.kShape = kCreateGridShape(0, 0, 640, 480, 10, 10)
Global shp_bullet.kShape = kCreatePixShape(0, 0)

Global shp_ast_big.kShape = kCreateCircleShape(0, 0, 40, 7)
Global shp_ast_medium.kShape = kCreateCircleShape(0, 0, 30, 6)
Global shp_ast_small.kShape = kCreateCircleShape(0, 0, 20, 5)

Global shp_planet.kShape = kCreateCircleShape(0, 0, 300, 32)

; ShapeEntities Creation and Settings
;=========================================================================
Global timer% ; timer = kSE_Create(null, dl) -> kSE_LifeTime(timer, 150) -> kSE_Exists(timer)
			  ; This way you can easily create and control timers.

Global ship = kSE_Create(shp_ship, dl)
kSE_WrapMode(ship, 3)
kSE_Thickness(ship, 1.8)
kSE_Position(ship, 320, 240)
kSE_SetFriction(ship, 0.995)
kSE_Alpha(ship, 0)

Global grid = kSE_Create(shp_grid, dl)
kSE_Color(grid, 0, 0, 255)
kSE_Thickness(grid, 0.35)

Global planet = kSE_Create(shp_planet, dl)
kSE_Position(planet, 0, 0)
kSE_Color(planet, 255, 128, 255)
kSE_Thickness(planet, 0.5)
kSE_RotSpeed(planet, 0.01)

; Tag Lists
;=========================================================================

Global taglist1 = kSE_CreateTagList()
Global taglist2 = kSE_CreateTagList()

; Main Loop
;=========================================================================
While Not KeyDown(1)
	kDL_Clear(dl)
	
	If KeyDown(203) Then
		kSE_Rotate(ship, kSE_GetAngle(ship) - 2.5)
	EndIf
	If KeyDown(205) Then
		kSE_Rotate(ship, kSE_GetAngle(ship) + 2.5)
	EndIf
	If KeyDown(200) Then
		kSE_PushByAngle(ship, kSE_GetAngle(ship), 0.03)
	EndIf
	If KeyHit(57) Then
		If kSE_Exists(ship) Then
			tmp = kSE_Create(shp_bullet, dl)
			kSE_MoveTo(tmp, ship)
			kSE_Color(tmp, 255, 0, 0)
			kSE_LifeTime(tmp, 50)
			kSE_Dir(tmp, kSE_GetAngle(ship))
			kSE_Speed(tmp, 8)
			kSE_MoveFront(tmp, 10)
			kSE_Thickness(tmp, 3)
			kSE_WrapMode(tmp, 3)
			kSE_SetTag(tmp, "BULLET")
		Else
			If kSE_Exists(timer) = False Then
				ship = kSE_Create(shp_ship, dl)
				kSE_WrapMode(ship, 3)
				kSE_Thickness(ship, 1.8)
				kSE_Position(ship, 320, 240)
				kSE_SetFriction(ship, 0.995)
				kSE_Alpha(ship, 0)
			EndIf
		EndIf
	EndIf
	
	kSE_FillTagList(taglist1, "ASTEROID")
	If kSE_TagListSize(taglist1) <> 0 Then
		kSE_FillTagList(taglist2, "BULLET")
	
		For n = 1 To kSE_TagListSize(taglist2)
			bullet_tmp = kSE_TagItem(taglist2, n)
			For o = 1 To kSE_TagListSize(taglist1)
				ast_tmp = kSE_TagItem(taglist1, o)
				If kSE_PointInShape(ast_tmp, kSE_GetPosX(bullet_tmp), kSE_GetPosY(bullet_tmp)) = True Then 	
					kSE_Free(bullet_tmp)
					Select kGetParam(kSE_GetTag$(ast_tmp))
						Case "BIG"
							kSE_Thickness(ast_tmp, 10)
							kSE_SubDivide(ast_tmp)
							kSE_TrailMode(ast_tmp, True)
							For i= 1 To 3
								tmp = kSE_Create(shp_ast_medium, dl)
								kSE_MoveTo(tmp, ast_tmp)
								kSE_Alpha(tmp, kSE_GetAlpha(ast_tmp))
								kSE_Dir(tmp, Rnd(360))
								kSE_Speed(tmp, Rnd(0.75, 1.25))
								kSE_RotSpeed(tmp, Rnd(0.75, 1.25))
								kSE_WrapMode(tmp, 3)
								kSE_Thickness(tmp, 3)
								kSE_Color(tmp, 255, 128, 0)
								kSE_SetTag(tmp, "ASTEROID(MED)")
							Next
							kSE_Explode(ast_tmp, 50, 20)	
						Case "MED"	
							kSE_Thickness(ast_tmp, 10)
							kSE_SubDivide(ast_tmp)
							kSE_TrailMode(ast_tmp, True)
							For i= 1 To 3
								tmp = kSE_Create(shp_ast_small, dl)
								kSE_MoveTo(tmp, ast_tmp)
								kSE_Alpha(tmp, kSE_GetAlpha(ast_tmp))
								kSE_Dir(tmp, Rnd(360))
								kSE_Speed(tmp, Rnd(1, 1.5))
								kSE_RotSpeed(tmp, Rnd(1, 1.5))
								kSE_WrapMode(tmp, 3)
								kSE_Thickness(tmp, 2.8)
								kSE_Color(tmp, 255, 0, 0)
								kSE_SetTag(tmp, "ASTEROID(SMALL)")
							Next
							kSE_Explode(ast_tmp, 50, 15)	
						Case "SMALL"
							kSE_Thickness(ast_tmp, 10)
							kSE_SubDivide(ast_tmp)
							kSE_TrailMode(ast_tmp, True)
							kSE_Explode(ast_tmp, 100, 5)
					End Select		
					Exit
				EndIf
			Next
		Next
	Else
		For n = 1 To 3
			tmp = kSE_Create(shp_ast_big, dl)
			kSE_Position(tmp, Rnd(640), Rnd(480))
			kSE_Alpha(tmp, 0)
			kSE_Dir(tmp, Rnd(360))
			kSE_Speed(tmp, Rnd(0.5, 1))
			kSE_RotSpeed(tmp, Rnd(0.5, 1))
			kSE_WrapMode(tmp, 3)
			kSE_Thickness(tmp, 3.2)
			kSE_Color(tmp, 255, 255, 0)
			kSE_SetTag(tmp, "ASTEROID(BIG)")
		Next
	EndIf
	
	kSE_FillTagList(taglist1, "ASTEROID")
	
	alpha# = kSE_GetAlpha(ship)
	If alpha# < 1 Then
		alpha# = alpha# + 0.01
		kSE_Alpha(ship, alpha#)
	EndIf
	
	For n = 1 To kSE_TagListSize(taglist1)
		ast_tmp = kSE_TagItem(taglist1, n)
		alpha# = kSE_GetAlpha(ast_tmp)
		If alpha# < 1 Then
			alpha# = alpha# + 0.01
			kSE_Alpha(ast_tmp, alpha#)
		Else
			If kSE_GetAlpha(ship) >= 1 Then
				col = False
				If kSE_PointInShape(ast_tmp, kSE_GetPosX(ship), kSE_GetPosY(ship)) = True Then
					col = True
				ElseIf kSE_Intersects(ship, ast_tmp) = True Then
					col = True
				EndIf
				If col = True Then
					kSE_Thickness(ship, 5)
					kSE_SubDivide(ship)
					kSE_Explode(ship, 200, 1)
					timer = kSE_Create(Null, dl)
					kSE_LifeTime(timer, 150)
				EndIf
			EndIf
		EndIf
	Next
	
	kSE_Update()
	lr = kSE_Render()
	RenderWorld
	
	; Info Output
	;---------------------------------------------------------------------
	FpsUpdate()
	Text 0, 0, "FPS: " + fps
	Text 0, 15, "Lines Rendered: " + lr
	Flip
Wend

; End of Program
;=========================================================================
End

; FrameTiming Function
;=========================================================================
Function FpsUpdate()
	If MilliSecs() > fps_mil + 1000 Then
		fps_mil = MilliSecs()
		fps = fps_count
		fps_count = 0
	Else
		fps_count = fps_count + 1
	EndIf
End Function


Link to the demo - exe/main source (library not yet included):
http://www.kochonet.com/kSES/vectoroids_example.zip

Previous examples:
- http://www.kochonet.com/kSES/trails_example.zip
- http://www.kochonet.com/kSES/usershape_example.zip
- http://www.kochonet.com/kSES/basic_example.zip

Working on more examples...

wow that is really lovely!

IPete2.

This looks very exciting.

However, I am missing 'kShape.bb' - it's not in the download.

Thanks guys!

kShape.bb and kLine.bb which is part of the other are not included for the moment as I am still working on them and they are missing a lot of functions.

I do not plan to make money with my system but I need encouragements and good feedbacks...

Looks great to me.

Finish it and hand it over

Lots of eyecandy :) good work!

Thanks mates!

What do you think about the vectoroids example?
This is not yet a complete game, but it can show you some good stuffs from my ShapeEntity System.

Take a look at the code to understand how it works!

looks cool, but in the asteroids sample I could barely see the shots...

This is due to the color I've used for the bullets!
I have uploaded the example with white shots, so think they will be visible now ;)

Hi all!

I've updated the first post with a link to the engine.
This is an alpha version without any help files.

You need to have kLine.bb, kShape.bb and glow.png in the same folder as your main source.

A basic program that do nothing else than showing a centered ShapeEntity:
Include "kShape.bb"

; Main Init
Graphics3D 640, 480, 32, 2
SetBuffer BackBuffer()
cam = CreateCamera()

;-> kDL_Create(camera to assign, blended: true/false, smoothed: true/false, glowing texture)
dl = kDL_Create(cam, True, True, "glow.png") ; Create a DrawingLayer

;-> kCreateCircleShape(x#, y#, radius#, number of segments, "POINT" or "SEGMENT" based)
shape_circle.kShape = kCreateCircleShape(0, 0, 50, 10, "POINT") 

;-> Create a ShapeEntity(based on an existing Shape) on the specified DrawingLayer
circle = kSE_Create(shape_circle, dl)

kSE_Position(circle, 320, 240); Position the ShapeEntity in the center of the screen

While Not KeyDown(1)
	kDL_Clear(dl); Clear the DrawingLayer
	kSE_Render(); Render all ShapeEntities
	
	RenderWorld
	Flip
Wend


Please try and ask questions, cause I need to know what I could add to make a better system.

I haven't so much time atm to make a simple help file so if someone can help! NicolasATEK@...