FAQ: cocos2d for iPhone: How to get a Sprite's Bounding Box / Bounding Rectangle? (with Code) Comments Feed" href="http://www.learn-cocos2d.com/knowledge-base/cocos2d-iphone-faq/feed/"/>

FAQ: cocos2d para I-Phone: ¿Cómo conseguir el Cuadro delimitador de un Elfo / Rectángulo Saltador? (con Código)

How to get a Sprite's Bounding Box / Bounding Rectangle? (with Code)

Busque mi cocos2d preguntas frecuentes de I-Phone & Seminarios

Por favor note que la búsqueda de blog en la esquina correcta superior no busca mis preguntas frecuentes y Seminarios.
 

  • Note: ¡por favor no comparta relaciones de descarga directas a archivos PDF, las relaciones de descarga expiran después de unos minutos de pareja!

el cocos2d no tiene un método que devuelve el cuadro delimitador de un Elfo o el rectángulo saltador. Usted puede crear fácilmente un CGRect usando contentsize del elfo. ¿Pero y si el anchorpoint no esté en el centro, o el elfo es escalado? Escribiremos una categoría de CCSpriteExtension que cubrirá esto. But what if the anchorpoint isn't at the center, or the sprite is scaled? We'll write a CCSpriteExtension category which will cover that.

Lección de descarga PDF

NOTE: use el método boundingBox del CCNODE en cambio

Cuando escribí esto yo no era consciente que CCNode tiene un - (CGRect) boundingBox método. Dejo este enfoque aquí porque ilustra como ampliar cocos2d con métodos útiles usando categorías Objetivas-C.

Categoría de CCSpriteExtension

Cree una nueva clase Objetiva-C tanto con.h como con archivos.m y llame la clase CCSpriteExtension.

Interfaz de CCSpriteExtension

El archivo de jefe será un poco diferente que jefes regulares porque sólo definimos una categoría Objetiva-C. Una categoría Objetiva-C permite que usted añada métodos (pero no variables de miembro) a una clase existente. Es una gran manera extenderse en el código y API de otros, como el motor cocos2d, sin necesidad tener de cambiar su código fuente. It's a great way to extend on code and API of others such as the cocos2d engine, without having to change their source code.

Note que llamé el @interface CCSprite exactamente como la clase cocos2d. Pero es seguido de una palabra clave entre paréntesis. Éstos son para llamar la categoría y usted es libre de llamarlos cualquier modo que usted quiera. Sin los soportes usted vería compilan el error que se queja de una segunda definición de la clase CCSprite. Decidí que sólo lo llamo "extensiones". These are for naming the category and you are free to name them any way you want. Without the brackets you would see compile error complaining about a second definition of the class CCSprite. I decided i just call it "extensions".

Ya que una categoría no puede añadir que las variables de miembro a una clase existente se aseguran que no hay ninguna apertura y cierre de soportes rizados. Sólo podemos definir nuevos métodos y el único que añadimos es - (CGRect) getBoundingRect;

Realización de CCSpriteExtension

El @implementation también es seguido de los soportes con el nombre de la categoría y también es llamado CCSprite.

Sólo tenemos que poner en práctica este método. En primer lugar conseguimos contentSize del elfo que es la anchura y la altura de la textura del elfo. Ya que el elfo puede ser escalado y esto cambiaría salta el rectángulo tenemos que explicar esto multiplicando la anchura y la altura con scaleX_ y scaleY_ respectivamente. Terminamos con la talla que es la talla escalada del elfo. Since the sprite can be scaled and that would change it's bounding rectangle we have to account for that by multiplying width and height with scaleX_ and scaleY_ respectively. We end up with size being the scaled size of the sprite.

Hasta ahora, bien pero también tenemos que tener en cuenta que el anchorPoint no podría estar en el centro del elfo y así el centro del rectángulo. Usted podría haber visto el mismo código, pero simplemente talla que se divide por dos en el Rayo el Juego de I-Phone simple de Wenderlich con el Seminario cocos2d - por la simplicidad esto trabaja menos mal:

CGRect targetRect = CGRectMake (
target.position.x - target.contentSize.width / 2,
target.position.y - target.contentSize.height / 2,
target.contentSize.width,
target.contentSize.height);

Pero esto supone que el anchorPoint esté en el centro del elfo. Esto no siempre puede ser el caso. Para corregir para esto simplemente multiplicamos la anchura y la altura con anchorPoint_. x y anchorPoint_. y respectivamente, en vez de suponer que los valores del anchorPoint sean 0.5f. ¿Recuerde matemáticas? La multiplicación por 0.5 es el mismo como la división en 2. To correct for this we simply multiply width and height with anchorPoint_.x and anchorPoint_.y respectively, instead of assuming that the anchorPoint's values are 0.5f. Remember math? Multiplying by 0.5 is the same as dividing by 2.

Descarga CCSpriteExtension

Descargue esta clase de extensión aquí.

Use Caso

