monstercameron
Well-Known Member
I save the coords of every movement to 2 arrays, then use those values to display the tail. somewhere along it crashes and glbasic complains about the array bounds...
How would I draw as many segments as the snakeLength variable dictates without having a separate line for each segment in drawStuff?
https://www.youtube.com/embed/Z4g-sCYKpl0?feature=oembed
also it is framerate dependent, any ideas how to seperate the two?
	
	
	
		
				
			How would I draw as many segments as the snakeLength variable dictates without having a separate line for each segment in drawStuff?
https://www.youtube.com/embed/Z4g-sCYKpl0?feature=oembed
also it is framerate dependent, any ideas how to seperate the two?
		Code:
	
	// --------------------------------- //
// Project: snake
// Start: Saturday, November 03, 2012
// IDE Version: 10.283
// FREE-VERSION:
// Need Premium for Features:
// 3D Graphics
// Network Commands
// INLINE C/C+++ code
// SETCURRENTDIR("Media") // go to media files
//main loop
WHILE TRUE
    //initial loading
    IF isLoaded = 0
        GOSUB loadStuff
    ENDIF
    GOSUB logicStuff
    GOSUB drawStuff
    SHOWSCREEN
WEND
SUB loadStuff:
    GLOBAL windowWidth = 640
    GLOBAL windowHeight = 480
    GLOBAL windowFullscreen = 0
    SETSCREEN windowWidth,windowHeight,windowFullscreen
    
    GLOBAL snakePosiY = 200
    GLOBAL snakePosiX = 100
    GLOBAL snakePosiYStart = 200
    GLOBAL snakePosiXStart = 100
    GLOBAL snakePosiYLast = 200
    GLOBAL snakePosiXLast = 100
    GLOBAL snakeLenght = 1
    GLOBAL snakeDirection = 2    //1=up 2=right 3=down 4=left
    GLOBAL snakeSpeed = 3 //by tens from 1-10 speed
    GLOBAL userScore = 0
    
    GLOBAL goalIsWaiting = 0
    
    GLOBAL keyPressed = 0
    
    GLOBAL isLoaded = 0
    GLOBAL isLoaded = isLoaded + 1
    
    GLOBAL checkInsideX = 0
    GLOBAL checkInsideY = 0
    
    GLOBAL snakeTailXArray[]
    GLOBAL snakeTailYArray[]
    
    GLOBAL snakeTailX = 1
    GLOBAL snakeTailXElem = 1
    
    GLOBAL snakeTailY = 2
    GLOBAL snakeTailYElem = 1
    
    DIM snakeTailXArray[100][500]
    DIM snakeTailYArray[100][500]
    
    
    GLOBAL looper =11
    GLOBAL looperLenght = 10
ENDSUB
FUNCTION posCatcher: lastPosX, lastPosY
    snakeTailX = snakeTailX + 1
    snakeTailY = snakeTailY + 1
    
    snakeTailXArray[snakeTailX][snakeTailXElem] = lastPosX
    snakeTailYArray[snakeTailY][snakeTailYElem] = lastPosY
    
    IF snakeTailX > looperLenght -10 THEN snakeTailX = 1
    IF snakeTailY > looperLenght -10 THEN snakeTailY = 1
