Home TI-Nspire Authoring Lua Scripting HQ Lua and JavaScript


Todo:
- Image support
- Font size support
- Physics support
- Toolpallete support
- Clipboard
- D2Editor
- coroutine (possibly not possible)
- string functions
- keyboard improvements
platform.apilevel = 2.0 
	platform.apilevel = 2.0 
	-- Cameron Harris @ ImperialMatrix.com

	local w  
	local h 
	local runningSim 
	local timerCount 
	local simOver 
	local ratio5 
	local xPoints 
	local yPoints 
	local pointIndex 
	local clockArc 
	local displayTime 
	local pointX 
	local pointY 
	local ratio 
	local hummingbird 
	local Birdy 

	function init(gc) 

	    w = platform.window:width()    
	    h = platform.window:height() 
	    runningSim = 0 
	    timerCount = 0 
	    simOver = 0 
	    ratio = (w/h)*5 
	    xPoints = {} 
	    yPoints = {} 
	    pointIndex = 1 
	    clockArc = 0 
	    displayTime = 0 
	    pointX = w*(10/64) 
	    pointY = h*(27/32) 

	    Birdy = Bird(w*(1/4),h*(1/4),0) 

	    timer.start(1/15) 

	    on.paint = paint 
	    paint(gc) 
	end 

	function on.timer() 

	    if timerCount == 60 then 
	        runningSim = 0 
	        timerCount = 0 
	        simOver = 1 
	        clockArc = 0 
	    end--end if to stop sim once 4 sec have elapsed 
	    if runningSim == 1 then 
	       if timerCount%15==0 then 
	            displayTime = displayTime + 1 
	        end--if to control display clock 
	        pointY = Birdy.y + h*(2/32) 
	        pointX = pointX + ((w*(3/4))/60) 
	        timerCount = timerCount + 1 
	        if pointX>w then 
	            pointX = 5 
	        end--end if to reset block 
	        if clockArc == 360 then 
	            clockArc = 0 
	        end--end if to reset clock arc 
	        clockArc =clockArc + (360/16) 


	   end--emd if to look for runningSim 


	    platform.window:invalidate() 

	end 




	--==================== BIRD CODE =================== 
	Bird = class() 

	function Bird:init(x,y,width,height,clicked) 

	    self.x = w*(1/16) 
	    self.y = h*(27/32) 
	    self.clicked = 0 
	    self.width = 3*ratio 
	    self.height = 3*ratio 
	    pointY = self.y + h*(2/32) 
	    pointX = pointX + ((w*(3/4))/60) 
	end--end Bird class 

	function Bird:contains(x, y) 

	    local sw = self.width 

	    local sh = self.height 

	    return x >= self.x - sw and x <= self.x + sw and 

	        y >= self.y - sh and y <= self.y + sh 

	end--end Bird:contains 

	--=================== END BIRD CODE ========================= 

	--=================== TIMER CODE  =========================== 

	function on.enterKey() 
	    if simOver == 1 then 
	        xPoints = {} 
	        yPoints = {} 
	        pointIndex = 1 
	        simOver = 0 
	        pointX = w*(10/64) 
	        pointY = Birdy.y + h*(3/32) 
	        clockArc = 0 
	        displayTime = 0 

	    end--end if simOver, resets simulation 
	    runningSim = 1 

	end-- end on.enterKey() 

	function on.escapeKey() 

	    on.paint = init 

	end 

	--=============== END TIMER CODE ========================= 


	function on.mouseDown(x,y) 
	    if runningSim == 0 then 
	        xPoints = {} 
	        yPoints = {} 
	        pointIndex = 1 
	        simOver = 0 
	        pointX = w*(10/64) 
	        pointY = Birdy.y + h*(3/32) 
	        clockArc = 0 
	        displayTime = 0 
	    end--end if to reset variables on click afer sim over 
	    if Birdy:contains(x,y) then 
	        Birdy.clicked = 1 
	        runningSim = 1 
	    end--end if to listen for clicks on bird 


	end-- end on.mouseDown(x,y) 

	function on.mouseUp(x,y) 
	    Birdy.clicked = 0 

	end--end on.mouseUp(x,y) 

	function on.mouseMove(x,y) 
	    if Birdy.clicked == 1 then 
	        if yh*(1/64) then 
	            Birdy.y = y 
	        end-- end if to assure valid x,y 
	    end-- end if to move bird with mouse on y axis 

	end--end on.mouseMove(x,y) 

	function paint(gc) 

	w = platform.window:width()    
	h = platform.window:height() 

	    --=========== GRAPH DISPLAY =============== 
	    gc:drawLine(w*(9/64),0,w*(9/64),h)-- screen divider 
	    gc:drawRect(w*(1/16),h*(30/32),w*(4/64),h*(2/64))  -- radar box 
	    gc:drawLine(w*(1/64),h*(2/64),w*(1/64),h*(30/32))--bird y-axis 
	    yAxis = h*(30/32) 
	    gc:setFont("sansserif", "r", 6) 
	    for k = 0,12,2 do 
	        gc:drawLine(w*(1/64),yAxis,w*(2/64),yAxis) 
	        gc:drawString(k,w*(2/64),yAxis,bottom) 
	        yAxis = yAxis - (h*(1/7)) 
	    end--end for loop to print bird yaxis ticks 

	    gc:drawLine(w*(10/64),h*(2/64),w*(10/64),h*(30/32))--graph y-axis 
	    yAxis = h*(30/32) 
	    for k = 0,12,2 do 
	        gc:drawLine(w*(10/64),yAxis,w*(11/64),yAxis) 
	        gc:drawString(k,w*(11/64),yAxis,bottom) 
	        yAxis = yAxis - (h*(1/7)) 
	    end--end for loop to print graph yaxis ticks 

	    gc:drawLine(w*(11/64),h*(30/32),w*(15/16),h*(30/32)) 

	    -- horizontal tick marks 
	    xAxis = w*(10/64) 
	    for k = 1,4,1 do 
	        xAxis = xAxis + (w*(25/128)) 
	        gc:drawLine(xAxis,h*(30/32),xAxis,h*(29/32)) 
	        gc:drawString(k,xAxis-2,h*(32/32)) 
	    end--end for to print horizontal ticka 
	    --=========== END GRAPH DISPLAY =========== 

	    --=========== TIMR DIDPLAY ================ 
	    if(ratio*7)>6 then 
	        gc:setFont("sansserif", "r", ratio*7) 
	    else 
	        gc:setFont("sansserif", "r", 6) 
	    end 
	    gc:drawArc(w*(110/128),h*(3/128),w*(1/9),h*(3/17),0,clockArc) 
	    gc:drawString(displayTime,w*(113/128),h*(26/128)) 
	    if simOver == 1 then 
	        gc:drawArc(w*(110/128),h*(3/128),w*(1/9),h*(3/17),0,360) 
	        gc:setFont("sansserif", "r", 6) 
	        gc:drawString("Click",w*(112/128),h*(34/128)) 
	        gc:drawString("to",w*(116/128),h*(40/128)) 
	        gc:drawString("Reset",w*(112/128),h*(46/128)) 
	        gc:drawArc(w*(110/128),h*(25/128),w*(1/9),h*(3/17),0,360) 
	    end 
	    --=========== END TIME DISPLAY ============= 


	--    gc:drawImage(hummingBird,Birdy.x,Birdy.y) 
	        gc:setColorRGB(100, 200, 230) 
	        gc:fillArc(Birdy.x,Birdy.y, Birdy.width, Birdy.height, 0, 360) 

	       xPoints[pointIndex] = pointX 
	       yPoints[pointIndex] = pointY 
	       pointIndex = pointIndex + 1 

	     if runningSim == 1 or simOver == 1 then 

	         for k=1,pointIndex-1,1 do 
	              tempX = xPoints[k] 
	              tempY = yPoints[k] 
	              if k<=pointIndex then 

	                 gc:drawRect(tempX,tempY,2,2) 

	              end--end if 
	         end--end for to print points 
	     end--end if to display only points generated during sim 
	       --tempX = xPoints[1] 
	      -- tempY = yPoints[1] 

	    --gc:drawRect(tempX,tempY,2,2) 
	    gc:setFont("sansserif", "r", 12) 
	    gc:setColorRGB(0, 0, 0) 
	    local str = "Grab the blue 'bird' and drag it up and down" 
	    local sw = gc:getStringWidth(str) 
	    gc:drawString(str, w/2 - sw/2, h*0.1, "middle") 

	end 

	function on.resize() 

	    on.paint = init 

	end