La asunción de nosotros tiene un rectángulo que queremos probar de cualquier elfo de cruce, pasamos por la lista de elfos y llamada [elfo getBoundingRect] en ellos. Esto nos dará el rectángulo saltador del elfo en la posición del elfo, escalada a los elfos que escalan el factor y la compensación según el anchorPoint. Podemos usar entonces CGRectIntersectsRect para probar si los Rectángulos se cruzan (eg ellos chocan). We can then use CGRectIntersectsRect to test if the Rectangles intersect (eg they are colliding).

Una advertencia: ¡no apoya Rectángulos hechos girar!

Este código no toma la rotación en cuenta. Tan pronto como el elfo es hecho girar, probando de una colisión de cuadro delimitador se hace mucho más complejo.

Ver la lección siguiente para soluciones de este problema.

Comentarios (0)

2 Respuestas a “preguntas frecuentes: cocos2d para I-Phone: ¿Cómo conseguir el Cuadro delimitador de un Elfo / Rectángulo Saltador? (con Código)”

How to get a Sprite's Bounding Box / Bounding Rectangle? (with Code)”
  1. Max dice:

    Ilustración de correo. Gracias!

    Y, por supuesto, tengo unos cuantos pregunta :)

    - ¿todo es relativo, pero para el código común es mejor para usar NSString, NSArray (y pagar el coste de crear nuevos objetos) o los mudables? ¿Cuál puede ser los parámetros para elegir entre cada uno?

    - Me pregunto si el nuevo I-Phone 4.0′s mayor rendimiento será una cuestión. ¿Los juegos que dirigen suavemente en el I-Phone 1ros y 2dos dispositivos de generación correrán probablemente demasiado rápido?

    • GamingHorror dice:

      Hola Max,

      dudo que los NSMutable* datasets sean asesinos de rendimiento. No he hecho ninguna prueba pero estoy bastante seguro que si usted no los cambia en absoluto ellos funcionarán probablemente tan bueno como los no mudables. Ahora, una vez usted *do* tiene que cambiar las series o cuerdas está bien tenerlos mudable de modo que la materia sea tenida cuidado para usted entre bastidores. Por otra parte, si usted sabe que sólo creará los artículos una vez, pero nunca pedir de nuevo, quitar o añadir que los otros entonces usan los no mudables. Para mí es un asunto de caso de uso, más bien que rendimiento. Now, once you *do* need to change the arrays or strings it’s good to have them mutable so that stuff is taken care for you behind the scenes. On the other hand, if you know that you’ll only be creating the items once but never re-order, remove or add others then use the non-mutable ones. For me it’s a matter of use case rather than performance.

      Los juegos no correrán más rápido en dispositivos más nuevos. el cocos2d's CCDirector se asegura de esto. Usted mejora framerates por supuesto, pero no más rápido gameplay. Esto se mantiene para todos los motores animosos modernos. You do get better framerates of course but not faster gameplay. That holds true for all modern game engines.

Deje una Respuesta

2 Respuestas a “preguntas frecuentes: cocos2d para I-Phone: ¿Cómo conseguir el Cuadro delimitador de un Elfo / Rectángulo Saltador? (con Código)”

How to get a Sprite's Bounding Box / Bounding Rectangle? (with Code)”
  1. Max dice:

    Ilustración de correo. Gracias!

    Y, por supuesto, tengo unos cuantos pregunta :)

    - ¿todo es relativo, pero para el código común es mejor para usar NSString, NSArray (y pagar el coste de crear nuevos objetos) o los mudables? ¿Cuál puede ser los parámetros para elegir entre cada uno?

    - Me pregunto si el nuevo I-Phone 4.0′s mayor rendimiento será una cuestión. ¿Los juegos que dirigen suavemente en el I-Phone 1ros y 2dos dispositivos de generación correrán probablemente demasiado rápido?

    • GamingHorror dice:

      Hola Max,

      dudo que los NSMutable* datasets sean asesinos de rendimiento. No he hecho ninguna prueba pero estoy bastante seguro que si usted no los cambia en absoluto ellos funcionarán probablemente tan bueno como los no mudables. Ahora, una vez usted *do* tiene que cambiar las series o cuerdas está bien tenerlos mudable de modo que la materia sea tenida cuidado para usted entre bastidores. Por otra parte, si usted sabe que sólo creará los artículos una vez, pero nunca pedir de nuevo, quitar o añadir que los otros entonces usan los no mudables. Para mí es un asunto de caso de uso, más bien que rendimiento. Now, once you *do* need to change the arrays or strings it’s good to have them mutable so that stuff is taken care for you behind the scenes. On the other hand, if you know that you’ll only be creating the items once but never re-order, remove or add others then use the non-mutable ones. For me it’s a matter of use case rather than performance.

      Los juegos no correrán más rápido en dispositivos más nuevos. el cocos2d's CCDirector se asegura de esto. Usted mejora framerates por supuesto, pero no más rápido gameplay. Esto se mantiene para todos los motores animosos modernos. You do get better framerates of course but not faster gameplay. That holds true for all modern game engines.

Deje una Respuesta

premio wordpress temas