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: