Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*** Consulta si has tocado un punto de un sprite (Raycast point) ***/
- bool NGN_Collisions::RaycastPoint(NGN_Sprite* spr, float position_x, float position_y, float &hitpoint_x, float &hitpoint_y) {
- // Sprite invalido
- if (spr == NULL) return false;
- // Sprite invisible
- if (!spr->visible) return false;
- // Decide el metodo para la primera comprobacion
- int32_t r = 0.0f;
- int32_t d = 0.0f;
- Vector2I32 distance;
- if (spr->rotation != 0.0f) {
- // Si esta rotado, colision por circulos
- r = (int32_t)(std::sqrt(std::pow(spr->width, 2.0f) + std::pow(spr->height, 2.0f)) / 2.0f);
- d = (int32_t)std::sqrt(std::pow((spr->position.x - position_x), 2.0f) + std::pow((spr->position.y - position_y), 2.0f));
- if (d > r) return false;
- } else {
- // Si no lo estan, colision por cajas
- distance.x = (int32_t)(std::abs(spr->position.x - position_x));
- distance.y = (int32_t)(std::abs(spr->position.y - position_y));
- if ((distance.x > (int32_t)(spr->width / 2.0f)) || (distance.y > (int32_t)(spr->height / 2.0f))) return false;
- }
- // Renderiza una textura de 1x1 para la comprobacion
- int32_t x = (int32_t)(spr->position.x - position_x);
- int32_t y = (int32_t)(spr->position.y - position_y);
- SDL_Surface* srf = NULL;
- srf = RenderSpriteInSurface(spr, x, y, 1, 1);
- // Analiza si hay datos en el pixel solicitado
- bool collision = false;
- uint32_t* pixels = (uint32_t*)srf->pixels;
- if ((pixels[0] & 0x000000FF)) collision = true;
- // Paso de limpieza
- SDL_FreeSurface(srf);
- srf = NULL;
- // Resultado final
- return collision;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement