#include "fbgfx.bi" DECLARE SUB MyChainLayer () TYPE MyChainType X AS SINGLE Y AS SINGLE OldX AS SINGLE OldY AS SINGLE Sprite AS INTEGER Mode AS INTEGER Exists AS INTEGER Length AS INTEGER PullDistance AS INTEGER EndDistance AS INTEGER Fixed AS INTEGER Speed AS SINGLE END TYPE const FALSE = 0 const TRUE = 1 const numofrings = 50 const numofchains = 10 const fpslimit = 80 DIM SHARED MyChain(numofchains, numofrings) AS MyChainType DIM SHARED set_num_of_chains, set_num_of_rings DIM SHARED workpage DIM SHARED st AS DOUBLE SCREENRES 640, 480, 8, 2, 0 SCREENSET 1, 0 SETMOUSE 50,50,0 set_num_of_chains = 1 set_num_of_rings = 25 ' Init our snake. FOR initchain = 1 TO set_num_of_chains FOR initring = 1 TO set_num_of_rings MyChain(initchain, initring).Exists = TRUE MyChain(initchain, initring).Sprite = 1 IF initring = set_num_of_rings THEN MyChain(initchain, initring).Sprite = 2 MyChain(initchain, initring).PullDistance = 12 MyChain(initchain, initring).EndDistance = 14 MyChain(initchain, initring).Speed = 2 MyChain(initchain, initring).X = 320 MyChain(initchain, initring).Y = 20 + initring * 7 NEXT initring NEXT initchain ' The main loop. DO screenset workpage, workpage xor 1 CLS MyChainLayer workpage xor = 1 do loop until timer& - st >= (1/fpslimit) st = timer& SLEEP 1 LOOP UNTIL MULTIKEY(SC_ESCAPE) ' End loop when the user presses ESC. SUB MyChainLayer () ' Loop through our chains and chain pieces for ' every chain. FOR countchain = 1 TO set_num_of_chains FOR countring = 1 TO set_num_of_rings ' Store the chain piece position before moving it. MyChain(countchain, countring).OldX = MyChain(countchain, countring).X MyChain(countchain, countring).OldY = MyChain(countchain, countring).Y ' If not moving the last chain piece(IF countring + 1 <= set_num_of_rings) ' and if the current piece is not fixed move it! IF countring + 1 <= set_num_of_rings AND MyChain(countchain, countring).Fixed = FALSE THEN ' If the next chain piece(countring+1) is more than PullDistance pixels ' left from the current chain piece(countring), move the current chain ' piece toward left. IF MyChain(countchain, countring).X-MyChain(countchain, countring+1).X>MyChain(countchain, countring).PullDistance THEN MyChain(countchain, countring).X = MyChain(countchain, countring).X-MyChain(countchain, countring).Speed ' Align the current piece with the next piece it follows, if it's higher ' or lower from this piece. This part is tweaked in the sense of ' "alignment speed" and requires tweaking with speed changes. IF MyChain(countchain, countring).Y>MyChain(countchain, countring+1).Y THEN MyChain(countchain, countring).Y = MyChain(countchain, countring).Y-ABS(MyChain(countchain, countring).Y-MyChain(countchain, countring+1).Y)*0.08*MyChain(countchain, countring).Speed IF MyChain(countchain, countring).YMyChain(countchain, countring+1).Y THEN MyChain(countchain, countring).Y = MyChain(countchain, countring).Y-ABS(MyChain(countchain, countring).Y-MyChain(countchain, countring+1).Y)*0.08*MyChain(countchain, countring).Speed IF MyChain(countchain, countring).YMyChain(countchain, countring).PullDistance THEN MyChain(countchain, countring).Y = MyChain(countchain, countring).Y-MyChain(countchain, countring).Speed ' Align the current piece with the next piece it follows, if it's left ' or right from this piece. This part is tweaked in the sense of ' "alignment speed" and requires tweeking with speed changes. IF MyChain(countchain, countring).X>MyChain(countchain, countring+1).X THEN MyChain(countchain, countring).X = MyChain(countchain, countring).X-ABS(MyChain(countchain, countring).X-MyChain(countchain, countring+1).X)*0.08*MyChain(countchain, countring).Speed IF MyChain(countchain, countring).XMyChain(countchain, countring+1).X THEN MyChain(countchain, countring).X = MyChain(countchain, countring).X-ABS(MyChain(countchain, countring).X-MyChain(countchain, countring+1).X)*0.08*MyChain(countchain, countring).Speed IF MyChain(countchain, countring).X