ENDFUNCTION
SUB logicStuff:
    //to change direction
    IF snakeDirection = 1
        snakePosiY = snakePosiY - snakeSpeed
    
    ELSEIF snakeDirection = 2
        snakePosiX = snakePosiX + snakeSpeed
    
    ELSEIF snakeDirection = 3
        snakePosiY = snakePosiY + snakeSpeed
    
    ELSEIF snakeDirection = 4
        snakePosiX = snakePosiX - snakeSpeed
    
    ENDIF
    
    //manages the keyboard inputs to change direction    
    IF KEY(200) = 1
        IF keyPressed = 3
        keyPressed = 3
        ELSE
        keyPressed = 1
        ENDIF
    
    ELSEIF KEY(208) = 1
        IF keyPressed = 1
        keyPressed = 1
        ELSE
        keyPressed = 3
        ENDIF
    
    ELSEIF KEY(205) = 1
        IF keyPressed = 4
        keyPressed = 4
        ELSE
        keyPressed = 2
        ENDIF
    
    ELSEIF KEY(203) = 1
        IF keyPressed = 2
        keyPressed = 2
        ELSE
        keyPressed = 4
        ENDIF
    
    ELSE    
        //keyPressed = 0
    
    ENDIF
    
    
    //assigns keypress to numeric value in snakeDirection
    IF keyPressed = 1
        snakeDirection = 1
    
    ELSEIF keyPressed = 2
        snakeDirection = 2
    
    ELSEIF keyPressed = 3
        snakeDirection = 3
    
    ELSEIF keyPressed = 4
        snakeDirection = 4
    ENDIF
    
    
    //check for collision with goal to add to score and lenght
    IF snakePosiX > goalPosiX AND snakePosiX < goalPosiX + goalSize OR snakePosiX + 10 > goalPosiX AND snakePosiX + 10 < goalPosiX + goalSize
        checkInsideX = 1
    
        IF  snakePosiY > goalPosiY AND snakePosiY < goalPosiY + goalSize OR snakePosiY + 10 > goalPosiY AND snakePosiY + 10 < goalPosiY + goalSize
            checkInsideY = 1
        ELSE
            checkInsideY = 0
        ENDIF
    
    ELSE
        checkInsideX = 0
    ENDIF
    
    IF checkInsideX = 1 AND checkInsideY = 1
        userScore = userScore + 1
        snakeLenght = snakeLenght + 1
    
        looperLenght = looperLenght + 4
        IF looperLenght > 490 THEN looperLenght = 490
        GOSUB goalPlotter
    ENDIF
    
    //stores the values of the current position in any direction to the arrays
    ////////////////////////////////////////////////////////////////////////////
    //maybe this could work
    //IF snakeDirection > 0 and snakeDirection < 5
    //    posCatcher(snakePosiX,snakePosiY)
    ////////////////////////////////////////////////////////////////////////////
    IF snakeDirection = 2
        posCatcher(snakePosiX,snakePosiY)
        //DRAWRECT snakePosiXLast , snakePosiYLast, snakePosiX - snakePosiXLast, 10, RGB(0, 0, 255) // blue
    
    ELSEIF snakeDirection = 1
        posCatcher(snakePosiX,snakePosiY)
        //DRAWRECT snakePosiXLast, snakePosiYLast, 10, snakePosiY -snakePosiYLast, RGB(0, 0, 255) // blue
    
    ELSEIF snakeDirection = 4
        posCatcher(snakePosiX,snakePosiY)
        //DRAWRECT snakePosiXLast, snakePosiYLast, snakePosiX - snakePosiXLast, 10, RGB(0, 0, 255) // blue
    
    ELSEIF snakeDirection = 3
        posCatcher(snakePosiX,snakePosiY)
        //DRAWRECT snakePosiXLast, snakePosiYLast, 10, snakePosiY -snakePosiYLast, RGB(0, 0, 255) // blue
    ENDIF
    
    //?
    IF snakePosiXLast = snakePosiX - (snakeLenght * 10)
        snakePosiXLast = snakePosiXLast + snakeSpeed
    
    ELSEIF snakePosiXLast = snakePosiX + (snakeLenght * 10 + 10)
        snakePosiXLast = snakePosiXLast - snakeSpeed
    
    ELSEIF snakePosiYLast = snakePosiY + (snakeLenght * 10 + 10)
        snakePosiYLast = snakePosiYLast - snakeSpeed
    
    ELSEIF snakePosiYLast = snakePosiY - (snakeLenght * 10)
        snakePosiYLast = snakePosiYLast + snakeSpeed
    ENDIF
    
    //allowing the snake to warp to the opposite side of the screen
    IF snakePosiX > windowWidth
        snakePosiX = 0
    
    ELSEIF snakePosiX < windowWidth - windowWidth
        snakePosiX = windowWidth
    
    ELSEIF snakePosiY > windowHeight
        snakePosiY = 0
    
    ELSEIF snakePosiY < windowHeight - windowHeight
        snakePosiY = windowHeight
    ENDIF
ENDSUB
SUB goalPlotter:
    //plots random color and pos of goal
    GLOBAL goalPosiX = (RND(300)+20)
    GLOBAL goalPosiY = (RND(300)+20)
    GLOBAL goalSize = (RND(30)+10)
    GLOBAL goalColorR = RND(255)
    GLOBAL goalColorG = RND(255)
    GLOBAL goalColorB = RND(255)
    //GLOBAL goalPosiX = 0
    //GLOBAL goalPosiY = 0
ENDSUB
SUB traceRoute:
    //GLOBAL TRcurrentPosiX
    //GLOBAL TRcurrentPosiY
    //IF
ENDSUB
SUB drawStuff:
    //draws debug text.
    PRINT "isLoaded ("+ isLoaded + ")",10,5
    PRINT "snakeDirection ("+ snakeDirection + ")",10,25
    PRINT "checkInsideX ("+ checkInsideX + ")" + "     checkInsideY ("+ checkInsideY + ")" ,10,65
    PRINT "userScore ("+ userScore + ")",10,85
    PRINT "snakeLenght ("+ snakeLenght + ")",10,105
    PRINT "keyPressed ("+ keyPressed + ")",10,125
    PRINT "looper ("+ looper + ")",10,145
    PRINT "snakeTailX ("+ snakeTailX + ")" + "snakeTailY ("+ snakeTailY + ")" ,10,165
    
    //draw snake goal
    DRAWRECT goalPosiX, goalPosiY, goalSize, goalSize, RGB(goalColorR, goalColorG, goalColorB) // random color
    
    //draw snake head
    DRAWRECT snakePosiX, snakePosiY, 10, 10, RGB(255, 255, 255) // white
    
    //snakeTail[snakeTailX][snakeTailXElem] = lastPosX
    //snakeTail[snakeTailY][snakeTailYElem] = lastPosY
    
    
    //draw snake tail by looping through the values in the arrays...need better solution
    //looper = looper - 3
    //IF looper < 10 THEN looper = looperLenght - 10
    
    looper = 1
    
    //DRAWRECT snakeTailXArray[looper-1][snakeTailXElem], snakeTailYArray[looper-1][snakeTailYElem], 10, 10, RGB(255, 0, 0) // red
    
    FOR i = 1 TO snakeLenght STEP looper
    
        DRAWRECT snakeTailXArray[looper+1][snakeTailXElem], snakeTailYArray[looper+1][snakeTailYElem], 10, 10, RGB(255, 0, 0) // red
    
    NEXT
ENDSUB
	
			
				Last edited by a moderator: 
			
		
	
								
								
									
	
								
							
							
	