Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Funcion Map_CopyRects

Iniciado por Pilton88, 06 de Mayo de 2007, 11:04:37 PM

« anterior - próximo »

Pilton88

Como andan? Bueno... vengo a volcar mis dudas aca, para ver si me pueden dar una mano.

'General
Private dx As dx_GFX_Class
Private Sprite(1) As Long


Private Sub Form_Load()
Dim Looping As Boolean
Dim Zona(1) As GFX_Rect
Zona(0).X = 300
Zona(0).Y = 300
Zona(0).Width = 100
Zona(0).Height = 100
Looping = True
Me.Show
Set dx = New dx_GFX_Class
Dim Vertices(1) As Vertex
'Vertice izquierda superior
Vertices(0).X = 0
Vertices(0).Y = 0
Vertices(0).Z = -8
Vertices(0).Color = dx.ARGB_Set(255, 255, 255, 255)
'Vertice derecha superior
Vertices(1).X = 100
Vertices(1).Y = 0
Vertices(1).Z = -8
Vertices(1).Color = dx.ARGB_Set(255, 255, 255, 255)
'Vertice inferior izquierdo
Vertices(2).X = 0
Vertices(2).Y = 100
Vertices(2).Z = -8
Vertices(2).Color = dx.ARGB_Set(255, 255, 255, 255)
'Vertice inferior derecho
Vertices(3).X = 100
Vertices(3).Y = 100
Vertices(3).Z = -8
Vertices(3).Color = dx.ARGB_Set(255, 255, 255, 255)

If dx.Init(Me.hWnd, Form1.ScaleWidth, Form1.ScaleHeight, , True) = False Then
   MsgBox "No se pudo ejecutar el juego correctamente."
   Exit Sub
End If
Sprite(0) = dx.MAP_Load("C:\milton.jpg", 0)
Sprite(1) = dx.MAP_Load("C:\milton.jpg", 0)

If dx.MAP_CopyRects(Sprite(0), Sprite(1), Zona, Vertices) = False Then
   MsgBox "No se pudo copiar una region de un grafico a la otra."
   Exit Sub
End If

While Looping = True
   dx.DRAW_Map Sprite(1), 0, 0, -8, 500, 500
   dx.Frame
Wend
End Sub


Desde ya les digo que no tiene sentido el codigo... en realidad, lo que quiero hacer es, copiar una region de un Sprite (grafico), a otro... y ese otro, mostrarlo (ya modificado). Entonces... recurri a la funcion copyrects...
Yo tengo entendido que vertices son las extremidades de un poligono (como un rectangulo en este caso).
Y respecto a las zonas (GFX_Rect):
Dim Zona(1) As GFX_Rect
Zona(0).X = 300
Zona(0).Y = 300
Zona(0).Width = 100
Zona(0).Height = 100


Yo tengo entendido que, definis una posicion x, una posicion y (de una imagen), y Width se refiere al ancho que cubrira, y Height a lo alto... o me equivoco?(el alto se dibuja hacia arriba, o hacia abajo?)
Bueno, si algo hice mal... o me faltan cosas, o si entendi mal, agradeceria toda ayuda que aporten.
Desde ya gracias!

[EX3]

Cita de: "Pilton88"Yo tengo entendido que vertices son las extremidades de un poligono (como un rectangulo en este caso).
Seria correcta tu definicion, pero en este caso y como menciona la documentacion de esta funcion, la lista de vertices solo indica la posicion de dibujo correspondiente a cada region definida en el parametro SrcRect(), no a las dimensiones o area que ocupara la region en el mapa de destino, no se si me explico. Tu cuando dibujas algo siempre indicas una posicion horizontal X y una posicion vertical Y. En este caso usas el parametro DestPixel() para definir las posiciones de dibujo de cada region, si defines 3 regiones tienes que definir 3 vertices para ubicar las regiones.

Cita de: "Pilton88"Y respecto a las zonas (GFX_Rect):
Dim Zona(1) As GFX_Rect
Zona(0).X = 300
Zona(0).Y = 300
Zona(0).Width = 100
Zona(0).Height = 100


Yo tengo entendido que, definis una posicion x, una posicion y (de una imagen), y Width se refiere al ancho que cubrira, y Height a lo alto... o me equivoco?(el alto se dibuja hacia arriba, o hacia abajo?)
El parametro SrcRect(), al que te refieres en el codigo, define las regiones o porciones del mapa de origen que vas a copiar en el mapa destino. Referente a lo de la altura, generalmente siempre se toma el origen x0y0 como la esquina superior izquierda, asi que por logica la altura se define hacia abajo.

En vez de usar CopyRects() podrias intentar trabajar con RenderTargets ya que resulta mucho mas comodo y permite mas libertad para dibujar pudiendo hacer escalados o rotaciones entre otras opciones, lo mismo que si dibujaras sobre la pantalla. Mirate el tutorial 8 de graficos que ilustra el tema de forma clara.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Pilton88

