Posted: 16th Dec 2018 20:35
Traffic Lights Shader

Source obtained here
http://users.tpg.com.au/subarpk/trafficLights.rar

Easy enough to make it red in the other direction while its green but I did it like that for example purposes
Posted: 16th Dec 2018 20:39
Nice.... Shaders not my thing but can be created without too.

Excellent find.
Posted: 16th Dec 2018 20:42
Thanks puzzler I added extra textures to my old light shader. So you now can have multiple light colors
usefull for traffic lights

if you want to browse the code without downloading
+ Code Snippet
// show all errors
SetErrorMode(2)

#constant screenWidth=1920
#constant screenHeight=1080
 
SetWindowSize(screenWidth,screenHeight,0)
Setvirtualresolution(screenWidth,screenHeight)
// set variables for camera's starting position
lightID=1
SetCameraPosition(1,0,100,-250)
SetFogMode( 1 ) 
SetFogColor(10,10,10)
SetFogRange(6,16)
 
loadObject(lightID,"trafficLights.obj") 

createShader() 
loadImage(1,"lights2.png") //the complete normal texture
loadImage(2,"green2.png") 
loadImage(3,"orange2.png")
loadImage(4,"red2.png")
 

 
SetObjectImage(lightID,1,0) 
SetObjectImage(lightID,2,1) 
SetObjectImage(lightID,3,2)
SetObjectImage(lightID,4,3)
 
