void CDoubleLinkedList::addNodeBefore( CNode * pNode2, CNodeObject * pObject ) { CNode * pNode1 = pNode2->getPrevNode(); if ( NULL == pNode1 ) { // There is no nodes before this node addNodeHead( pObject ); } else { // Add the node between the two insertNode( pNode1, pNode2, pObject ); } }
void startSnake(Snake* snake,SDL_Rect* display,SDL_Point* applet) { snakeContext* context = (snakeContext*)malloc(sizeof(*context)); context->snake = snake; context->display = display; context->applet = applet; snake->delay = 100; snake->timer = SDL_AddTimer(snake->delay,(SDL_TimerCallback)&runSnake,context); Mix_PlayMusic(snake->music,-1); //Agrego nodos a la seriente hasta conseguir los buscados for (int i = 0; i < snakeInitialLength-1; ++i) addNodeHead(snake); }
void moveSnake(Snake* snake,SDL_Rect* Display,SDL_Point* Applet) { if(snake && Display && Applet) { SDL_Point nextPos; snakeNode* node = snake->tail; if(!(snake->vecDirector.x || snake->vecDirector.y || snake->speed)) { printf("Snake sin velocidad o direccion\n"); return; } //Calculo la nueva posicion de la cabeza de la serpiente nextPos.x = node->pos.x+snake->vecDirector.x*snake->speed; nextPos.y = node->pos.y+snake->vecDirector.y*snake->speed; //Testeo la colision con las paredes del escenario if(nextPos.x < 0 || nextPos.y < 0 || nextPos.x > Display->w || nextPos.y > Display->h || snake->field.buff[(nextPos.x/snakeSize)+(nextPos.y/snakeSize)*snake->field.s.w]) { SDL_Event e; e.type = gameOverEventID; SDL_PushEvent(&e); } else { moveHeadToTail(snake); SDL_Point* pos = &snake->tail->pos; //Muevo la posicion de el nodo que va a ser la cabea snake->field.buff[(pos->x/snakeSize)+(pos->y/snakeSize)*snake->field.s.w]--; *pos = nextPos; snake->field.buff[(pos->x/snakeSize)+(pos->y/snakeSize)*snake->field.s.w]++; //Testeo la colision con la manzana if(Applet->x == nextPos.x && nextPos.y == Applet->y) { //Si me como una manzana, crezco y tiro otra for(int i = 0; i<4; i++) addNodeHead(snake); launchApplet(Applet,Display); if(!(snake->nAppletMeals%5) && snake->delay >10) snake->delay -= snake->delay/10; //Aumento el contador de manzanas comidas snake->nAppletMeals++; printf("Manzanas comidas %u\n",snake->nAppletMeals); } } } }
void launchSnake(drawableSnake* drawable,SDL_Rect* display) { if(drawable) { MapField* field = &drawable->snake.field; addNodeHead(&drawable->snake); field->s.w = display->w/snakeSize+1; field->s.h = display->h/snakeSize+1; if(!field->buff) field->buff = (byte*)malloc(sizeof(byte)*field->s.w*field->s.h); memset(field->buff,false,sizeof(bool)*field->s.w*field->s.h); SDL_Point* pos = &drawable->snake.head->pos; //Pongo centrado a la serpiente pos->x = display->w/2-snakeSize; pos->y = display->h/2-snakeSize; //Alineo la serpiente a multiplos del snakeSize pos->x -= pos->x%snakeSize; pos->y -= pos->y%snakeSize; //Pongo la posicion de la serpiente field->buff[(pos->x/snakeSize)+(pos->y/snakeSize)*field->s.w]++; } }