[Ayuda] TileMap (Parallax Scrolling)

Iniciado por sebah97, 27 Julio 2010, 00:57 AM

0 Miembros y 1 Visitante están viendo este tema.

sebah97

Hola, eh intentado crear un tilemap y lo eh conseguido (Dejo el Código)

Código (vb) [Seleccionar]
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Const SRCCOPY = &HCC0020
Private Const SRCERASE = &H440328
Private Const SRCINVERT = &H660046
Private Const SRCPAINT = &HEE0086
Private Const SRCAND = &H8800C6
Private Const CLR_WATER = &HFF
Private Const CLR_GRASS = &HFF00
Private Const CLR_DIRT = &HC0C000
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Private Declare Function SetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long


Public Sub DibujarMapa()




For y = 0 To 15
For x = 0 To 15

z = GetPixel(Form1.Picture2.hdc, x, y)
Debug.Print z

Select Case z


    Case RGB(0, 0, 255)
   
        EsAgua x * 32, y * 32
       

    Case RGB(128, 128, 128)
   
        EsCamino x * 32, y * 32
       
   
    Case RGB(0, 255, 0)
   
        EsLlegada x * 32, y * 32

End Select

Next x
Next y

End Sub
Sub EsAgua(x, y)


BitBlt Form1.Render.hdc, x, y, 32, 32, Form1.pic(0).hdc, 0, 0, SRCCOPY



End Sub
Sub EsLlegada(x, y)


BitBlt Form1.Render.hdc, x, y, 32, 32, Form1.pic(1).hdc, 0, 0, SRCCOPY

End Sub
Sub EsCamino(x, y)



BitBlt Form1.Render.hdc, x, y, 32, 32, Form1.pic(2).hdc, 0, 0, SRCCOPY

End Sub


Y Funciona muy Bien (Les dejo una Foto)



(Si se dan Cuenta, lo que hace es Leer Pixel x Pixel la imagen del picture 2, y depende a que pixel sea, Carga una textura.)

Bien, pero Ahora mi Duda:

¿Como Hago para hacer una especie de Parallax Scrolling? Porque de esta manera solo estaria limitando al mapa a ese tamaño que ustedes ven ):?

Bien, espero que me puedan ayudar, y gracias de AnteMano :)

ignorantev1.1

Y si utilizaras 2 variables auxiliares, para el origen, "Ox" y "Oy", que seria el lugar apartir de donde se comenzaria a leer el "picture2"?

Código (vb) [Seleccionar]

Private sub Form_Load()
Ox=0
Oy=0
end sub

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
        if keycode=37 and Ox>0 then Ox=Ox-1
        if keycode=38 and Oy>0 then Oy=Oy-1
        if keycode=39 and Ox<picture2.width then Ox=Ox+1
        if keycode=40 and Oy<picture2.height then Oy=Oy+1
End Sub



Código (vb) [Seleccionar]


For y = 0 To 15
For x = 0 To 15

z = GetPixel(Form1.Picture2.hdc,Ox + x, Oy + y)
Debug.Print z

Select Case z


    Case RGB(0, 0, 255)

        EsAgua x * 32, y * 32


    Case RGB(128, 128, 128)

        EsCamino x * 32, y * 32


    Case RGB(0, 255, 0)

        EsLlegada x * 32, y * 32

End Select

Next x
Next y


sebah97

Hola, primero que nada gracias por responder, pero probé el código y no me funciona :S

Algien tiene otra idea ??

seba123neo

La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

ignorantev1.1

Código (vb) [Seleccionar]

  Dim Ox As Integer
Dim oY As Integer
Dim sizMap As Integer

Private Sub Form_Load()
    pic(0).Visible = False
    pic(1).Visible = False
    pic(2).Visible = False
    picture2.Visible = False
    pic(0).ScaleMode = 3
    pic(1).ScaleMode = 3
    pic(2).ScaleMode = 3
    picture2.ScaleMode = 3
    pic(0).BorderStyle = 0
    pic(1).BorderStyle = 0
    pic(2).BorderStyle = 0
    picture2.BorderStyle = 0
    pic(0).AutoSize = True
    pic(1).AutoSize = True
    pic(2).AutoSize = True
    picture2.AutoSize = True
    Me.ScaleMode = 3
    Me.AutoRedraw = True
   
    Ox = 0
    oY = 0
    sizMap = 15
    Call DibujarMapa
