Hi guys im making a snake game and have created the basics. IE i have a snake but instead of it eating food it grows via the use of a timer (so every so often it gets bigger) now im onto hit detection now the snake is in an array but i was just wondering how i would code it so that when the snakes head hits the body it traces a hit or does something? ive been looking for hours on google for help with no such luck. Any would be appreciated
below is the code, it mainly happens in the move function but the snake is created through the use of sprites
package {
import flash.display.Sprite;
import flash.events.KeyboardEvent;
import flash.events.TimerEvent;
import flash.ui.Keyboard;
import flash.utils.Timer;
import flash.display.MovieClip;
import flash.utils.getTimer;
import flash.text.TextField;
[SWF(width='430', height='430', frameRate='30')]
public class Snake extends MovieClip{
private const SPEED :uint = 25;//lower = faster
private const snakeAttach :uint = 400;//lower = faster
private const count: uint = 10;
private const DIM :int = 50; //keep this number uneven to have the snake starting in the middle
private const INITIAL_SIZE :int = 3; //keep this lower then DIM/2
private var stopped :Boolean;
private var left :Boolean;
private var right :Boolean;
private var up :Boolean;
private var down :Boolean;
private var size :Number;
private var food :Sprite;
private var tmr :Timer;
private var count1 :Timer;
private var addSnake :Timer;
private var curI :Number;
private var curJ :Number;
private var snake :Array;
private var grid :Array;
private var sp :Sprite;
private var _start:uint;
public var myTextBox:TextField = new TextField();
public function Snake(){
size = stage.stageWidth / DIM; //change grid size
curI = curJ = Math.floor(DIM * 0.5); //change grid size
initSnake();
fillGrid();
addTimer();
addChild(myTextBox);
count1 = new Timer(count);
count1.addEventListener(TimerEvent.TIMER,stopWatch);
count1.start();
addSnake = new Timer(snakeAttach);
addSnake.addEventListener(TimerEvent.TIMER,placeFood);
addSnake.start();
tmr = new Timer(SPEED);
tmr.addEventListener(TimerEvent.TIMER,move);
tmr.start();
stage.addEventListener(KeyboardEvent.KEY_DOWN,changeDir);
}
private function stopWatch(event:TimerEvent):void{
myTextBox.text = (count1.currentCount / 100).toString();
}
public function addTimer():void{ //timer
var myTextBox:TextField = new TextField();
addChild(myTextBox);
}
private function fillGrid():void{ //grid
grid = Make2DArray();
for (var i:uint = 0; i < DIM; i++){
for (var j:uint = 0; j < DIM; j++){
var sp:Sprite = new Sprite();
sp.graphics.beginFill(0xF0F0F0);
sp.graphics.lineStyle(1,0xF5F5F5);
sp.graphics.drawRect(0, 0, size - 1, size - 1);
sp.x = i * size;
sp.y = j * size;
addChild(sp);
grid*[j] = sp;
}
}
}
private function Make2DArray():Array{ //for the grid
var a:Array = new Array(DIM);
for(var i:uint = 0; i < a.length; i++){
a* = new Array(DIM);
}
return a;
}
private function initSnake():void{ //initialises the snake
var center:Number = Math.floor(DIM * 0.5) * size;
snake = new Array(INITIAL_SIZE);
for (var i:uint = 0; i < INITIAL_SIZE; i++){
var sp:Sprite = makeItem(); //adds a body part of makeItem
sp.x = center;
sp.y = center + i * size;
addChild(sp); //adds to the stage
snake* = sp; //sets the index to one
}
snake.reverse();
}
private function makeItem(c:uint = 0):Sprite{ //graphics for item
var s:Sprite = new Sprite();
s.graphics.beginFill(c);
s.graphics.lineStyle(2,0x333333);
s.graphics.drawRect(0, 0, size, size);
return s;
}
private function placeFood(event:TimerEvent):void{
var rndI:uint = Math.floor(Math.random() * DIM); //sets a random integer based on the the floor
var rndJ:uint = Math.floor(Math.random() * DIM);
var rndX:Number = grid[rndI][rndJ].x; // sets a grid position for the food item to go
var rndY:Number = grid[rndI][rndJ].y;
if (food != null) removeChild(food); //if there is food on the grid removes the food from the board
food = makeItem(Math.random() * 0xFFFFFF);// random color
food.x = rndX;
food.y = rndY;
addChild(food); //adds the food to the board
for (var i:uint = 0; i < snake.length; i++){
if (rndY == snake*.y && rndX == snake*.x){
}
}
}
private function move(e:TimerEvent):void{
if (left){
curI -= 1;
}else if (right){
curI += 1;
}
if (up){
curJ -= 1;
}else if (down){
curJ += 1;
}
if (left || right || up || down){
var s:Sprite = makeItem();
if (curI > DIM - 1) curI = 0;
if (curJ > DIM - 1) curJ = 0;
if (curI < 0) curI = DIM - 1;
if (curJ < 0) curJ = DIM - 1;
s.x = grid[curI][curJ].x;
s.y = grid[curI][curJ].y;
addChild(s);
snake.push(s);
if (Math.floor(s.x) == Math.floor(food.x) && Math.floor(s.y) == Math.floor(food.y) ){
}
else if((tmr.currentCount % 3) > 0) { removeChild(snake[0]); snake.shift(); }
}
}
private function changeDir(e:KeyboardEvent):void{
if(e.keyCode == Keyboard.LEFT) {if (!right){left = true; up = false; down = false; right = false;}}
if(e.keyCode == Keyboard.UP) {if (!down) {left = false; up = true; down = false; right = false;}}
if(e.keyCode == Keyboard.RIGHT) {if (!left) {left = false; up = false; down = false; right = true;}}
if(e.keyCode == Keyboard.DOWN) {if (!up) {left = false; up = false; down = true; right = false;}}
}
}
}