Test Foro de elhacker.net SMF 2.1

Programación => .NET (C#, VB.NET, ASP) => Programación General => Programación Visual Basic => Mensaje iniciado por: sebah97 en 27 Julio 2010, 00:57 AM

Título: [Ayuda] TileMap (Parallax Scrolling)
Publicado por: sebah97 en 27 Julio 2010, 00:57 AM
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)

(http://img28.imageshack.us/img28/4338/dibujoujc.png)

(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 :)
Título: Re: [Ayuda] TileMap (Parallax Scrolling)
Publicado por: ignorantev1.1 en 27 Julio 2010, 02:20 AM
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

Título: Re: [Ayuda] TileMap (Parallax Scrolling)
Publicado por: sebah97 en 27 Julio 2010, 02:44 AM
Hola, primero que nada gracias por responder, pero probé el código y no me funciona :S

Algien tiene otra idea ??
Título: Re: [Ayuda] TileMap (Parallax Scrolling)
Publicado por: seba123neo en 27 Julio 2010, 04:16 AM
chequea esto:

Parallax Scrolling (http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=63962&lngWId=1)
Título: Re: [Ayuda] TileMap (Parallax Scrolling)
Publicado por: ignorantev1.1 en 27 Julio 2010, 04:24 AM
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...
Título: Re: [Ayuda] TileMap (Parallax Scrolling)
Publicado por: 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!¡.
Título: Re: [Ayuda] TileMap (Parallax Scrolling)
Publicado por: sebah97 en 27 Julio 2010, 06:56 AM
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  :-\
Título: Re: [Ayuda] TileMap (Parallax Scrolling)
Publicado por: BlackZeroX en 27 Julio 2010, 09:00 AM
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!¡.
Título: Re: [Ayuda] TileMap (Parallax Scrolling)
Publicado por: LeandroA en 27 Julio 2010, 11:59 AM
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.
Título: Re: [Ayuda] TileMap (Parallax Scrolling)
Publicado por: sebah97 en 30 Julio 2010, 04:37 AM
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
Título: Re: [Ayuda] TileMap (Parallax Scrolling)
Publicado por: BlackZeroX en 30 Julio 2010, 05:59 AM
Guardalo en un stdpicture (  private/dim/public/global/ variable as stdpicture) o cargalo en un hdc (CreateCompatibleDC, etc...)

Dulces Lunas!¡.
Título: Re: [Ayuda] TileMap (Parallax Scrolling)
Publicado por: BlackZeroX en 30 Julio 2010, 06:14 AM
ejemplo del post anterior

Código (vb) [Seleccionar]



Private Priv_stdPic As StdPicture       '   //  Instancia o huevo vacio xP.

Private Sub Form_Load()
    Me.Picture = LoadPicture("c:\AmazingNurseNanako03.jpg")    '   //  cargamos imagen en el formulario como fondo xP.
    '   //  se hace una copia en MEMORIA!¡.
    Set Priv_stdPic = Me.Picture
End Sub

Private Sub Form_Click()
    With Priv_stdPic            '   //  Obtenemos los datos
        Call MsgBox(.Height)    '   //  Ya sabes que es xP
        Call MsgBox(.Width)     '   //  Ya sabes que es xP
        Set Picture = Nothing
        Call MsgBox("Se a limpiado el FORM!¡.")
    End With
    Set Me.Picture = Priv_stdPic
End Sub



Sangriento Infierno Lunar!¡.
Título: Re: [Ayuda] TileMap (Parallax Scrolling)
Publicado por: sebah97 en 31 Julio 2010, 01:48 AM
Hola BlackZeroX, gracias por responder, pero creo que me expresé Mal.

Lo que quiero yo es Guardar el Picture de un Control IMAGE, en el disco, intente con SavePicture, pero no anda.
Título: Re: [Ayuda] TileMap (Parallax Scrolling)
Publicado por: BlackZeroX en 31 Julio 2010, 02:14 AM
extraño a mi si me anda!¡

Código (vb) [Seleccionar]


Call SavePicture(Image1.Picture, "c:\aaa.jpg")



Dulces Lunas!¡.
Título: Re: [Ayuda] TileMap (Parallax Scrolling)
Publicado por: sebah97 en 31 Julio 2010, 02:23 AM
Gracias, Funcionó, nosé que hacia de mal yo xD.

Pero ahora surgio otro problema, yo tengo la propiedad STRETCH del image en TRUE, pero cuando la guardo, osea se genera como la foto original, y yo quisiera que la guarde tal como se ve en el control (Osea con el mismo tamaño del Control Image).

Espero que me entiendan, y gracias de antemano
Título: Re: [Ayuda] TileMap (Parallax Scrolling)
Publicado por: BlackZeroX en 31 Julio 2010, 02:53 AM
Para eso puedes usa la función render de la propiedad picture, para guardarlo en un hdc ( De un control Picture por ejemplo, con autoredraw = true, depsues le pasas un savepicture() y ya, es lo mas cutre pero sirve )!¡.

ejemplo:

Código (vb) [Seleccionar]


   With Obj_Pic
       call .Render (destDC Or 0&, 0&, 0&, ScaleX(.Width, vbHimetric, vbPixels), ScaleY(.Height, vbHimetric, vbPixels), _
           0&, .Height, .Width, -.Height, ByVal 0&)
   End With



P.D.: En el foro hay un código de Leandro A, búscale, qué yo me estoy centrando en los controles mas que en APIS (en tu problema)!¡.

Dulces Lunas!¡.