End Sub

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = 37 And Ox > 0 Then Ox = Ox - 1
    If KeyCode = 38 And oY > 0 Then oY = oY - 1
    If KeyCode = 39 And Ox < picture2.Width - sizMap Then Ox = Ox + 1
    If KeyCode = 40 And oY < picture2.Height - sizMap Then oY = oY + 1
    Call DibujarMapa
End Sub
Public Sub DibujarMapa()
Me.Cls
For y = 0 To sizMap
For x = 0 To sizMap

z = picture2.Point(Ox + x, oY + y)
Debug.Print z

Select Case z


    Case RGB(0, 0, 255)

        EsAgua x * 32, y * 32


    Case RGB(128, 128, 128)

        EsCamino x * 32, y * 32


    Case RGB(0, 255, 0)

        EsLlegada x * 32, y * 32

End Select

Next x
Next y

End Sub
Sub EsAgua(x, y)
Me.PaintPicture pic(0), x, y, 32, 32
End Sub
Sub EsLlegada(x, y)
    Me.PaintPicture pic(1), x, y, 32, 32
End Sub
Sub EsCamino(x, y)
    Me.PaintPicture pic(2), x, y, 32, 32
End Sub


Sin Apis...

BlackZeroX

.
Es mucho mejor con Apis... pero si es muy serio entonces seria con DirectX y/o OpenGL!¡.

Dulces Lunas!¡.
The Dark Shadow is my passion.

sebah97

Cita de: BlackZeroX en 27 Julio 2010, 05:45 AM
.
Es mucho mejor con Apis... pero si es muy serio entonces seria con DirectX y/o OpenGL!¡.

Dulces Lunas!¡.

Si, tenes razon, es mejor con OpenGl o DirectX, pero yo quiero empezar por asi decirlo "UN MOTOR" (SI así se le puede llamar) desde 0  :xD

Y Con Respecto al Parallax Scrolling, no lo pude hacer funcionar :(

Una idea mia era cargar todo el mapa en la memoria, y a medida que aprieto tal tecla, lo ba mostrando de a partes.

Pero nose si funciona, y si funcionara, no sabría como hacerlo  :-\

BlackZeroX

#7
manejalo por niveles

digamos que tienes

Nivel 1  <-- Compo mas cercano
Nivel 2  <-- campo donde esta el personaje
Nivel 3  <-- Nose digamos que montañas o algo al fondo
Nivel 4  <-- Fondo

así en el campo mas cercano tiene velocidad "N"
en niveles mas superiores (es decir con mayor profundidad) solo divides siendo cada nivel divisible entre 3 por decir algo

así

N 1 = N
N 2 = N/3
N 3 = N/3/3
N 4 = N/3/3/3
N X = N/3/.../X-1

P.D.: Mientras mas nivel mas lento su desplazamiento (X,Y y si es  3D incluyendo a Z)!¡.

Dulces Lunas!¡.
The Dark Shadow is my passion.

LeandroA

Hola, lo primero que tienes que hacer es que crear un editor de mapa y luego el juego, el editor de mapa lo que deve hacer es crear una matriz de dos dimenciones M(X,Y) el editor deve cargar en cada datos de esa matriz un valor el cual corresponde a una imagen, esta matriz la guardas en un archivo la cual despues leera el juego
luego el segun el movimiento del personaje tienes que pintar el hdc con los elementos correspondientes de la matriz, podes crear un mapa tan grande como quieras vos en el hdc solo vas a pintar solo la cantidad de fragmentos que entren en el hdc
no uses getpixel (es muy lento e insesario) vos con los valores de la matriz ya vas a saber a que corresponde cada elemento si es solido, agua, etc.

se entiende?

Saludos.

sebah97

Hola, Gracias a todos, ya solucioné el tema del Parallax.

Bien, Ya que estamos, para no crear otro tema, Como hago para Guardar el Contenido de un  IMAGE ?? (No Confundan con PictureBox !! )

Bien, gracias y espero que Respuestas.

Desde ya Muchas gracias