Cita de: "[EX3"]
Cita de: "Pilton88"Yo tengo entendido que vertices son las extremidades de un poligono (como un rectangulo en este caso).
Seria correcta tu definicion, pero en este caso y como menciona la documentacion de esta funcion, la lista de vertices solo indica la posicion de dibujo correspondiente a cada region definida en el parametro SrcRect(), no a las dimensiones o area que ocupara la region en el mapa de destino, no se si me explico. Tu cuando dibujas algo siempre indicas una posicion horizontal X y una posicion vertical Y. En este caso usas el parametro DestPixel() para definir las posiciones de dibujo de cada region, si defines 3 regiones tienes que definir 3 vertices para ubicar las regiones.

Cita de: "Pilton88"Y respecto a las zonas (GFX_Rect):
Dim Zona(1) As GFX_Rect
Zona(0).X = 300
Zona(0).Y = 300
Zona(0).Width = 100
Zona(0).Height = 100


Yo tengo entendido que, definis una posicion x, una posicion y (de una imagen), y Width se refiere al ancho que cubrira, y Height a lo alto... o me equivoco?(el alto se dibuja hacia arriba, o hacia abajo?)
El parametro SrcRect(), al que te refieres en el codigo, define las regiones o porciones del mapa de origen que vas a copiar en el mapa destino. Referente a lo de la altura, generalmente siempre se toma el origen x0y0 como la esquina superior izquierda, asi que por logica la altura se define hacia abajo.

En vez de usar CopyRects() podrias intentar trabajar con RenderTargets ya que resulta mucho mas comodo y permite mas libertad para dibujar pudiendo hacer escalados o rotaciones entre otras opciones, lo mismo que si dibujaras sobre la pantalla. Mirate el tutorial 8 de graficos que ilustra el tema de forma clara.

Salu2...

Me parece que entendi bien... o sea, por cada region que cree, tendre que crear un vertice, que contendra las cordenadas x e y donde se insertara tal region.
El codigo quedo asi por lo tanto: (si es que entendi bien)
Private dx As dx_GFX_Class
Private Sprite(1) As Long


Private Sub Form_Load()
Dim Looping As Boolean
Dim Zona(0) As GFX_Rect
Zona(0).X = 300
Zona(0).Y = 300
Zona(0).Width = 100
Zona(0).Height = 100
Looping = True
Me.Show
Set dx = New dx_GFX_Class
Dim Vertices(0) As Vertex
Vertices(0).X = 0
Vertices(0).Y = 0
Vertices(0).Z = -8
Vertices(0).Color = dx.ARGB_Set(255, 255, 255, 255)
If dx.Init(Me.hWnd, frmPlantilla.ScaleWidth, frmPlantilla.ScaleHeight, , True) = False Then
   MsgBox "No se pudo ejecutar el juego correctamente."
   Exit Sub
End If
Sprite(0) = dx.MAP_Load("C:\milton.jpg", 0)
Sprite(1) = dx.MAP_Load("C:\milton.jpg", 0)

If dx.MAP_CopyRects(Sprite(0), Sprite(1), Zona, Vertices) = False Then
   MsgBox "No se pudo copiar una region de un grafico a la otra."
   Exit Sub
End If

While Looping = True
   dx.DRAW_Map Sprite(1), 0, 0, -8, 500, 500
   dx.Frame
Wend
End Sub


En este caso, la funcion MAP_CopyRects me tira false.

Dim Zona(0) As GFX_Rect
Zona(0).X = 300
Zona(0).Y = 300
Zona(0).Width = 100
Zona(0).Height = 100


Acá creé una zona, de 100 x 100, en las coords. X=300 y Y=300.

Y respecto a los vertices:

Dim Vertices(0) As Vertex
Vertices(0).X = 0
Vertices(0).Y = 0
Vertices(0).Z = -8
Vertices(0).Color = dx.ARGB_Set(255, 255, 255, 255)


Cree este... para la zona que mostre anteriormente.
Tal vez haya algo que no entienda.

PD: Gracias por avisarme lo de los Render Targets. pero me gustaria igualmente entender en que me estoy equivocando.

[EX3]

Que tamaño tiene la imagen que estas troceando? Me parece que CopyRects() daba error si se intentaba copiar una region cuyos valores sobrepasan las dimensiones de la imagen original al igual que los de la imagen de destino. Otro detalle, la coordenada Z al igual que el miebro Color del tipo Vertex no se tienen en cuenta al usar CopyRects(), lo digo por que las he visto definidas en el parametro de vertices de tu codigo (tampoco generan error por estar definidas ya que no se toman en cuenta su valor)

El tema de decirte que usaras los RenderTarget es por que recuerdo que alguna vez tuve algun que otro problemilla con esta funcion y a parte por lo incomoda que resulta (realmente ni la uso yo pero la mantengo por compatibilidad con versiones anteriores por si alguien la sigue usando en algun programa de hace tiempo) Con los RenderTargets haces lo mismo pero de forma mas comoda y si son regiones concretas de un mapa lo que deseas dibujar en ellos o en pantalla puedes definir dicha region con MAP_SetRegion() que se encarga de configurar las funciones de dibujo de mapas para dibujen solo la region especificada del mapa.

Asi en principio no veo nada mal en tu codigo y posiblemente sea error de dx_lib32. Yo tampoco he logrado hacer andar tu codigo.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Pilton88

Doy las gracias a que no me he equivocado, y menos en algo tonto.
Gracias por la informacion EX3. La imagen te informo.. que es de 452 x 603.
Un abrazo.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.