//createShader()
Shader=LoadShader( "neon.vs","neon.ps" )
SetObjectShader(lightID,Shader)
stage#=1.0
lightint#=1.0
lightson=1
SetShaderConstantByName(Shader,"lightint",lightint#,0.0,0.0,0.0)
SetShaderConstantByName(Shader,"lightson",lightson*1.0,0.0,0.0,0.0)
SetShaderConstantByName(Shader,"stage",1.0,0.0,0.0,0.0)     
do
    time#=timer()
    r#=7-time#
    g#=7-time#
    b#=7-time#
     
    RotateObjectLocalY(lightId,.5)
    //SetShaderConstantByName(Shader,"pointPos",1,1,1,1)
    //SetShaderConstantByName(Shader,"myColor",r#,g#,b#,0.02) //red green blue factor
    if GetRawKeyState(49)=1
		lightint#=lightint#-0.01
		if lightint#<0.0 then lightint#=0.0
		SetShaderConstantByName(Shader,"lightint",lightint#,0.0,0.0,0.0)
	endif
    if GetRawKeyState(50)=1
		lightint#=lightint#+0.01
		if lightint#>1.0 then lightint#=1.0
		SetShaderConstantByName(Shader,"lightint",lightint#,0.0,0.0,0.0)
	endif
    if GetRawKeypressed(76)=1
		lightson=1-lightson
		SetShaderConstantByName(Shader,"lightson",lightson*1.0,0.0,0.0,0.0)
	endif
	
	if GetRawKeypressed(32)=1
		if stage#<3 
			inc stage#
		else
			stage#=1.0
		endif
		SetShaderConstantByName(Shader,"stage",stage#,0.0,0.0,0.0)
	endif
	
	Print("Press space to change the light color") //the colors
    print("Press L to toggle lights working or not")
    print("Use 1 and 2 to increase/decrease light")
    print ("Current lighting "+str(lightint#))
    sync()
loop
 
 
function createShader()
file = OpenToWrite("neon.vs")
WriteLine(file,"attribute highp vec3 position;")
WriteLine(file,"attribute mediump vec3 normal;")
WriteLine(file,"attribute mediump vec2 uv;")
WriteLine(file,"varying highp vec3 posVarying;")
WriteLine(file,"varying mediump vec3 normalVarying;")
WriteLine(file,"varying mediump vec2 uvVarying;")
WriteLine(file,"varying mediump vec3 lightVarying;")
WriteLine(file,"uniform highp mat3 agk_WorldNormal;")
WriteLine(file,"uniform highp mat4 agk_World;")
WriteLine(file,"uniform highp mat4 agk_ViewProj;")
WriteLine(file,"uniform mediump vec4 uvBounds0;")
WriteLine(file,"mediump vec3 GetVSLighting( mediump vec3 normal, highp vec3 pos );")
WriteLine(file,"void main()")
WriteLine(file,"{") 
WriteLine(file,"    uvVarying = uv * uvBounds0.xy + uvBounds0.zw;")
WriteLine(file,"    highp vec4 pos = agk_World * vec4(position,1.0);")
WriteLine(file,"    gl_Position = agk_ViewProj * pos;")
WriteLine(file,"    mediump vec3 norm = normalize(agk_WorldNormal * normal);")
WriteLine(file,"    posVarying = pos.xyz;")
WriteLine(file,"    normalVarying = norm;")
WriteLine(file,"    lightVarying = GetVSLighting( norm, posVarying );")
WriteLine(file,"}") 
CloseFile(file)
  
//pixel shader
file = OpenToWrite("neon.ps")
WriteLine(file,"uniform sampler2D texture0;")
WriteLine(file,"uniform sampler2D texture1;")
WriteLine(file,"uniform sampler2D texture2;")
WriteLine(file,"uniform sampler2D texture3;")
WriteLine(file,"varying highp vec3 posVarying;")
WriteLine(file,"varying mediump vec3 normalVarying;")
WriteLine(file,"varying mediump vec2 uvVarying;")
WriteLine(file,"varying mediump vec3 lightVarying;")
WriteLine(file,"mediump vec3 GetPSLighting( mediump vec3 normal, highp vec3 pos );")
WriteLine(file,"mediump vec3 ApplyFog( mediump vec3 color, highp vec3 pointPos );")
WriteLine(file,"uniform vec4 myColor;")
WriteLine(file,"uniform mediump vec4 agk_MeshDiffuse;")
WriteLine(file,"mediump vec4 colorResult;")
WriteLine(file,"uniform float lightint;")
WriteLine(file,"uniform float lightson;")
WriteLine(file,"uniform float stage;")
WriteLine(file,"void main()")
WriteLine(file,"{")
WriteLine(file,"	mediump vec3 norm = normalize(normalVarying);")
WriteLine(file,"	mediump vec3 light = lightVarying + GetPSLighting( norm, posVarying );")
WriteLine(file,"	vec4 colorA = texture2D(texture0, uvVarying);")
WriteLine(file,"	vec4 colorB;")
WriteLine(file,"	if (stage < 1.1) {")
WriteLine(file,"		colorB = texture2D(texture1, uvVarying);")
WriteLine(file," 	} else {")
WriteLine(file,"		if (stage < 2.1) {")
WriteLine(file,"			colorB = texture2D(texture2, uvVarying);")
WriteLine(file," 		} else {")
WriteLine(file,"			if (stage < 3.1) {")
WriteLine(file,"			colorB = texture2D(texture3, uvVarying);")
WriteLine(file,"			}")
WriteLine(file,"		}")
WriteLine(file,"	}")

WriteLine(file,"	if (lightson < 1.0) {")
WriteLine(file,"		colorResult = vec4(colorA * vec4(light,1.0))*lightint;")
WriteLine(file," 	} else {")
WriteLine(file,"		if (colorB.a > 0.0) {")
WriteLine(file,"			colorResult = vec4 ((colorA * vec4(light,1.0))*lightint) + (colorB*colorB.a);")
WriteLine(file,"		} else {")
WriteLine(file,"			colorResult =vec4(colorA * vec4(light,1.0))*lightint;")
WriteLine(file,"		}")
WriteLine(file,"	}")
WriteLine(file,"gl_FragColor = colorResult;")
WriteLine(file,"}")
CloseFile(file)
endfunction

Posted: 27th Dec 2018 21:52
3D Score Board
Im only supplying the code below and not the 640*112 image made up of 64*112 numbers but it should be easy enough to create.
I haven't got much online space to host images unfortunately: (:
+ Code Snippet
type scoreType
	ID as integer
	imgID as integer
endtype
global digitalScore as scoreType[]
loadImage(fontImg,"shared/fontBlu.png")

do
digitalScoreBoard2(Score,-25,-9,-11)
sync()
loop

//The font image is 640 * 112 pixels consisting of each numeric value 64*112 
function digitalScoreBoard2(Score as integer,xStart as float,yStart as float,zStart as float)	
	if Score<0 then Score=0
	myString$=str(Score)
	if Len(myString$)=1
		myString$="00"+myString$
	elseif Len(myString$)=2
		myString$="0"+myString$
	//elseif Len(myString$)=3
	//	myString$="0-"+myString$
	endif
	for count = digitalScore.length to 0 step-1
		DeleteObject(digitalScore[count].ID)
		DeleteImage(digitalScore[count].imgID)
		digitalScore.remove(count)
	next count
	for length = 1 to len(myString$)
		a$=mid(myString$,length,1)
		b=val(a$)
		myScore as scoreType
		myScore.ID=CreateObjectPlane(4,4)
		myScore.imgID=CopyImage(fontImg, b*64,0,64,112) 
		SetObjectImage(myScore.ID,myScore.imgID,0)
		SetObjectLightMode(myScore.ID,0) 
		SetObjectPosition(myScore.ID,(length*4)+xStart,yStart,zStart)
		digitalScore.insert(myScore)
	next length
endfunction

Edited heres the image
http://users.tpg.com.au/subarpk/fontblu.png
Posted: 27th Dec 2018 21:59
Just tried and fontImg doesnt seem to be known - line 36
Posted: 27th Dec 2018 22:06
Sorry need to have you own fontimage that's a spritesheet 640*112 made up of 64*112 numbers

try this font image
http://users.tpg.com.au/subarpk/fontblu.png
Posted: 27th Dec 2018 22:08
doh - i didnt read it fully i was too zoned into Snippets - thats cool though
Posted: 1st Jan 2019 13:58
Mesh creator from a image 1.9 where black areas are removed after,
+ Code Snippet
// show all errors
SetErrorMode(2)
 
#constant screenwidth=1024
#constant screenheight=768
#constant fullscreen=0
#constant screenrate=0
#constant KEY_LEFT         37
#constant KEY_UP           38
#constant KEY_RIGHT        39
#constant KEY_DOWN         40
#constant KEY_A            65
#constant KEY_D            68
#constant KEY_E            69 
#constant KEY_Z            90
#constant KEY_M            77
#constant KEY_S            83
#constant KEY_L            76
#constant KEY_C            67
#constant KEY_HOME         36
#constant KEY_PLUS         107
#constant KEY_SUBTRACT     109
#constant KEY_SHIFT        16
// set window properties
SetWindowTitle( "Mesh Creator from an image 1.9" )
SetWindowSize( screenwidth, screenheight, fullscreen )
SetWindowAllowResize( 1 ) // allow the user to resize the window
 
// set display properties
SetVirtualResolution( screenwidth, screenheight ) // doesn't have to match the window
SetOrientationAllowed( 1, 1, 1, 1 ) // allow both portrait and landscape on mobile devices
SetSyncRate( screenrate, 0 ) // 30fps instead of 60 to save battery
SetScissor( 0,0,0,0 ) // use the maximum available screen space, no black borders
UseNewDefaultFonts( 1 ) // since version 2.0.22 we can use nicer default fonts


type _boxes
    id
    memID
    x#
    y#
    z#
endtype

final_object as integer	
global objnumber,width
global boxes as _boxes[]
camerax#=32
cameray#=20
cameraz#=-85
centreObjId=0
image=0
extrude=100:direction=1
final_object=0
do
	
	if GetRawKeyState(KEY_LEFT) then dec camerax#,.25
	if GetRawKeyState(KEY_RIGHT) then inc camerax#,.25
	if GetRawKeyState(KEY_UP) then dec cameray#,.25
	if GetRawKeyState(KEY_DOWN) then inc cameray#,.25
	if GetRawKeyState(KEY_A) then inc cameraz#,.25
	if GetRawKeyState(KEY_Z) then dec cameraz#,.25
	
	if GetRawKeyPressed(KEY_L) 
		ret$=ChooseRawFile("*.jpg;*.png",1)
		if ret$<>""
             image=loadImage("raw:"+ret$)
             imgmemblock = CreateMemblockFromImage(image)
			 width = GetMemblockInt(imgmemblock,0)
			 depth = GetMemblockInt(imgmemblock,4)
			 if mod(width,2)<>0 or mod(depth,2)<>0
				 Message("The image wasnt suitable. It needs to be an even number width and height")
				 ret$="":DeleteImage(image):DeleteMemblock(imgmemblock)
			 endif	 
        endif
	endif	
	
	if GetRawKeyPressed(KEY_E)
		if ret$<>""
			if GetRawKeyState(KEY_SHIFT)
				centreObjId=smoothHeightFunction(256-extrude,direction,"raw:"+ret$) 
				deletedObjects=dohousekeeping()
			else
				centreObjId=normalHeightFunction(256-extrude,direction,"raw:"+ret$) 
				deletedObjects=dohousekeeping()				
			endif
			
			AGM_SaveObject("raw:"+left(ret$,len(ret$)-4)+".obj","raw:"+left(ret$,len(ret$)-4)+".mtl")
			final_object=LoadObject("raw:"+left(ret$,len(ret$)-4)+".obj")
			SetObjectColor(final_object,200,0,0,255)
			SetObjectPosition(final_object,0,0,0)
			RotateObjectLocaly(final_object,-180)
			camerax#=-63
			cameray#=25
			cameraz#=-50
		endif	
	endif	
	
	if GetRawKeyPressed(KEY_C)
		for num = boxes.length to 0 step -1
			DeleteObject(boxes[num].id)
			boxes.remove(num)
		next num
		DeleteAllObjects()
		final_object=0
	endif
	if GetRawKeyPressed(KEY_D)
		if direction=1
			direction=2
		else
			direction=1
		endif
	endif
	
	if GetRawKeyPressed(KEY_PLUS) and extrude <255
		inc extrude
	endif
	
	if GetRawKeyPressed(KEY_SUBTRACT) and extrude >2
		dec extrude
	endif
	
	if GetRawKeyPressed(KEY_HOME)
		if getObjectExists(centreObjID)
			xx#=GetObjectX(centreObjID)
			yy#=GetObjectY(centreObjID)
			zz#=GetObjectZ(centreObjID)
			for num = boxes.length to 0 step -1
				if GetObjectExists(boxes[num].id)
					SetObjectPosition(boxes[num].id,getObjectX(boxes[num].id)-xx#,0,getObjectZ(boxes[num].id)-zz#)
				endif
			next num
		else
			If GetObjectExists(final_object)
				SetObjectPosition(final_object,0,0,0)
			endif
		endif	
		camerax#=0
		cameray#=25
		cameraz#=-50
	endif
	
	print("Mesh Extrude Tool V1.9")
	if ret$="" 
		print("No image Loaded please load an image to extrude")
	else	
		print(left(ret$,len(ret$)-4))
	endif
	if boxes.length<0 
		print("No blocks in memory please use one of the extrude functions")
	else
		print("Number of blocks in memory "+str(boxes.length))
	endif	
	print("Press Home to center")
	print("Press C to clear")
    print("Press L to load image")
    if direction=1
		print("Press D to toggle direction=(1 way)")
	else
		print("Press D to toggle direction=(2 way)")
	endif
	print("Press E to Extrude image and save")
	print("Press SHIFT + E Smooth Extrude")
	print("Press - less extrude value before extruding")
	print("Press + more extrude value before extruding")
	print("Extrude value (> value is > extrude ie 100) "+str(extrude))
	print("Camera X "+str(getCameraX(1)))
	print("Camera Y "+str(getCameraY(1)))
	print("Camera Z "+str(getCameraZ(1)))
    Print("FPS "+str( ScreenFPS()) )
    SetCameraPosition(1,camerax#,cameray#,cameraz#)
    Sync()
loop

function normalHeightFunction(extrudeDivisor as integer,direction as integer, filename$)
//top left front 0,9,18
//top right front 2,4,11
//top left back 8,14,16
//top right back 6,10,12
vertexLF as integer[2] = [0,9,18]
vertexRF as integer[2] = [2,4,11]
vertexLB as integer[2] = [8,14,16]
vertexRB as integer[2] = [6,10,12]

vertexBLF as integer[2] = [1,19,20]
vertexBRF as integer[2] = [3,5,22]
vertexBLB as integer[2] = [15,17,21]
vertexBRB as integer[2] = [7,13,23]

//bottom left front 1,19,20
//bottom right front 3,5,22
//bottom left back 15,17,21,24,25,26,27
//bottom right back 7,13,23,
box as _boxes
img = LoadImage(filename$)
imgmemblock = CreateMemblockFromImage(img)
local size as integer     
width = GetMemblockInt(imgmemblock,0)
depth = GetMemblockInt(imgmemblock,4)
objnumber=0
for z=depth-1 to 0 step -1
	for x=width-1 to 0 step -1
		
		Offset = (12+((z * width) + x) * 4) - 4
		r=GetMemblockByte(imgmemblock,Offset)
		g=GetMemblockByte(imgmemblock,Offset+1)
		b=GetMemblockByte(imgmemblock,Offset+2)
		a=GetMemblockByte(imgmemblock,Offset+3)
		color#=(r+g+b) 
		Height#=color#/extrudeDivisor 
		box.id=CreateObjectBox(1,1,1)
		boxes.insert(box)
		SetObjectPosition(boxes[objnumber].id,-x, 0 ,-z)
		SetObjectColor(boxes[objnumber].id,r,g,b,a)
		boxes[objnumber].memID=CreateMemblockFromObjectMesh(boxes[objnumber].id,1)
			
		for i = 0 to 2
			SetMeshMemblockVertexPosition(boxes[objnumber].memID,vertexRF[i],GetMeshMemblockVertexX(boxes[objnumber].memID,vertexRF[i]),GetMeshMemblockVertexY(boxes[objnumber].memID,vertexRF[i])+Height#,GetMeshMemblockVertexZ(boxes[objnumber].memID,vertexRF[i]))
			SetMeshMemblockVertexPosition(boxes[objnumber].memID,vertexRB[i],GetMeshMemblockVertexX(boxes[objnumber].memID,vertexRB[i]),GetMeshMemblockVertexY(boxes[objnumber].memID,vertexRB[i])+Height#,GetMeshMemblockVertexZ(boxes[objnumber].memID,vertexRB[i]))	
			SetMeshMemblockVertexPosition(boxes[objnumber].memID,vertexLF[i],GetMeshMemblockVertexX(boxes[objnumber].memID,vertexLF[i]),GetMeshMemblockVertexY(boxes[objnumber].memID,vertexLF[i])+Height#,GetMeshMemblockVertexZ(boxes[objnumber].memID,vertexLF[i]))
			SetMeshMemblockVertexPosition(boxes[objnumber].memID,vertexLB[i],GetMeshMemblockVertexX(boxes[objnumber].memID,vertexLB[i]),GetMeshMemblockVertexY(boxes[objnumber].memID,vertexLB[i])+Height#,GetMeshMemblockVertexZ(boxes[objnumber].memID,vertexLB[i]))	
		next i
		if direction=2
			for i = 0 to 2
				SetMeshMemblockVertexPosition(boxes[objnumber].memID,vertexBRF[i],GetMeshMemblockVertexX(boxes[objnumber].memID,vertexBRF[i]),GetMeshMemblockVertexY(boxes[objnumber].memID,vertexBRF[i])-Height#,GetMeshMemblockVertexZ(boxes[objnumber].memID,vertexBRF[i]))
				SetMeshMemblockVertexPosition(boxes[objnumber].memID,vertexBRB[i],GetMeshMemblockVertexX(boxes[objnumber].memID,vertexBRB[i]),GetMeshMemblockVertexY(boxes[objnumber].memID,vertexBRB[i])-Height#,GetMeshMemblockVertexZ(boxes[objnumber].memID,vertexBRB[i]))	
				SetMeshMemblockVertexPosition(boxes[objnumber].memID,vertexBLF[i],GetMeshMemblockVertexX(boxes[objnumber].memID,vertexBLF[i]),GetMeshMemblockVertexY(boxes[objnumber].memID,vertexBLF[i])-Height#,GetMeshMemblockVertexZ(boxes[objnumber].memID,vertexBLF[i]))
				SetMeshMemblockVertexPosition(boxes[objnumber].memID,vertexBLB[i],GetMeshMemblockVertexX(boxes[objnumber].memID,vertexBLB[i]),GetMeshMemblockVertexY(boxes[objnumber].memID,vertexBLB[i])-Height#,GetMeshMemblockVertexZ(boxes[objnumber].memID,vertexBLB[i]))	
			next i
		endif	
		SetObjectMeshFromMemblock(boxes[objnumber].id,1,boxes[objnumber].memID)
		//DeleteMemblock(memID)
		
		if (width-1)/2=x and (depth-1)/2=z then centreObjId=boxes[objnumber].id
		if (width-1)/2=x and (depth-1)=z then SetCameraPosition(1,getObjectX(boxes[objnumber].id),getObjectY(boxes[objnumber].id)+20,getObjectz(boxes[objnumber].id)-20)
		DeleteMemblock(boxes[objnumber].memID) 
		inc objnumber:rem if objnumber =width*depth then exitfunction centreObjID
	next x
next z

endfunction	centreObjId

function smoothHeightFunction(extrudeDivisor as integer,direction as integer, filename$)
//top left front 0,9,18
//top right front 2,4,11
//top left back 8,14,16
//top right back 6,10,12
vertexLF as integer[2] = [0,9,18]
vertexRF as integer[2] = [2,4,11]
vertexLB as integer[2] = [8,14,16]
vertexRB as integer[2] = [6,10,12]

vertexBLF as integer[2] = [1,19,20]
vertexBRF as integer[2] = [3,5,22]
vertexBLB as integer[2] = [15,17,21]
vertexBRB as integer[2] = [7,13,23]
//bottom left front 1,19,20
//bottom right front 3,5,22
//bottom left back 15,17,21,24,25,26,27
//bottom right back 7,13,23,
box as _boxes
img = LoadImage(filename$)
imgmemblock = CreateMemblockFromImage(img)
local size as integer     
width = GetMemblockInt(imgmemblock,0)
depth = GetMemblockInt(imgmemblock,4)

objnumber=0
rem adjust the heights for all the objects smoothly
counter=1:objnumber=0
for z=depth-1 to 2 step -2
    for x= width-1 to 2 step -1
		//in order rightfront,leftfront,rightback,leftback
        Offset = (12+((z * width) + (x)) * 4) - 4
        r=GetMemblockByte(imgmemblock,Offset)
        g=GetMemblockByte(imgmemblock,Offset+1)
        b=GetMemblockByte(imgmemblock,Offset+2)
        a=GetMemblockByte(imgmemblock,Offset+3)
        color#=(r+g+b)
        HeightRF#=color#/extrudeDivisor 
    
        Offset = (12+((z * width) + (x-2)) * 4) - 4
        r=GetMemblockByte(imgmemblock,Offset)
        g=GetMemblockByte(imgmemblock,Offset+1)
        b=GetMemblockByte(imgmemblock,Offset+2)
        a=GetMemblockByte(imgmemblock,Offset+3)
        color#=(r+g+b)
        HeightLF#=color#/extrudeDivisor 
		if color#<1.0 
			Offset = (12+((z * width) + (x-1)) * 4) - 4
			r=GetMemblockByte(imgmemblock,Offset)
			g=GetMemblockByte(imgmemblock,Offset+1)
			b=GetMemblockByte(imgmemblock,Offset+2)
			a=GetMemblockByte(imgmemblock,Offset+3)
			color#=(r+g+b)
			HeightLF#=color#/extrudeDivisor 
		endif	
		
        Offset = (12+(((z-2) * width) + (x)) * 4) - 4
        r=GetMemblockByte(imgmemblock,Offset)
        g=GetMemblockByte(imgmemblock,Offset+1)
        b=GetMemblockByte(imgmemblock,Offset+2)
        a=GetMemblockByte(imgmemblock,Offset+3)
        color#=(r+g+b)
        HeightRB#=color#/extrudeDivisor 
        if color#<1.0 
			Offset = (12+(((z-1) * width) + (x)) * 4) - 4
			r=GetMemblockByte(imgmemblock,Offset)
			g=GetMemblockByte(imgmemblock,Offset+1)
			b=GetMemblockByte(imgmemblock,Offset+2)
			a=GetMemblockByte(imgmemblock,Offset+3)
			color#=(r+g+b)
			HeightRB#=color#/extrudeDivisor 
		endif
        
        Offset = (12+(((z-2) * width) + (x-2)) * 4) - 4
        r=GetMemblockByte(imgmemblock,Offset)
        g=GetMemblockByte(imgmemblock,Offset+1)
        b=GetMemblockByte(imgmemblock,Offset+2)
        a=GetMemblockByte(imgmemblock,Offset+3)
        color#=(r+g+b)
        HeightLB#=color#/extrudeDivisor 
        if color#<1.0 
			Offset = (12+(((z-1) * width) + (x-1)) * 4) - 4
			r=GetMemblockByte(imgmemblock,Offset)
			g=GetMemblockByte(imgmemblock,Offset+1)
			b=GetMemblockByte(imgmemblock,Offset+2)
			a=GetMemblockByte(imgmemblock,Offset+3)
			color#=(r+g+b)
			HeightLB#=color#/extrudeDivisor 
        endif
        box.id=CreateObjectBox(2,1,2)
        SetObjectPosition(box.id,-x, 0 ,-z)
        boxes.insert(box)
        //if GetObjectExists(boxes[objnumber].id)
        SetObjectColor(boxes[objnumber].id,r,g,b,a)
        boxes[objnumber].memID=CreateMemblockFromObjectMesh(boxes[objnumber].id,1)      

        for i = 0 to 2
            SetMeshMemblockVertexPosition(boxes[objnumber].memID,vertexRB[i],GetMeshMemblockVertexX(boxes[objnumber].memID,vertexRB[i]),GetMeshMemblockVertexY(boxes[objnumber].memID,vertexRB[i])+HeightRB#,GetMeshMemblockVertexZ(boxes[objnumber].memID,vertexRB[i]))  
            SetMeshMemblockVertexPosition(boxes[objnumber].memID,vertexLB[i],GetMeshMemblockVertexX(boxes[objnumber].memID,vertexLB[i]),GetMeshMemblockVertexY(boxes[objnumber].memID,vertexLB[i])+HeightLB#,GetMeshMemblockVertexZ(boxes[objnumber].memID,vertexLB[i]))  
            SetMeshMemblockVertexPosition(boxes[objnumber].memID,vertexRF[i],GetMeshMemblockVertexX(boxes[objnumber].memID,vertexRF[i]),GetMeshMemblockVertexY(boxes[objnumber].memID,vertexRF[i])+HeightRF#,GetMeshMemblockVertexZ(boxes[objnumber].memID,vertexRF[i]))
			SetMeshMemblockVertexPosition(boxes[objnumber].memID,vertexLF[i],GetMeshMemblockVertexX(boxes[objnumber].memID,vertexLF[i]),GetMeshMemblockVertexY(boxes[objnumber].memID,vertexLF[i])+HeightLF#,GetMeshMemblockVertexZ(boxes[objnumber].memID,vertexLF[i]))
        next i              
        if direction=2
			for i = 0 to 2
				SetMeshMemblockVertexPosition(boxes[objnumber].memID,vertexBRB[i],GetMeshMemblockVertexX(boxes[objnumber].memID,vertexBRB[i]),GetMeshMemblockVertexY(boxes[objnumber].memID,vertexBRB[i])-HeightRB#,GetMeshMemblockVertexZ(boxes[objnumber].memID,vertexBRB[i]))  
				SetMeshMemblockVertexPosition(boxes[objnumber].memID,vertexBLB[i],GetMeshMemblockVertexX(boxes[objnumber].memID,vertexBLB[i]),GetMeshMemblockVertexY(boxes[objnumber].memID,vertexBLB[i])-HeightLB#,GetMeshMemblockVertexZ(boxes[objnumber].memID,vertexBLB[i]))  
				SetMeshMemblockVertexPosition(boxes[objnumber].memID,vertexBRF[i],GetMeshMemblockVertexX(boxes[objnumber].memID,vertexBRF[i]),GetMeshMemblockVertexY(boxes[objnumber].memID,vertexBRF[i])-HeightRF#,GetMeshMemblockVertexZ(boxes[objnumber].memID,vertexBRF[i]))
				SetMeshMemblockVertexPosition(boxes[objnumber].memID,vertexBLF[i],GetMeshMemblockVertexX(boxes[objnumber].memID,vertexBLF[i]),GetMeshMemblockVertexY(boxes[objnumber].memID,vertexBLF[i])-HeightLF#,GetMeshMemblockVertexZ(boxes[objnumber].memID,vertexBLF[i]))
			next i              
		endif	
        SetObjectMeshFromMemblock(boxes[objnumber].id,1,boxes[objnumber].memID)
        DeleteMemblock(boxes[objnumber].memID)
        //endif
        if (width-1)/2=x and (depth-1)/2=z then centreObjId=boxes[objnumber].id
        //if mod(x,2)<>0 and mod(z,2)
            inc objnumber
        //endif
    next x
next z

endfunction	centreObjId

function dohousekeeping()
	DeletedObjects=0
	for num = boxes.length to 0 step -1
		if GetObjectExists(boxes[num].id)
			r=GetObjectColorRed(boxes[num].id)
			b=GetObjectColorBLue(boxes[num].id)
			g=GetObjectColorGreen(boxes[num].id)
			if r+b+g<1 
				DeleteObject(boxes[num].id)
				boxes.remove(num)
				inc DeletedObjects
			endif
		endif
	next num

endfunction DeletedObjects	

Function AGM_SaveObject(filename$ as string,material$ as string)
fw = OpenToWrite(filename$) 
  
WriteLine(fw,"#AGM Object - " + filename$)
WriteLine(fw,"#Exported with AppGameKit")
WriteLine(fw,"")
WriteLine(fw,"mtllib " + trimPath(material$))
incrementalcounter=0
   
`number of material
m=0
for t= boxes.length to 0 step-1
    if GetObjectExists(boxes[t].id) 
        mesh = CreateMemblockFromObjectMesh(boxes[t].id,1)
`       get object vertex quantity 
        verts= GetMemblockInt( mesh, 0 )
        writeline(fw,"g ") //GROUP
   
        `VERTEX
        for i= 0 to verts -1
            x#=GetMeshMemblockVertexX(mesh,i)
            y#=GetMeshMemblockVertexy(mesh,i)
            z#=GetMeshMemblockVertexz(mesh,i)
            ox#=(width-1)-GetObjectWorldX(boxes[t].id)
            oy#=GetObjectWorldY(boxes[t].id)
            oz#=GetObjectWorldZ(boxes[t].id)
  
            Writeline ( fw, " v " + str(x#+ox#)+ " "+str(y#+oy#)+ " "+str(z#+oz#))
        next i
   
    `TEXTURE VEERTICES
    for i= 1 to verts
        uu#=GetMeshMemblockVertexU( mesh, i )
        vv#=GetMeshMemblockVertexV( mesh, i )
        writeline(fw, " vt "+str(uu#)+" "+str(vv#))
    next
    
  `     NORMALS
    for i= 0 to verts -1
        x#=GetMeshMemblockVertexnormalX(mesh,i)
        y#=GetMeshMemblockVertexnormaly(mesh,i)
        z#=GetMeshMemblockVertexnormalz(mesh,i)
  
        Writeline ( fw, " vn " + str(x#)+ " "+str(y#)+ " "+str(z#))
    next i
     
    
    `FACES
   
    inc m,1
    //Writeline ( fw,"usemtl Material.00"+str(m))
    Writeline ( fw,"usemtl Material.00")
    
    s=0 `reseting variable s
  
   for i= 1 to verts-4
         
    inc s,1
      if s=3
        n=n+1
        nor=nor+4
        writeline (fw, " f "+ str(n+1)+"/"+str(n+1)+"/"+str(nor)    +" "+str(n) +"/"+str(n+2)+"/"+str(nor)     +" "+str(n+2)+"/"+str(n)+"/"+str(nor)      +" "+str(n+3)+"/"+str(n+3)+"/"+str(nor))
        s=0
        n=n+3
      endif
   next
   DeleteMemblock(mesh)
endif
next t
CloseFile ( fw )  
 /*
fw=OpenToWrite(material$)
for t= boxes.length to 0 step-1
    if GetObjectExists(boxes[t].id) 
        //Writeline ( fw,"newmtl Material.00"+str(t))
        Writeline ( fw,"newmtl Material.00")
        
        WriteLine(fw,"Kd " + str(GetObjectColorRed(boxes[t].id)/255.0) + " " + str(GetObjectColorGreen(boxes[t].id)/255.0) + " " + str(GetObjectColorBlue(boxes[t].id)/255.0))
        DeleteObject(boxes[t].id)
        DeleteMemblock(boxes[t].memID)
        boxes.remove(t)
    endif
next t
CloseFile(fw)
*/
for num = boxes.length to 0 step -1
    DeleteObject(boxes[num].id)
    DeleteMemblock(boxes[num].memID)
    boxes.remove(num)
next num    
DeleteAllObjects()
endfunction

function trimPath(str$ as string)
num=len(str$)
if num<1 then exitfunction ""
repeat 
	dec num
until mid(str$,num,1)="\"
for num2=(num+1) to len(Str$)	
	trimStr$=trimStr$+mid(str$,num2,1) 
next
endfunction trimStr$


map.png here



There is two height functions

1>smoothHeightFunction(filename$)
2>normalHeightFunction(filename$)
Posted: 1st Jan 2019 22:16
This one wasn't by me but by Chafari but I think its very usefull
Find the VertexData of an Object presently shows the vertex's of a cube but easily changed
+ Code Snippet
// Project: contarvertices 
// Created: 2018-12-04

// show all errors
SetErrorMode(2)

// set window properties
SetWindowTitle( "contarvertices" )
SetWindowSize( 1024, 768, 0 )
SetWindowAllowResize( 1 ) // allow the user to resize the window

// set display properties
SetVirtualResolution( 1024, 768 ) // doesn't have to match the window
SetOrientationAllowed( 1, 1, 1, 1 ) // allow both portrait and landscape on mobile devices
SetSyncRate( 30, 0 ) // 30fps instead of 60 to save battery
SetScissor( 0,0,0,0 ) // use the maximum available screen space, no black borders
UseNewDefaultFonts( 1 ) // since version 2.0.22 we can use nicer default fonts

CreateObjectbox(1,15,15,15)
`creating a memblock
mesh = CreateMemblockFromObjectMesh(1,1)
`getting object vertex quantity
 verts= GetMemblockInt( mesh, 0 )

 for i= 0 to verts-1
	 x#=GetMeshMemblockVertexX(mesh,i)
	 y#=GetMeshMemblockVertexy(mesh,i)
	 z#=GetMeshMemblockVertexz(mesh,i)	 
	 al#=GetMeshMemblockVertexy(mesh,i)/32
 next
 
 SetObjectMeshFromMemblock(1,1,mesh)
 
 
  CreateObjectSphere(2,1,20,20)
  SetObjectColor(2,255,0,0,0)

SetCameraPosition(1,30,30,-30)
SetCameraLookAt(1,0,0,0,0)
v=0
do
   if ( GetRawKeyState( 32) ) 
	     v=v+1 
         sleep (300)
   endif
  
	 x#=GetMeshMemblockVertexX(mesh,v)
	 y#=GetMeshMemblockVertexy(mesh,v)
	 z#=GetMeshMemblockVertexz(mesh,v)

     setobjectposition(2,x#,y#,z#)
    
    
    Print("Press Spacebar to get new vertex position" )
    print("vertex  "+str(v))
    Sync()
loop
Posted: 1st Jan 2019 22:41
LED BOARD
Something else to add to this

Can use your own image if you like to, this currently renders ts own image

+ Code Snippet
// Project: led board 
// Created: 2018-12-27
 
// show all errors
SetErrorMode(2)
 
#constant screenwidth=1024
#constant screenheight=768
#constant fullscreen=0
#constant screenrate=0
 
// set window properties
SetWindowTitle( "led board" )
SetWindowSize( screenwidth, screenheight, fullscreen )
SetWindowAllowResize( 1 ) // allow the user to resize the window
 
// set display properties
SetVirtualResolution( screenwidth, screenheight ) // doesn't have to match the window
SetOrientationAllowed( 1, 1, 1, 1 ) // allow both portrait and landscape on mobile devices
SetSyncRate( screenrate, 0 ) // 30fps instead of 60 to save battery
SetScissor( 0,0,0,0 ) // use the maximum available screen space, no black borders
UseNewDefaultFonts( 1 ) // since version 2.0.22 we can use nicer default fonts
 
global objects as integer[]
 
swap()
    DrawBox(0,0,100,50,MakeColor(255,0,0),MakeColor(0,255,0),MakeColor(255,255,0),MakeColor(0,0,255),1)
     
     
render()
img = GetImage(0,0,100,50)
 
grabinfo(img)
 
camerax#=100
cameray#=100
cameraz#=-190
 
do
    if GetRawKeyState(38) then inc cameraz#
    if GetRawKeyState(40) then dec cameraz#
    if GetRawKeyState(37) then inc camerax#
    if GetRawKeyState(39) then dec camerax#
     
     
    if GetRawKeyState(87) then inc cameray#
    if GetRawKeyState(83) then dec cameray#
     
     
     
    print(GetRawLastKey())
     
     
    SetCameraPosition(1,camerax#,cameray#,cameraz#)
 
    Print( ScreenFPS() )
    Sync()
loop
 
function grabinfo(img)
    imgmemblock = CreateMemblockFromImage(img)
     
    width = GetMemblockInt(imgmemblock,0)
    height = GetMemblockInt(imgmemblock,4)
    objnumber=0
        for x=width-1 to 0 step -1
    for y=height-1 to 0 step -1
            offset = (12+((y * width) + x) * 4) - 4
            r=GetMemblockByte(imgmemblock,offset)
            g=GetMemblockByte(imgmemblock,offset+1)
            b=GetMemblockByte(imgmemblock,offset+2)
            a=GetMemblockByte(imgmemblock,offset+3)
             
            //DrawBox(x,y,x+1,y+1,MakeColor(r,g,b),MakeColor(r,g,b),MakeColor(r,g,b),MakeColor(r,g,b),1)
 
            if r<255 and g<255 and b<255 and a>0
                objects.insert( CreateObjectSphere(1,10,10))
                SetObjectPosition(objects[objnumber],x*2, -y * 2 , 2)
                SetObjectColor(objects[objnumber],r,g,b,a)
                inc objnumber
     
            endif
        next
    next
     
     
endfunction
Posted: 1st Jan 2019 22:46
Thanks fubarpk enjoy !
Posted: 1st Jan 2019 22:48
Nice effect puzzler...looks like a TV screen !
Posted: 1st Jan 2019 22:51
Thanks

Yeah I got inspiration one day with concerts - X Factor - behind the singers is a LED Board displaying what ever

Cheers
Posted: 15th Jan 2019 17:35
Blitzkrieg
+ Code Snippet
// Project: BlitzKrieg 
// Created: 2019-01-14

// show all errors
SetErrorMode(2)

#constant	KEY_SPACE        32
#constant	KEY_LEFT         37
#constant   KEY_UP           38
#constant	KEY_RIGHT        39
#constant   KEY_DOWN         40

type _bullet
	ID as integer
	time# as float //time to keep the bullet alive
endtype

type _enemy
	ID as integer
	direction as float
	enemyType as String
	speed as float
	time# as float
	hit as integer
endtype

type _player
	ID as integer
	ID2 as integer
	hit as integer
	time as float
	ammoLeft as integer
endtype
	
// set window properties
SetWindowTitle( "BlitzKrieg" )
SetWindowSize( 1024, 768, 0 )
SetWindowAllowResize( 1 ) // allow the user to resize the window

// set display properties
SetVirtualResolution( 1024, 768 ) // doesn't have to match the window
SetOrientationAllowed( 1, 1, 1, 1 ) // allow both portrait and landscape on mobile devices
SetSyncRate( 30, 0 ) // 30fps instead of 60 to save battery
SetScissor( 0,0,0,0 ) // use the maximum available screen space, no black borders
UseNewDefaultFonts( 1 ) // since version 2.0.22 we can use nicer default fonts
SetPhysicsScale(.025)
SetPhysicsGravity(0,.25)

SetPhysicsWallBottom(0)
SetPhysicsWallLeft(0)
SetPhysicsWallRight(0)
SetPhysicsWallTop(0)
global player as _player
player.hit=0
player.ammoLeft = 1000
player.ID=CreateSprite(0)
SetSpriteSize(player.ID,10,40)
SetSpritePosition(player.ID,500,700)
SetSpriteOffset(player.ID,5,40)
SetSpritePhysicsOn(player.ID,1)
baseImg=createBaseGun()
player.ID2=createSprite(baseImg)
SetSpriteScale(player.ID2,2,2)
SetSpritePosition(player.ID2,480,732)
SetSpritePhysicsOn(player.ID2,1)

planeLeftImg=createPlaneLeftFace()
planeRightImg=createPlaneRightFace()

global bullets as _bullet[]
global enemies as _enemy[]
global enemyBombs as _bullet[]
global bombersHit,bombersEscaped
global smallHit,smallEscaped
global mediumHit,mediumEscaped
global largeHit,largeEscaped
 
createEnemies(planeRightImg,planeLeftImg)

do
	//rotate player anticlockwise
    if GetRawKeyState(KEY_LEFT)
		if makeNewAngle(GetSpriteAngle(player.ID),90)>15 then SetSpriteAngle(player.ID,GetSpriteAngle(player.ID)-1)
    endif
    //rotate player clockwise
    if GetRawKeyState(KEY_RIGHT)
		if makeNewAngle(GetSpriteAngle(player.ID),90)<165 then SetSpriteAngle(player.ID,GetSpriteAngle(player.ID)+1)    
    endif
    //player shoots 
    if GetRawKeyState(KEY_SPACE)
		if player.ammoLeft>0 
			SetSpriteOffset(player.ID,5,-10) //set the bullet position in front of gun
			shoot(GetSpriteXByOffset(player.ID),GetSpriteYByOffset(player.ID),makeNewAngle(GetSpriteAngle(player.ID),90),185)
			SetSpriteOffset(player.ID,5,40)
			dec player.ammoLeft,1
		endif
	endif
	//if players been hit do an explosion routine
	if player.hit=1
			alpha=GetSpriteColorAlpha(player.ID)
			blue=GetSpriteColorBlue(player.ID)
			green=GetSpriteColorGreen(player.ID)
			alpha2=GetSpriteColorAlpha(player.ID2)
			blue2=GetSpriteColorBlue(player.ID2)
			green2=GetSpriteColorGreen(player.ID2)
	
			if alpha>15 then SetSpriteColorAlpha(player.ID,alpha-10)
			if blue>15 then SetSpriteColorBlue(player.ID,blue-10)
			if green>15 then SetSpriteColorGreen(player.ID,green-10)
			if alpha2>15 then SetSpriteColorAlpha(player.ID2,alpha2-10)
			if blue2>15 then SetSpriteColorBlue(player.ID2,blue2-10)
			if green2>15 then SetSpriteColorGreen(player.ID2,green2-10)
			if player.time+3<timer() 
				removeSprites()
				gameover()
				player.hit=0
				SetSpriteColor(player.ID,255,255,255,255)
				SetSpriteColor(player.ID2,255,255,255,255)
				createEnemies(planeRightImg,planeLeftImg)
				player.ammoLeft=1000
				bombersHit=0:bombersEscaped=0
				smallHit=0:smallEscaped=0
				mediumHit=0:mediumEscaped=0
				largeHit=0:largeEscaped=0
			endif	
				
	endif	
	
	if player.ammoLeft<=0 
		removeSprites()
		gameover()
		player.hit=0
		SetSpriteColor(player.ID,255,255,255,255)
		SetSpriteColor(player.ID2,255,255,255,255)
		createEnemies(planeRightImg,planeLeftImg)
		player.ammoLeft=1000
		bombersHit=0:bombersEscaped=0
		smallHit=0:smallEscaped=0
		mediumHit=0:mediumEscaped=0
		largeHit=0:largeEscaped=0	
	endif	
	
	moveEnemies(planeRightImg,planeLeftImg)
//////////////////////////////////////////////////////////////////////////////////	
//check for player bullets and enemy collisions	
	for num=bullets.length to 0 step -1
		for num2=enemies.length to 0 step -1 
			//print(GetSpriteCollision(bullets[num].ID,enemies[num2].ID)) 
			hit=0
			if enemies[num2].hit=0 then hit=checkContact(bullets[num].ID,enemies[num2].ID) 
			if hit=1 and enemies[num2].hit=0
				Select enemies[num2].enemyType
					case "Bomber":
						inc bombersHit
					endcase	
					Case "Small":
						inc smallHit
					endcase
					case "Medium":
						inc mediumHit
					endcase
					case "Large":
						inc largeHit
					endcase
				endselect	
				//DeleteSprite(bullets[num].ID)
				//bullets.remove(num)
				//SetSpriteVisible(enemies[num2].ID,0)
				enemies[num2].hit=1
			endif		
		next num2	
		//endif	
	next num
//////////////////////////////////////////////////////////////////////////////////	
//check if plane has crashed into player
	for num=enemies.length to 0 step -1 
		if checkContact(enemies[num].ID,player.ID) 
			if player.hit=0 then player.time=timer() //set the explosion timer
			player.hit=1
		endif	
		if checkContact(enemies[num].ID,player.ID2) 
			if player.hit=0 then player.time=timer() //set the explosion timer
			player.hit=1
		endif		
	next	
//check if shot yourself

	for num=bullets.length to 0 step -1 
		if checkContact(bullets[num].ID,player.ID) 
			if player.hit=0 then player.time=timer() //set the explosion timer
			player.hit=1
		endif	
		if checkContact(bullets[num].ID,player.ID2) 
			if player.hit=0 then player.time=timer() //set the explosion timer
			player.hit=1
		endif		
	next
	
//check if been shot by bombers
	for num=enemyBombs.length to 0 step -1 
		if checkContact(enemyBombs[num].ID,player.ID) 
			if player.hit=0 then player.time=timer() //set the explosion timer
			player.hit=1
		endif	
		if checkContact(enemyBombs[num].ID,player.ID2) 
			if player.hit=0 then player.time=timer() //set the explosion timer
			player.hit=1
		endif		
	next
	
//////////////////////////////////////////////////////////////////////////////////	

//////////////////////////////////////////////////////////////////////////////////	
//  Clean up bombs and bullets	
	for num = enemyBombs.length to 0 step-1
		if enemyBombs[num].time#+6<timer() 
			DeleteSprite(enemyBombs[num].ID)
			enemyBombs.remove(num)
		endif	
	next num	
    
    for num = bullets.length to 0 step-1
		if bullets[num].time#+6<timer() 
			DeleteSprite(bullets[num].ID)
			bullets.remove(num)
		endif
	next num	
//////////////////////////////////////////////////////////////////////////////////	
    Print("BlitzKrieg")
	Print("========") 
	Print("")
	Print("")
	Print("")
	Print("")
	Print("")
	Print("")
	Print("")
	Print("")
	Print("")
	Print("")
	Print("")
	Print("")
    Print("                    Hit Escape") 
    Print("Bombers     "+str(bombersHit)+"   "+str(bombersEscaped))
    Print("Small           "+str(smallHit)+"   "+str(smallEscaped))
    Print("Medium      "+str(mediumHit)+"   "+str(mediumEscaped))
    Print("Large          "+str(largeHit)+"   "+str(largeEscaped))
    Print("Ammo left  "+str(player.ammoLeft))
    Print( ScreenFPS() )
    StepPhysics(1)
    Sync()
loop

function shoot(x# as float,y# as float,angle# as float, force# as float)
	local bullet as _bullet
	bullet.ID=CreateSprite(0)
	SetSpritePosition(bullet.ID,x#,y#)
	SetSpriteColor(bullet.ID,0,200,0,255)
	SetSpriteSize(bullet.ID,5,5)
	SetSpriteShape(bullet.ID,2)
	SetSpritePhysicsOn(bullet.ID, 2) //2=dynamic
	//SetSpriteAngle(bullet.ID, angle#) 
	SetSpritePhysicsIsBullet(bullet.ID, 1)
	SetSpritePhysicsMass(bullet.ID,10) 
	vx#=cos(angle#)*force#
	vy#=sin(angle#)*force#
	SetSpritePhysicsImpulse(bullet.ID,x#,y#, -vx#, -vy# )
	bullet.time#=timer()
	bullets.insert(bullet)		
endfunction

function dropBomb(x# as float,y# as float,direction as integer,force# as float)
	local bomb as _bullet
	local angle# as float
	if direction=-1
		angle#=275
	else	
		angle#=180
	endif
	bomb.ID=CreateSprite(0)
	SetSpritePosition(bomb.ID,x#,y#)
	SetSpriteColor(bomb.ID,200,0,0,255)
	SetSpriteSize(bomb.ID,5,5)
	SetSpriteShape(bomb.ID,2)
	SetSpritePhysicsOn(bomb.ID, 2) //2=dynamic
	SetSpritePhysicsIsBullet(bomb.ID, 1)
	SetSpritePhysicsMass(bomb.ID,10) 
	vx#=cos(angle#)*force#
	vy#=sin(angle#)*force#
	SetSpritePhysicsImpulse(bomb.ID,x#,y#,vx#,-vy#)
	bomb.time#=timer()
	enemyBombs.insert(bomb)
endfunction	

	
function makeNewAngle(ang#,add#)
    // add the new bit
    ang# = ang# + add#
 
    // check value
    if ang# >= 0.0 and ang# <= 360.0 then exitfunction ang#
 
    // adjust the value
    while ang# < 0.0
        ang# = ang# + 360.0
    endwhile
    while ang# > 360.0
        ang# = ang# - 360.0
    endwhile
endfunction ang#

function createBaseGun()
	local data as integer [215] = [
	       0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,
	       0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,
	       0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,
	       0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,
	       0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
	       0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
	       0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
	       0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
	       0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0]
	       
	dataCount=0
	 ClearScreen()
	 for y = 0 to 8
		for x = 0 to 23
			if data[datacount]=1 then DrawLine(x,y,x,y,255,255,255)
			inc dataCount,1
		next x
	next y	
	
	render()
    img = getImage(0,0,24,10)
    SetImageTransparentColor(img,0,0,0)
endfunction img

function createPlaneRightFace()
	local data as integer [263] =[
	       0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,
	       0,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,
	       0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,
	       0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,
	       0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
	       0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
	       0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
	       0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,
	       0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,
	       0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,
	       0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0]
	 dataCount=0
	 ClearScreen()
	 for y = 0 to 10
		for x = 0 to 23
			if data[datacount]=1 then DrawLine(x,y,x,y,255,255,255)
			inc dataCount,1
		next x
	next y	
	
	render()
    img = getImage(0,0,24,12)
    SetImageTransparentColor(img,0,0,0)
endfunction	img

function createPlaneLeftFace()
	local data as integer [263] =[
	       0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
	       0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,
	       0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,
	       0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,
	       0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
	       1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
	       1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
	       0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
	       0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
	       0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
	       0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
	 dataCount=0
	 ClearScreen()
	 for y = 0 to 10
		for x = 0 to 23
			if data[datacount]=1 then DrawLine(x,y,x,y,255,255,255)
			inc dataCount,1
		next x
	next y	
	
	render()
    img = getImage(0,0,24,12)
    SetImageTransparentColor(img,0,0,0)
endfunction	img

function createEnemy(enemy ref  as _enemy,faceRight as integer,faceleft as integer)
	select enemy.enemyType
		case "Bomber":
			ran=random(1,2)
			if ran= 1 
				enemy.ID=createSprite(faceLeft)
				enemy.direction=-1.0
				SetSpritePosition(enemy.ID,GetDeviceWidth()+random(1,GetDeviceWidth()/2),random(0,GetDeviceHeight()-300))		
			else
				enemy.ID=createSprite(faceRight)
				enemy.direction=1.0			
				SetSpritePosition(enemy.ID,-(random(1,GetDeviceWidth()/2)),random(0,GetDeviceHeight()-300))
			endif	
			enemy.hit=0
			enemy.speed=5/120.0
			enemy.enemyType="Bomber"
			//SetSpritePosition(enemy.ID,random(0,GetDeviceWidth()),random(0,GetDeviceHeight()-200))
			SetSpriteShape(enemy.ID,3) 
			SetSpritePhysicsOn(enemy.ID,2)
			SetSpritePhysicsIsSensor(enemy.ID,1) 
			SetSpritePhysicsMass(enemy.ID,1000)
			SetSpritePhysicsRestitution(enemy.ID,0)
			SetSpritePhysicsCanRotate(enemy.ID,0) 
			SetSpritePhysicsImpulse(enemy.ID,GetSpriteXByOffset(enemy.ID),GetSpriteYByOffset(enemy.ID),enemy.direction*enemy.speed,0)
			SetSpriteScale(enemy.ID,3,3)
			SetSpriteColor(enemy.ID,150,150,150,255)
			//enemies.insert(enemy)
	    endcase
	
	    case "Small":
			ran=random(1,2)
			if ran= 1 
				enemy.ID=createSprite(faceLeft)
				enemy.direction=-1.0
				SetSpritePosition(enemy.ID,GetDeviceWidth()+random(1,GetDeviceWidth()/2),random(0,GetDeviceHeight()-300))		
			else
				enemy.ID=createSprite(faceRight)
				enemy.direction=1.0			
				SetSpritePosition(enemy.ID,-(random(1,GetDeviceWidth()/2)),random(0,GetDeviceHeight()-300))
			endif
			enemy.hit=0
			enemy.speed=random(3,5)/120.0
			enemy.enemyType="Small"
			//SetSpritePosition(enemy.ID,random(0,GetDeviceWidth()),random(0,GetDeviceHeight()-200))
			SetSpriteShape(enemy.ID,2) 
			SetSpritePhysicsOn(enemy.ID,2)
			SetSpritePhysicsIsSensor(enemy.ID,1) 
			SetSpritePhysicsMass(enemy.ID,100)
			SetSpritePhysicsRestitution(enemy.ID,0)
			SetSpritePhysicsCanRotate(enemy.ID,0) 
			SetSpritePhysicsImpulse(enemy.ID,GetSpriteXByOffset(enemy.ID),GetSpriteYByOffset(enemy.ID),enemy.direction*enemy.speed,0)
			SetSpriteScale(enemy.ID,2,2)
			//enemies.insert(enemy)
	    endcase
	
	    case "Medium":
			ran=random(1,2)
			if ran= 1 
				enemy.ID=createSprite(faceLeft)
				enemy.direction=-1.0
				SetSpritePosition(enemy.ID,GetDeviceWidth()+random(1,GetDeviceWidth()/2),random(0,GetDeviceHeight()-300))		
			else
				enemy.ID=createSprite(faceRight)
				enemy.direction=1.0			
				SetSpritePosition(enemy.ID,-(random(1,GetDeviceWidth()/2)),random(0,GetDeviceHeight()-300))
			endif
			enemy.hit=0
			enemy.speed=random(3,5)/120.0
			enemy.enemyType="Medium"
			//SetSpritePosition(enemy.ID,random(0,GetDeviceWidth()),random(0,GetDeviceHeight()-200))
			SetSpriteShape(enemy.ID,2) 
			SetSpritePhysicsOn(enemy.ID,2)
			SetSpritePhysicsMass(enemy.ID,1000)
			SetSpritePhysicsRestitution(enemy.ID,0)
			SetSpritePhysicsCanRotate(enemy.ID,0) 
			SetSpritePhysicsImpulse(enemy.ID,GetSpriteXByOffset(enemy.ID),GetSpriteYByOffset(enemy.ID),enemy.direction*enemy.speed,0)
			SetSpriteScale(enemy.ID,3,3)
			//enemies.insert(enemy)
		endcase
	
	    case "Large":
			ran=random(1,2)
			if ran= 1 
				enemy.ID=createSprite(faceLeft)
				enemy.direction=-1.0
				SetSpritePosition(enemy.ID,GetDeviceWidth()+random(1,GetDeviceWidth()/2),random(0,GetDeviceHeight()-300))		
			else
				enemy.ID=createSprite(faceRight)
				enemy.direction=1.0			
				SetSpritePosition(enemy.ID,-(random(1,GetDeviceWidth()/2)),random(0,GetDeviceHeight()-300))
			endif
			enemy.speed=random(3,5)/120.0
			enemy.enemyType="Large"
			//SetSpritePosition(enemy.ID,random(0,GetDeviceWidth()),random(0,GetDeviceHeight()-200))
			SetSpriteShape(enemy.ID,3) 
			SetSpritePhysicsOn(enemy.ID,2)
			SetSpritePhysicsMass(enemy.ID,1000)
			SetSpritePhysicsRestitution(enemy.ID,0)
			SetSpritePhysicsCanRotate(enemy.ID,0) 
			SetSpritePhysicsImpulse(enemy.ID,GetSpriteXByOffset(enemy.ID),GetSpriteYByOffset(enemy.ID),enemy.direction*enemy.speed,0)
			SetSpriteScale(enemy.ID,4,4)
			//enemies.insert(enemy)
		endcase
endselect		
endfunction

function createEnemies(faceRight as integer,faceLeft as integer)
	enemy as _enemy
	for num = 1 to 5
		enemy.enemyType="Bomber"
		createEnemy(enemy,faceRight,faceLeft)
		enemies.insert(enemy)
	next num
	
	for num = 1 to 5
		enemy.enemyType="Small"
		createEnemy(enemy,faceRight,faceLeft)
		enemies.insert(enemy)
	next num
	
	for num = 1 to 5
		enemy.enemyType="Medium"
		createEnemy(enemy,faceRight,faceLeft)
		enemies.insert(enemy)
	next num
	
	for num = 1 to 5
		enemy.enemyType="Large"
		createEnemy(enemy,faceRight,faceLeft)
		enemies.insert(enemy)
	next num
endfunction

function moveEnemies(faceRight as integer,faceLeft as integer)
	for num=0 to enemies.length
		SetSpritePhysicsImpulse(enemies[num].ID,GetSpriteXByOffset(enemies[num].ID),GetSpriteYByOffset(enemies[num].ID),enemies[num].direction*enemies[num].speed,-.025)
		escapedCount=0
		if GetSpriteX(enemies[num].ID)<-(GetDeviceWidth()/2)  
			SetSpritePhysicsDelete(enemies[num].ID) 
			DeleteSprite(enemies[num].id)
			if enemies[num].hit=0 then escapedCount=1
			createEnemy(enemies[num],faceRight,faceLeft)
		endif	
		if GetSpriteX(enemies[num].ID)>(GetDeviceWidth()/2)+GetDeviceWidth() 
			SetSpritePhysicsDelete(enemies[num].ID) 
			DeleteSprite(enemies[num].id)
			if enemies[num].hit=0 then 	escapedCount=1
			createEnemy(enemies[num],faceRight,faceLeft)
		endif	
		if enemies[num].enemyType="Bomber" and enemies[num].time#+0.75<timer() and enemies[num].hit=0
			dropBomb(GetSpriteXByOffset(enemies[num].ID),GetSpriteYByOffset(enemies[num].ID),enemies[num].direction,85)
			enemies[num].time#=timer()
		endif		
		if escapedCount=1
			Select enemies[num].enemyType
				case "Bomber":
					inc bombersEscaped	
				endcase	
				Case "Small":
					inc smallEscaped
				endcase
				case "Medium":
					inc mediumEscaped
				endcase
				case "Large":
					inc largeEscaped
				endcase
			endselect
		endif
		if enemies[num].hit=1
			alpha=GetSpriteColorAlpha(enemies[num].ID)
			blue=GetSpriteColorBlue(enemies[num].ID)
			green=GetSpriteColorGreen(enemies[num].ID)
			if alpha>15 then SetSpriteColorAlpha(enemies[num].ID,alpha-10)
			if blue>15 then SetSpriteColorBlue(enemies[num].ID,blue-10)
			if green>15 then SetSpriteColorGreen(enemies[num].ID,green-10)
		endif		
	next num	
endfunction	

	

function checkContact(spr as integer,spr2 as integer)
	sprHit as integer
	if GetSpriteFirstContact(spr)
		sprHit=GetSpriteContactSpriteID2()
		if spr2=sprHit then exitfunction 1
		while GetSpriteNextContact()
			sprHit=GetSpriteContactSpriteID2()
			if spr2=sprHit then exitfunction 1
		endwhile
		//text$=str(sprHit)+"    "+str(spr2)
		//print (text$)	
	endif	
endfunction 0

function removeSprites()

	//remove all player bullets
	for num=bullets.length to 0 step -1
		deleteSprite(bullets[num].ID)
		bullets.remove(num)
	next num	

	//remove all enemies
	for num=enemies.length to 0 step -1
		deleteSprite(enemies[num].ID)
		enemies.remove(num)
	next num	
   //remove all enemy bombs
	for num=enemyBombs.length to 0 step -1
		deleteSprite(enemyBombs[num].ID)
		enemyBombs.remove(num)
	next num	
  
endfunction	

function gameover()
	repeat
		Print("BlitzKrieg")
		Print("========") 
		Print("")
		Print("")
		Print("")
		Print("")
		Print("")
		Print("")
		Print("")
		Print("")
		Print("                                                                 GAME OVER")
		Print("")
		Print("")
		Print("")
		Print("                    Hit Escape") 
    	Print("Bombers     "+str(bombersHit)+"   "+str(bombersEscaped))
		Print("Small           "+str(smallHit)+"   "+str(smallEscaped))
		Print("Medium      "+str(mediumHit)+"   "+str(mediumEscaped))
		Print("Large          "+str(largeHit)+"   "+str(largeEscaped))
		Print("Ammo left  "+str(player.ammoLeft))
		Print("")
		Print("                                                  Press space key to play again")
		sync()
	until GetRawKeyPressed(KEY_SPACE)	
	removeSprites()	
endfunction	


Features
All media created with code
Uses 2D Physics

KEYS
Left Arrow =Rotate Left
Right Arrow=Rotate Right
Space Key =Shoot

For those interested puzzler has started a thread for finished games with source at the below link

https://forum.thegamecreators.com/thread/223468
Posted: 22nd Jan 2019 0:51
Asteroids
+ Code Snippet
SetErrorMode(2)

#constant	KEY_SPACE        32
#constant	KEY_LEFT         37
#constant   KEY_UP           38
#constant	KEY_RIGHT        39
#constant   KEY_DOWN         40

type _asteroid
	ID as integer
	x as float
	y as float
	size as float
	xDir as float
	yDir as float
endtype	

type _bullet
	ID as integer
	time# as float //time to keep the bullet alive
endtype

type _player
	ID as integer
	hit as integer
	imgID as integer
	lives as integer
	score as integer
endtype		

// set display properties
SetVirtualResolution( 1024, 768 ) // doesn't have to match the window
SetOrientationAllowed( 1, 1, 1, 1 ) // allow both portrait and landscape on mobile devices
SetSyncRate( 30, 0 ) // 30fps instead of 60 to save battery
SetScissor( 0,0,0,0 ) // use the maximum available screen space, no black borders
UseNewDefaultFonts( 1 ) // since version 2.0.22 we can use nicer default fonts
asteroids as _asteroid[]
bullets as _bullet[]
player as _player
player.imgID=createShipImg()
player.ID=CreateSprite(player.imgID)
player.lives=4
SetSpriteScale(player.ID,5,5)
SetSpritePositionByOffset(player.ID,500,350)
SetSpriteTransparency(player.ID,1)
asteroidImage=createAsteroidImg()
createAsteroids(player.ID,asteroids,asteroidImage)
thrust#=0
repeat
	for num=0 to asteroids.length
		moveAsteroid(asteroids[num])
	next num	
	if GetRawKeyState(KEY_LEFT)
		SetSpriteAngle(player.ID,GetSpriteAngle(player.ID)-2)
	endif	
	
	if GetRawKeyState(KEY_RIGHT)
		SetSpriteAngle(player.ID,GetSpriteAngle(player.ID)+2)
	endif
	
	if GetRawKeyState(KEY_UP)
		thrust#=thrust#+1.5
		if thrust#>5.0 then thrust#=5.0
	endif
	
	if GetRawKeyState(KEY_DOWN)
		thrust#=thrust#-0.250
		if thrust#<0 then thrust#=0
	endif
	
	
	angle# = GetSpriteAngle(player.ID) - 90 //: If angle# < 360 Then angle# = angle# + 360
	//Calculate x / velocity based on sprite angle         
	xvel# = (Cos( angle# ) * (thrust#) )
	yvel# = (Sin( angle# ) * (thrust#) ) 
	//move sprite according to its angle and apply a gravity to the y axis	
	SetSpritePositionByOffset(player.ID, GetSpriteXByOffset(player.ID)+ xvel# ,(GetSpriteYByOffset(player.ID) + yvel# ))
	If GetSpriteXByOffset(player.ID)<-10 then SetSpritePositionByOffset(player.ID,GetWindowWidth()+8,GetSpriteYByOffset(player.ID))
	If GetSpriteXByOffset(player.ID)>GetWindowWidth()+10 then SetSpritePositionByOffset(player.ID,-8,GetSpriteYByOffset(player.ID))
	If GetSpriteYByOffset(player.ID)<-10 then SetSpritePositionByOffset(player.ID,GetSpriteXByOffset(player.ID),GetWindowHeight())
	If GetSpriteYByOffset(player.ID)>GetWindowHeight()+10 then SetSpritePositionByOffset(player.ID,GetSpriteXByOffset(player.ID),-8)

	
	if GetRawKeyReleased(KEY_SPACE)
		shoot(player.ID,bullets)
	endif	
	moveBullets(player,bullets,asteroids,asteroidImage)
	checkPlayerCollided(player,asteroids)
	if player.hit=1
		thrust#=0
		alpha=GetSpriteColorAlpha(player.ID)
		blue=GetSpriteColorBlue(player.ID)
		green=GetSpriteColorGreen(player.ID)
		if alpha>15 then SetSpriteColorAlpha(player.ID,alpha-5)
		if blue>15 then SetSpriteColorBlue(player.ID,blue-5)
		if green>15 then SetSpriteColorGreen(player.ID,green-5)
		if alpha<=15 and blue<=15 and green <=15 
			SetSpritePositionByOffset(player.ID,500,350)
			if checkPlayerCollided(player,asteroids)=0 //make sure player isnt going to restart ontop of an asteroid
				SetSpriteColor(player.ID,255,255,255,255)
				player.hit=0
			endif			
		endif	
	endif		
	
	
	thrust#=thrust#-.025:if thrust#<0 then thrust#=0
	Print("Asteroids")
	Print("========")
	print ("Score =" +str(player.score))
	print ("Lives  =" +str(player.lives))
	print(ScreenFPS())
	sync()
until player.lives=0
gameover(player)
end

function createShipImg()
	local data as integer [119] = [
	       0,0,0,0,0,0,0,0,0,0,0,0,
	       0,0,0,0,0,0,1,0,0,0,0,0,
	       0,0,0,0,0,1,1,1,0,0,0,0,
	       0,0,0,0,1,1,1,1,1,0,0,0,
	       0,0,0,1,1,1,1,1,1,1,0,0,
	       0,0,1,1,1,1,1,1,1,1,1,0,
	       0,1,1,1,0,0,0,0,0,1,1,1,
	       0,1,0,0,0,0,0,0,0,0,0,1,
	       0,0,0,0,0,0,0,0,0,0,0,0,
	       0,0,0,0,0,0,0,0,0,0,0,0]
	       
	dataCount=0
	ClearScreen()
	for y = 0 to 9
		for x = 0 to 11
			if data[datacount]=1 then DrawLine(x,y,x,y,255,255,255)
			inc dataCount,1
		next x
	next y	
	
	render()
    img = getImage(0,0,12,12)
    SetImageTransparentColor(img,0,0,0)
endfunction img

function createAsteroidImg()
	local data as integer [144] = [
	       0,0,0,0,0,0,0,0,0,0,0,0,
	       0,0,0,0,1,1,1,1,0,0,0,0,
	       0,0,1,1,0,0,0,0,1,1,0,0,
	       0,0,1,0,0,0,0,0,0,1,0,0,
	       0,1,0,0,0,0,0,0,0,0,1,0,
	       0,1,0,0,0,0,0,0,0,0,1,0,
	       0,1,0,0,0,0,0,0,0,0,1,0,
	       0,1,0,0,0,0,0,0,0,0,1,0,
	       0,0,1,0,0,0,0,0,0,1,0,0,
	       0,0,1,1,0,0,0,0,1,1,0,0,
	       0,0,0,0,1,1,1,1,0,0,0,0,
	       0,0,0,0,0,0,0,0,0,0,0,0]
	       
	dataCount=0
	ClearScreen()
	for y = 0 to 11
		for x = 0 to 11
			if data[datacount]=1 then DrawLine(x,y,x,y,255,255,255)
			inc dataCount,1
		next x
	next y	
	
	render()
    img = getImage(0,0,12,12)
    SetImageTransparentColor(img,0,0,0)
endfunction img

function createAsteroids(shipSpr as integer,asteroids ref as _asteroid[],asteroidImage as integer)
	asteroid as _asteroid
	for num= 1 to 10 //create 10 asteroids
		asteroid.size=100:asteroid.xDir=0:asteroid.yDir=0
		asteroid.x=random(0,GetWindowWidth())
		asteroid.y=random(0,GetWindowHeight())
		while asteroid.xDir=0 and asteroid.yDir=0 //make sure the asteroid moves
			asteroid.xDir=Random(0,4)-2
			asteroid.yDir=Random(0,4)-2
		endwhile
		asteroid.ID=createSprite(asteroidImage)
		SetSpriteTransparency(asteroid.ID,1)
		SetSpriteSize(asteroid.ID,asteroid.size,asteroid.size)
		SetSpritePositionByOffset(asteroid.ID,asteroid.x,asteroid.y)
		while getSpriteCollision(shipSpr,asteroid.ID) //keep trying to place an asteroid until it doiesnt collide with ship
			asteroid.x=random(0,GetWindowWidth())
			asteroid.y=random(0,GetWindowHeight())
			SetSpritePositionByOffset(asteroid.ID,asteroid.x,asteroid.y)
		endwhile
		asteroids.insert(asteroid)
	next num	
endfunction	

function brakeAsteroidUp (currentAsteroid ref as _asteroid, asteroids ref as _asteroid[],asteroidImage as integer)
rem current asteroid has been shot break up into 4 smaller pieces
	asteroid as _asteroid
	size=currentAsteroid.size
	x#=currentAsteroid.x
	y#=currentAsteroid.y
	DeleteSprite(currentAsteroid.ID)
						
	if size>25 			
		asteroid.ID=createSprite(asteroidImage)
		asteroid.size=size/2
		asteroid.x=x#-(size/4)
		asteroid.y=y#-(size/4)
		asteroid.xDir=0:asteroid.yDir=0
			while asteroid.xDir=0 and asteroid.yDir=0 //make sure the asteroid moves
			asteroid.xDir=Random(0,4)-2
			asteroid.yDir=Random(0,4)-2
		endwhile
		SetSpriteTransparency(asteroid.ID,1)
		SetSpriteSize(asteroid.ID,asteroid.size,asteroid.size)
		SetSpritePositionByOffset(asteroid.ID,asteroid.x,asteroid.y)
		asteroids.insert(asteroid)
	endif
			
	if size>25
		asteroid.ID=createSprite(asteroidImage)
		asteroid.size=size/2
		asteroid.x=x#+(size/4)
		asteroid.y=y#-(size/4)
		asteroid.xDir=0:asteroid.yDir=0
		while asteroid.xDir=0 and asteroid.yDir=0 //make sure the asteroid moves
			asteroid.xDir=Random(0,4)-2
			asteroid.yDir=Random(0,4)-2
		endwhile
		SetSpriteTransparency(asteroid.ID,1)
		SetSpriteSize(asteroid.ID,asteroid.size,asteroid.size)
		SetSpritePositionByOffset(asteroid.ID,asteroid.x,asteroid.y)
		asteroids.insert(asteroid)
	endif
			
	if size>25
		asteroid.ID=createSprite(asteroidImage)
		asteroid.size=size/2
		asteroid.x=x#+(size/4)
		asteroid.y=y#+(size/4)
		asteroid.xDir=0:asteroid.yDir=0
		while asteroid.xDir=0 and asteroid.yDir=0 //make sure the asteroid moves
			asteroid.xDir=Random(0,4)-2
			asteroid.yDir=Random(0,4)-2
		endwhile
		SetSpriteTransparency(asteroid.ID,1)
		SetSpriteSize(asteroid.ID,asteroid.size,asteroid.size)
		SetSpritePositionByOffset(asteroid.ID,asteroid.x,asteroid.y)
		asteroids.insert(asteroid)
	endif
			
	if size>25
		asteroid.ID=createSprite(asteroidImage)
		asteroid.size=size/2
		asteroid.x=x#-(size/4)
		asteroid.y=y#+(size/4)
		asteroid.xDir=0:asteroid.yDir=0
		while asteroid.xDir=0 and asteroid.yDir=0 //make sure the asteroid moves
			asteroid.xDir=Random(0,4)-2
			asteroid.yDir=Random(0,4)-2
		endwhile
		SetSpriteTransparency(asteroid.ID,1)
		SetSpriteSize(asteroid.ID,asteroid.size,asteroid.size)
		SetSpritePositionByOffset(asteroid.ID,asteroid.x,asteroid.y)
		asteroids.insert(asteroid)
	endif			

endfunction	

function moveAsteroid(asteroid ref as _asteroid)
	asteroid.x=asteroid.x+asteroid.xDir
	asteroid.y=asteroid.y+asteroid.yDir
	SetSpritePositionByOffset(asteroid.ID,asteroid.x,asteroid.y)
	if asteroid.x <-100
		asteroid.x=GetWindowWidth()+99
		asteroid.xDir=-random(1,2)			
	endif
	if asteroid.x > GetWindowWidth()+100
		asteroid.x=-99
		asteroid.xDir=random(1,2)
	endif
	if asteroid.y <-100
		asteroid.y=GetWindowHeight()+99
		asteroid.yDir=-random(1,2)			
	endif
	if asteroid.y > GetWindowWidth()+100
		asteroid.y=-99
		asteroid.yDir=random(1,2)
	endif

endfunction	

function shoot(shipSpr as integer,bullets ref as _bullet[])
	local bullet as _bullet
	bullet.ID=CreateSprite(0)
	SetSpritePosition(bullet.ID,GetSpriteXByOffset(shipSpr),GetSpriteYByOffset(shipSpr))
	SetSpriteColor(bullet.ID,200,200,200,255)
	SetSpriteSize(bullet.ID,5,5)
	SetSpriteAngle(bullet.ID,getSpriteAngle(shipSpr))
	bullet.time#=timer()
	bullets.insert(bullet)
endfunction

function moveBullets(player ref as _player,bullets ref as _bullet[],asteroids ref as _asteroid[],asteroidImage as integer)
	thrust#=6
	for num = bullets.length to 0 step -1
		angle# = GetSpriteAngle(bullets[num].ID) - 90 //: If angle# < 360 Then angle# = angle# + 360
		//Calculate x / velocity based on sprite angle         
		xvel# = (Cos( angle# ) * (thrust#) )
		yvel# = (Sin( angle# ) * (thrust#) ) 
		//move sprite according to its angle 	
		SetSpritePositionByOffset(bullets[num].ID, GetSpriteXByOffset(bullets[num].ID)+ xvel# ,(GetSpriteYByOffset(bullets[num].ID) + yvel# ))
		for num2 = asteroids.length to 0 step -1
			if GetSpriteCollision(bullets[num].ID,asteroids[num2].ID )
				player.score=player.score+asteroids[num2].size
				brakeAsteroidUp(asteroids[num2],asteroids,asteroidImage)
				asteroids.remove(num2) //remove the asteroid that was shot because the sprite nolonger exists	
			elseif bullets[num].time#+5.0<timer() 
				DeleteSprite(bullets[num].ID)
				bullets.remove(num):exit
			endif
		next num2		
	next num	
endfunction

function checkPlayerCollided(player ref as _player,asteroids ref as _asteroid[])
	for num = asteroids.length to 0 step-1
		if GetSpriteCollision(player.ID,asteroids[num].ID) 
			if player.hit=0 then dec player.lives
			player.hit=1
			exitfunction 1
		endif
	next num		
endfunction	0

function gameover(player ref as _player)
	repeat
		Print("GAME OVER")
		Print("==========") 
		Print("Score ="+str(player.score))
		sync()
	until GetRawKeyPressed(KEY_SPACE)	
endfunction	

Features
All media created with code

KEYS
Left Arrow =Rotate Left
Right Arrow=Rotate Right
Up Arrow =move forward
Down Arrow = Brake
Space Key =Shoot
Posted: 22nd Jan 2019 1:02
@fubarpk That is nice !! It moves smooth as a fish in water ...lol I had to remove the (GetWindowWidth/height ) perhaps no decared
Posted: 22nd Jan 2019 1:23
Thanks
GetWindowWidth/height

that's an update and an alternative to getdevicewidth() and getdeviceheight()
Posted: 22nd Jan 2019 4:52
Space Invaders Might serve as a template for someone who wants to make a better version
+ Code Snippet
SetErrorMode(2)

#constant	KEY_SPACE        32
#constant	KEY_LEFT         37
#constant   KEY_UP           38
#constant	KEY_RIGHT        39
#constant   KEY_DOWN         40

type _bullet
	ID as integer
	time# as float //time to keep the bullet alive
endtype

type _barricade
	ID as integer
endtype 

type _player
	ID as integer
	hit as integer
	imgID as integer
	lives as integer
	score as integer
endtype		

type _invader
	ID as integer
	hit as integer
	scoreValue as integer
endtype	

// set display properties
SetVirtualResolution( 1024, 768 ) // doesn't have to match the window
SetOrientationAllowed( 1, 1, 1, 1 ) // allow both portrait and landscape on mobile devices
SetSyncRate( 30, 0 ) // 30fps instead of 60 to save battery
SetScissor( 0,0,0,0 ) // use the maximum available screen space, no black borders
UseNewDefaultFonts( 1 ) // since version 2.0.22 we can use nicer default fonts
player as _player
do
	playGame(player)
	if player.lives<1
		repeat
			Print("GameOver")
			Print("Press Space to play again")
			sync()
		until GetRawKeyPressed(KEY_SPACE)
		player.lives=4	
	endif			

loop

function playGame(player ref as _player)
DeleteAllSprites()
DeleteAllImages()
	
player.imgID=createShipImg()
player.ID=CreateSprite(player.imgID)
player.lives=4
SetSpriteScale(player.ID,5,5)
SetSpritePositionByOffset(player.ID,500,740)
SetSpriteTransparency(player.ID,1)

barricades as _barricade[3]
barricadeImg=createBarricadeImg()
createBarricades(barricades,barricadeImg)

invaders as _invader[]
invaderImage1=createInvader1Img()
invaderImage2=createInvader2Img()
invaderImage3=createInvader3Img()
createInvaders(invaders,invaderImage1,invaderImage2,invaderImage3)
direction=-1

invaderBombs as _bullet[]
bullets as _bullet[]

repeat
	if GetRawKeyState(KEY_LEFT)
		SetSpritePositionByOffset(player.ID,GetSpriteXByOffset(player.ID)-4,GetSpriteYByOffset(player.ID))
		if GetSpriteXByOffset(player.ID)<-10 then SetSpritePositionByOffset(player.ID,GetWindowWidth()+9,GetSpriteYByOffset(player.ID)) 
	endif
	if GetRawKeyState(KEY_RIGHT)
		SetSpritePositionByOffset(player.ID,GetSpriteXByOffset(player.ID)+4,GetSpriteYByOffset(player.ID))
		if GetSpriteXByOffset(player.ID)>GetWindowWidth()+10 then SetSpritePositionByOffset(player.ID,-9,GetSpriteYByOffset(player.ID)) 
	endif
	if GetRawKeyPressed(KEY_SPACE)
		shoot(player.ID,bullets)
	endif	
	moveBullets(player,bullets,invaders)
	direction=moveInvaders(invaders,invaderBombs,direction)
	if direction=99 then exitFunction
	moveBombs(player,invaderBombs,invaders)
	Print("Space Invaders")
	Print("Score="+str(player.score)+"     Lives="+str(player.lives))
	sync()
until player.lives<1 or invaders.length=0

endfunction

function createShipImg()
	local data as integer [95] = [
	       0,0,0,0,0,0,0,0,0,0,0,0,
	       0,0,0,0,0,1,1,0,0,0,0,0,
	       0,0,0,0,1,1,1,1,0,0,0,0,
	       0,0,1,1,1,1,1,1,1,1,0,0,
	       0,1,1,1,1,1,1,1,1,1,1,0,
	       0,1,1,1,1,1,1,1,1,1,1,0,
	       0,1,1,1,1,1,1,1,1,1,1,0,
	       0,0,0,0,0,0,0,0,0,0,0,0]
	       
	dataCount=0
	ClearScreen()
	for y = 0 to 7
		for x = 0 to 11
			if data[datacount]=1 then DrawLine(x,y,x,y,255,255,255)
			inc dataCount,1
		next x
	next y	
	
	render()
    img = getImage(0,0,12,8)
    SetImageTransparentColor(img,0,0,0)
endfunction img

function createBarricadeImg()
	local data as integer [119] = [
	       0,0,0,0,0,0,0,0,0,0,0,0,
	       0,0,0,1,1,1,1,1,1,0,0,0,
	       0,0,1,1,1,1,1,1,1,1,0,0,
	       0,1,1,1,1,1,1,1,1,1,1,0,
	       0,1,1,1,1,1,1,1,1,1,1,0,
	       0,1,1,1,1,1,1,1,1,1,1,0,
	       0,1,1,1,1,1,1,1,1,1,1,0,
	       0,1,1,1,1,1,1,1,1,1,1,0,
	       0,1,1,1,0,0,0,0,1,1,1,0,
	       0,0,0,0,0,0,0,0,0,0,0,0]
	       
	dataCount=0
	ClearScreen()
	for y = 0 to 9
		for x = 0 to 11
			if data[datacount]=1 then DrawLine(x,y,x,y,255,255,255)
			inc dataCount,1
		next x
	next y	
	
	render()
    img = getImage(0,0,12,12)
    SetImageTransparentColor(img,0,0,0)
endfunction img

function createBarricades(barricades ref as _barricade[],barricadeImg as integer)
	for num = 0 to 3
		barricades[num].ID=createSprite(barricadeImg)
		SetSpriteColor(barricades[num].ID,0,255,0,255)
		SetSpriteScale(barricades[num].ID,10,10)
		SetSpritePositionByOffset(barricades[num].ID,num*250+125,620)
	next num	
endfunction	

function createInvader1Img()
	local data as integer [95] = [
	       0,0,0,0,0,0,0,0,0,0,0,0,
	       0,0,0,0,0,1,1,0,0,0,0,0,
	       0,0,0,1,1,1,1,1,1,0,0,0,
	       0,0,0,1,0,1,1,0,1,0,0,0,
	       0,0,0,1,1,1,1,1,1,0,0,0,
	       0,0,1,1,1,1,1,1,1,1,0,0,
	       0,0,1,1,1,1,1,1,1,1,0,0,
	       0,0,1,0,0,0,0,0,0,1,0,0]
	dataCount=0
	ClearScreen()
	for y = 0 to 7
		for x = 0 to 11
			if data[datacount]=1 then DrawLine(x,y,x,y,255,255,255)
			inc dataCount,1
		next x
	next y	
	
	render()
    img = getImage(0,0,12,8)
    SetImageTransparentColor(img,0,0,0)
endfunction img

function createInvader2Img()
	local data as integer [95] = [
	       0,0,0,1,0,0,0,0,1,0,0,0,
	       0,0,1,1,1,1,1,1,1,1,0,0,
	       0,0,1,1,1,1,1,1,1,1,0,0,
	       0,0,1,1,0,1,1,0,1,1,0,0,
	       0,1,1,1,1,1,1,1,1,1,1,0,
	       1,1,1,1,1,1,1,1,1,1,1,1,
	       1,0,1,1,1,1,1,1,1,1,0,1,
	       0,0,0,0,0,0,0,0,0,0,0,0]
	       
	dataCount=0
	ClearScreen()
	for y = 0 to 7
		for x = 0 to 11
			if data[datacount]=1 then DrawLine(x,y,x,y,255,255,255)
			inc dataCount,1
		next x
	next y	
	
	render()
    img = getImage(0,0,12,8)
    SetImageTransparentColor(img,0,0,0)
endfunction img

function createInvader3Img()
	local data as integer [95] = [
	       0,0,0,0,0,0,0,0,0,0,0,0,
	       0,0,1,1,1,1,1,1,1,1,0,0,
	       0,1,1,1,1,1,1,1,1,1,1,0,
	       1,1,1,1,0,1,1,1,0,1,1,1,
	       1,1,1,1,1,1,1,1,1,1,1,1,
	       0,1,1,1,1,1,1,1,1,1,1,0,
	       0,1,1,0,0,0,0,0,0,1,1,0,
	       0,1,1,1,0,0,0,0,1,1,1,0]
	dataCount=0
	ClearScreen()
	for y = 0 to 7
		for x = 0 to 11
			if data[datacount]=1 then DrawLine(x,y,x,y,255,255,255)
			inc dataCount,1
		next x
	next y	
	
	render()
    img = getImage(0,0,12,8)
    SetImageTransparentColor(img,0,0,0)
endfunction img
function createInvaders(invaders ref as _invader[],image1 as integer,image2 as integer,image3 as integer)
	invader as _invader
	for y = 0 to 4
		select y
			case 0:
				image=image1
				invader.scoreValue=30
			endcase	
			case 1:
				image=image2
				invader.scoreValue=20
			endcase
			case 2:
				image=image2
				invader.scoreValue=20
			endcase
			case 3:
				image=image3
				invader.scoreValue=10
			endcase
			case 4:
				image=image3
				invader.scoreValue=10
			endcase
		endselect		
		for x = 0 to 10
			invader.ID=createSprite(image)
			SetSpriteScale(invader.ID,5,5)
			SetSpritePositionByOffset(invader.ID,x*75+90,y*75+90)
			invaders.insert(invader)
		next x
	next y	
endfunction	

function shoot(ship,bullets ref as _bullet[])
	bullet as _bullet
	bullet.ID=createSprite(0)
	SetSpriteScale(bullet.ID,1,1)
	SetSpritePositionByOffset(bullet.ID,GetSpriteXByOffset(ship),GetSpriteYByOffset(ship))
	bullet.time#=timer()
	bullets.insert(bullet)
endfunction	

function dropBomb(invader ref as _invader,invaderBombs ref as _bullet[])
	bomb as _bullet
	bomb.ID=createSprite(0)
	SetSpriteScale(bomb.ID,1,1)
	SetSpritePositionByOffset(bomb.ID,GetSpriteXByOffset(invader.ID),GetSpriteYByOffset(invader.ID))
	bomb.time#=timer()
	invaderBombs.insert(bomb)
endfunction	

function moveBullets(player ref as _player,bullets ref as _bullet[],invaders ref as _invader[])
	for num = bullets.length to 0 step -1
		SetSpritePositionByOffset(bullets[num].ID,GetSpriteXByOffset(bullets[num].ID),GetSpriteYByOffset(bullets[num].ID)-5)
		for num2 = invaders.length to 0 step -1
            if GetSpriteCollision(bullets[num].ID,invaders[num2].ID )
                player.score=player.score+invaders[num2].scoreValue
                DeleteSprite(invaders[num2].ID)
                invaders.remove(num2) //remove the invader that was shot because the sprite nolonger exists
                DeleteSprite(bullets[num].ID)
                bullets.remove(num):exit   
            elseif bullets[num].time#+5.0<timer() 
                DeleteSprite(bullets[num].ID)
                bullets.remove(num):exit
            endif
        next num2    
		//If GetSpriteYByOffset(bullets[num].ID) <0
		//	deleteSprite(bullets[num].ID)
		//	bullets.remove(num)
		//endif	
	next num	
endfunction	

function moveBombs(player ref as _player,bombs ref as _bullet[],invaders ref as _invader[])
	for num = bombs.length to 0 step -1
		SetSpritePositionByOffset(bombs[num].ID,GetSpriteXByOffset(bombs[num].ID),GetSpriteYByOffset(bombs[num].ID)+5)
		if GetSpriteCollision(bombs[num].ID,player.ID )
            player.lives=player.lives-1
            DeleteSprite(bombs[num].ID)
            bombs.remove(num) //remove the bomb that was shot because the sprite nolonger exists
        elseif bombs[num].time#+5.0<timer() 
            DeleteSprite(bombs[num].ID)
			bombs.remove(num):exit
		endif
	next num	
endfunction	


function moveInvaders(invaders ref as _invader[],invaderBombs ref as _bullet[],Direction as integer)
	nextDirection=Direction
	if invaders.length<4 
		speed#=5
	elseif invaders.length<12 
		speed#=4
	elseif invaders.length<24
		speed#=3
	elseif invaders.length<34
		speed#=2
	else
		speed#=1	
	endif		 	
	for num=invaders.length to 0 step -1
		SetSpritePositionByOffset(invaders[num].ID,GetSpriteXByOffset(invaders[num].ID)+(Direction*speed#),GetSpriteYByOffset(invaders[num].ID))
		if GetSpriteXByOffset(invaders[num].ID)<0 then nextDirection=1
		If GetSpriteXByOffset(invaders[num].ID)>GetWindowWidth() then nextDirection=-1
		if random(1,1000)=1 then dropBomb(invaders[num],invaderBombs)
	next num	
	if nextDirection<> Direction 
		for num=invaders.length to 0 step -1
			SetSpritePositionByOffset(invaders[num].ID,GetSpriteXByOffset(invaders[num].ID),GetSpriteYByOffset(invaders[num].ID)+20)
			If GetSpriteYByOffset(invaders[num].ID)>GetWindowHeight()-100 
				gameOver()
				exitfunction 99
			endif	
		next num	
	endif	
endfunction	nextDirection

function gameOver()
	repeat
		Print ("GAME OVER")
		Print ("You were invaded")
		Print ("Press Space to try again")
		sync()
	until GetRawKeyPressed(KEY_SPACE)
endfunction	


Features
All media created with code
No global variables

KEYS
Left Arrow =Move Left
Right Arrow=Move Right
Space Key =Shoot

Whats not included in this version
The barricades are only for show. (I figure the best way to have working barricades is to use memblocks and delete
chunks of the block as necessary which would require using color collision detection for all collisions like
in my lunar lander)
There isn't a UFO that comes along the top for mystery points
No Sounds and no Animations
Posted: 22nd Jan 2019 8:10
Some really good old apps here. Well done to bring back to life. Love space invaders brings back some fond memories
Posted: 22nd Jan 2019 8:50
Thanks Puzzler lol I wasn't that good at arcade version I preferred pinball then but did do very well in an Atari space invader
comp on an old Atari cartridge system I made it to the finals but missed out by a few hundred on getting a prize