¿Es posible dibujar un círculo lleno con cocos2d? Se puede hacer un círculo contorneado utilizando la función drawCircle(), pero ¿hay alguna manera de llenarlo con un cierto color? ¿Quizás usando OpenGL puro?Cómo dibujar un círculo sólido con cocos2d para iPhone
Respuesta
Mira en:
- CGContextAddArc
- CGContextFillPath
Estos se permitirá llenar un círculo sin necesidad de OpenGL
También me pregunto esto, pero realmente no han logrado haciéndolo. Traté de usar CGContext cosas que Grouchal propina arriba, pero no puedo conseguir que dibuje nada en la pantalla. Esto es lo que he intentado:
-(void) draw
{
[self makestuff:UIGraphicsGetCurrentContext()];
}
-(void)makestuff:(CGContextRef)context
{
// Drawing lines with a white stroke color
CGContextSetRGBStrokeColor(context, 1.0, 1.0, 1.0, 1.0);
// Draw them with a 2.0 stroke width so they are a bit more visible.
CGContextSetLineWidth(context, 2.0);
// Draw a single line from left to right
CGContextMoveToPoint(context, 10.0, 30.0);
CGContextAddLineToPoint(context, 310.0, 30.0);
CGContextStrokePath(context);
// Draw a connected sequence of line segments
CGPoint addLines[] =
{
CGPointMake(10.0, 90.0),
CGPointMake(70.0, 60.0),
CGPointMake(130.0, 90.0),
CGPointMake(190.0, 60.0),
CGPointMake(250.0, 90.0),
CGPointMake(310.0, 60.0),
};
// Bulk call to add lines to the current path.
// Equivalent to MoveToPoint(points[0]); for(i=1; i<count; ++i) AddLineToPoint(points[i]);
CGContextAddLines(context, addLines, sizeof(addLines)/sizeof(addLines[0]));
CGContextStrokePath(context);
// Draw a series of line segments. Each pair of points is a segment
CGPoint strokeSegments[] =
{
CGPointMake(10.0, 150.0),
CGPointMake(70.0, 120.0),
CGPointMake(130.0, 150.0),
CGPointMake(190.0, 120.0),
CGPointMake(250.0, 150.0),
CGPointMake(310.0, 120.0),
};
// Bulk call to stroke a sequence of line segments.
// Equivalent to for(i=0; i<count; i+=2) { MoveToPoint(point[i]); AddLineToPoint(point[i+1]); StrokePath(); }
CGContextStrokeLineSegments(context, strokeSegments, sizeof(strokeSegments)/sizeof(strokeSegments[0]));
}
Estos métodos están definidos en una clase de nodo de cocos, y el método makestuff me prestó un ejemplo de código ...
NOTA: Estoy intentando dibujar cualquier forma o camino y llenarlo. Sé que el código anterior solo dibuja líneas, pero no quise continuar hasta que lo hice funcionar.
EDITAR: Esto es probablemente una solución horrible, pero creo que esto al menos funcionaría.
Cada CocosNode tiene una textura (Texture2D *). La clase Texture2D se puede inicializar desde un UIImage. UIImage se puede inicializar desde un CGImageRef. Es posible crear un contexto CGImageRef para la lib de cuarzo.
Por lo tanto, lo que haría es:
- Crear el contexto CGImageRef para el cuarzo
- dibujan en esta imagen con cuarzo
- inicializar un UIImage con este CGImageRef
- Hacer un Texture2D que es inicializado con esa imagen
- Establezca la textura de un CocosNode en esa instancia de Texture2D
La pregunta es si esto sería lo suficientemente rápido como para hacerlo. Preferiría si pudieras obtener un CGImageRef directamente del CocosNode y dibujar en él en lugar de seguir todos estos pasos, pero todavía no he encontrado la manera de hacerlo (y soy un novato en esto por lo que es difícil llegar a algún lugar en absoluto).
En DrawingPrimitives.m, cambie esto en drawCricle:
glDrawArrays(GL_LINE_STRIP, 0, segs+additionalSegment);
a:
glDrawArrays(GL_TRIANGLE_FAN, 0, segs+additionalSegment);
Usted puede leer más acerca de OpenGL aquí: http://www.informit.com/articles/article.aspx?p=461848
Aquí hay una ligera modificación de ccDrawCircle () que te permite dibujar cualquier porción de un círculo. Se adhieren esto en CCDrawingPrimitives.m y también añadir la información de cabecera método para CCDrawingPrimitives.h:
Parámetros: a
: ángulo inicial en radianes, d
: delta o cambio en el ángulo en radianes (uso 2*M_PI
para un círculo completo)
Los cambios se comentan
void ccDrawFilledCircle(CGPoint center, float r, float a, float d, NSUInteger totalSegs)
{
int additionalSegment = 2;
const float coef = 2.0f * (float)M_PI/totalSegs;
NSUInteger segs = d/coef;
segs++; //Rather draw over than not draw enough
if (d == 0) return;
GLfloat *vertices = calloc(sizeof(GLfloat)*2*(segs+2), 1);
if(! vertices)
return;
for(NSUInteger i=0;i<=segs;i++)
{
float rads = i*coef;
GLfloat j = r * cosf(rads + a) + center.x;
GLfloat k = r * sinf(rads + a) + center.y;
//Leave first 2 spots for origin
vertices[2+ i*2] = j * CC_CONTENT_SCALE_FACTOR();
vertices[2+ i*2+1] =k * CC_CONTENT_SCALE_FACTOR();
}
//Put origin vertices into first 2 spots
vertices[0] = center.x * CC_CONTENT_SCALE_FACTOR();
vertices[1] = center.y * CC_CONTENT_SCALE_FACTOR();
// Default GL states: GL_TEXTURE_2D, GL_VERTEX_ARRAY, GL_COLOR_ARRAY, GL_TEXTURE_COORD_ARRAY
// Needed states: GL_VERTEX_ARRAY,
// Unneeded states: GL_TEXTURE_2D, GL_TEXTURE_COORD_ARRAY, GL_COLOR_ARRAY
glDisable(GL_TEXTURE_2D);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, vertices);
//Change to fan
glDrawArrays(GL_TRIANGLE_FAN, 0, segs+additionalSegment);
// restore default state
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_TEXTURE_2D);
free(vertices);
}
utilicé esta manera a continuación.
glLineWidth(2);
for(int i=0;i<50;i++){
ccDrawCircle(ccp(s.width/2, s.height/2), i,0, 50, NO);
}
Hice múltiples círculos con para el bucle y parece un círculo relleno.
hay una nueva función en cocos2d CCDrawingPrimitives
llamada ccDrawSolidCircle(CGPoint center, float r, NSUInteger segs)
. Para aquellos que buscan en este momento, utilizar este método en lugar, entonces usted no tiene que meterse con el código cocos2d, basta con importar CCDrawingPrimitives.h
- 1. Cómo dibujar un círculo concéntrico en iphone?
- 2. Usar alfa de textura para dibujar un color sólido
- 3. ¿Cómo dibujar un círculo transparente?
- 4. dibujar un círculo lleno
- 5. Cocos2d: ¿sprite rectangular de color sólido?
- 6. Cómo dibujar un fondo rápido en cocos2d?
- 7. Cómo dibujar un círculo lleno en Java?
- 8. Cómo dibujar un círculo con un color específico en XNA?
- 9. Cómo trazar una línea con Cocos2d-iPhone
- 10. WPF: ¿Cómo dibujar un círculo y arrastrarlo?
- 11. Dibujar círculo en Android
- 12. Cómo dibujar un círculo con particionado en Android?
- 13. Dibujar círculo simple en XNA
- 14. Cómo dibujar un Círculo de aspecto decente en Java
- 15. Cómo dibujar un círculo comenzando en la parte superior
- 16. iPhone: Proyecto Learning Cocos2D
- 17. OpenGL GLSL Shader: dibujar un círculo en un polígono plano
- 18. Cómo dibujar un círculo en img usando php?
- 19. Sparrow o Cocos2D para iPhone 2D juego?
- 20. Dibuja parte de un círculo
- 21. trazar un círculo con pyplot
- 22. Acción de suavizado personalizada con Cocos2D-iphone
- 23. arrastre suavemente un Sprite en cocos2d - iPhone
- 24. Múltiples gestos para UIGestureRecognizers (iPhone, Cocos2d)
- 25. SÓLIDO para programación funcional
- 26. Dibujar arco con 2 puntos y el centro del círculo
- 27. Dibujar texto en superposición de círculo
- 28. ¿Cómo dibujar una elipse o círculo a mano alzada?
- 29. cocos2d: Cómo configurar un temporizador
- 30. as3: dibuja un círculo con un agujero con solo actionscript