public bool PixeisTocaram(Texturas outraTextura, out Vector2 pontoColisao) { bool toca = ToqueTextures(outraTextura); pontoColisao = Posicao; if (toca) { bool toquePixel = false; Vector2 direccaoIX = MostraVector.ModificarPeloAng(Vector2.UnitX, Rotacao); Vector2 direccaoIY = MostraVector.ModificarPeloAng(Vector2.UnitY, Rotacao); Vector2 outraDirX = MostraVector.ModificarPeloAng(Vector2.UnitX, outraTextura.Rotacao); Vector2 outraDirY = MostraVector.ModificarPeloAng(Vector2.UnitY, outraTextura.Rotacao); int i = 0; while ((!toquePixel) && (i < SpriteLargura)) { int j = 0; while ((!toquePixel) && (j < SpriteAltura)) { pontoColisao = IndiceDaPosicaoCamera(i, j, direccaoIX, direccaoIY); Color corI = BuscaCores(i, j); if (corI.A > 0) { Vector2 outroIndex = outraTextura.PosicaoCameraIndex(pontoColisao, outraDirX, outraDirY); int xMin = (int)outroIndex.X; int yMin = (int)outroIndex.Y; if ((xMin >= 0) && (xMin < outraTextura.SpriteLargura) && (yMin >= 0) && (yMin < outraTextura.SpriteAltura)) { toquePixel = (outraTextura.BuscaCores(xMin, yMin).A > 0); } } j++; } i++; } toca = toquePixel; } return(toca); }
public bool ToqueTextures(Texturas outraTextura) { if ((Math.Abs(rotacaoI) < float.Epsilon) && (Math.Abs(outraTextura.rotacaoI) < float.Epsilon)) { //Sem rotaçoes e verifica se exite uma sobreposiçao de limites Vector2 meuMin = LimiteMin; Vector2 outroMin = outraTextura.LimiteMin; Vector2 meuMax = LimiteMaxx; Vector2 outroMax = outraTextura.LimiteMaxx; return((meuMin.X < outroMax.X) && (meuMax.X > outroMin.X) && (meuMin.Y < outroMax.Y) && (meuMax.Y > outroMin.Y)); } else { // Se um dos elementos tiver rodado usa o angulo //Usar o maior ratio de imagem e raio mais proximo // raiz quadrada de (1/2)*X ~ 0.71f*X float raio1 = 0.71f * MathHelper.Max(Tamanho.X, Tamanho.Y); float raio2 = 0.71f * MathHelper.Max(outraTextura.Tamanho.X, outraTextura.Tamanho.Y); return((outraTextura.Posicao - Posicao).Length() < (raio1 + raio2)); } }
static public EstadoColisaoCamera ColisaoComJanela(Texturas prim) { Vector2 min = posicaoCantoInferiorEsq; Vector2 max = posicaoCantoSuperiorDir; if (prim.LimiteMaxx.Y > max.Y) { return(EstadoColisaoCamera.ColisaoSuperior); } if (prim.LimiteMin.X < min.X) { return(EstadoColisaoCamera.ColisaoEsq); } if (prim.LimiteMaxx.X > max.X) { return(EstadoColisaoCamera.ColisaoDir); } if (prim.LimiteMin.Y < min.Y) { return(EstadoColisaoCamera.ColisaoInferior); } return(EstadoColisaoCamera.DentroJanela); }