Foro de elhacker.net

Programación => 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
  1. 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
  2. Private Const SRCCOPY = &HCC0020
  3. Private Const SRCERASE = &H440328
  4. Private Const SRCINVERT = &H660046
  5. Private Const SRCPAINT = &HEE0086
  6. Private Const SRCAND = &H8800C6
  7. Private Const CLR_WATER = &HFF
  8. Private Const CLR_GRASS = &HFF00
  9. Private Const CLR_DIRT = &HC0C000
  10. Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
  11. Private Declare Function SetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long
  12.  
  13.  
  14. Public Sub DibujarMapa()
  15.  
  16.  
  17.  
  18.  
  19. For y = 0 To 15
  20. For x = 0 To 15
  21.  
  22. z = GetPixel(Form1.Picture2.hdc, x, y)
  23. Debug.Print z
  24.  
  25. Select Case z
  26.  
  27.  
  28.    Case RGB(0, 0, 255)
  29.  
  30.        EsAgua x * 32, y * 32
  31.  
  32.  
  33.    Case RGB(128, 128, 128)
  34.  
  35.        EsCamino x * 32, y * 32
  36.  
  37.  
  38.    Case RGB(0, 255, 0)
  39.  
  40.        EsLlegada x * 32, y * 32
  41.  
  42. End Select
  43.  
  44. Next x
  45. Next y
  46.  
  47. End Sub
  48. Sub EsAgua(x, y)
  49.  
  50.  
  51. BitBlt Form1.Render.hdc, x, y, 32, 32, Form1.pic(0).hdc, 0, 0, SRCCOPY
  52.  
  53.  
  54.  
  55. End Sub
  56. Sub EsLlegada(x, y)
  57.  
  58.  
  59. BitBlt Form1.Render.hdc, x, y, 32, 32, Form1.pic(1).hdc, 0, 0, SRCCOPY
  60.  
  61. End Sub
  62. Sub EsCamino(x, y)
  63.  
  64.  
  65.  
  66. BitBlt Form1.Render.hdc, x, y, 32, 32, Form1.pic(2).hdc, 0, 0, SRCCOPY
  67.  
  68. End Sub
  69.  

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
  1. Private sub Form_Load()
  2. Ox=0
  3. Oy=0
  4. end sub
  5.  
  6. Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  7.        if keycode=37 and Ox>0 then Ox=Ox-1
  8.        if keycode=38 and Oy>0 then Oy=Oy-1
  9.        if keycode=39 and Ox<picture2.width then Ox=Ox+1
  10.        if keycode=40 and Oy<picture2.height then Oy=Oy+1
  11. End Sub
  12.  
  13.  

Código
  1.  
  2. For y = 0 To 15
  3. For x = 0 To 15
  4.  
  5. z = GetPixel(Form1.Picture2.hdc,Ox + x, Oy + y)
  6. Debug.Print z
  7.  
  8. Select Case z
  9.  
  10.  
  11.    Case RGB(0, 0, 255)
  12.  
  13.        EsAgua x * 32, y * 32
  14.  
  15.  
  16.    Case RGB(128, 128, 128)
  17.  
  18.        EsCamino x * 32, y * 32
  19.  
  20.  
  21.    Case RGB(0, 255, 0)
  22.  
  23.        EsLlegada x * 32, y * 32
  24.  
  25. End Select
  26.  
  27. Next x
  28. Next y
  29.  
  30.  


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
  1.  Dim Ox As Integer
  2. Dim oY As Integer
  3. Dim sizMap As Integer
  4.  
  5. Private Sub Form_Load()
  6.    pic(0).Visible = False
  7.    pic(1).Visible = False
  8.    pic(2).Visible = False
  9.    picture2.Visible = False
  10.    pic(0).ScaleMode = 3
  11.    pic(1).ScaleMode = 3
  12.    pic(2).ScaleMode = 3
  13.    picture2.ScaleMode = 3
  14.    pic(0).BorderStyle = 0
  15.    pic(1).BorderStyle = 0
  16.    pic(2).BorderStyle = 0
  17.    picture2.BorderStyle = 0
  18.    pic(0).AutoSize = True
  19.    pic(1).AutoSize = True
  20.    pic(2).AutoSize = True
  21.    picture2.AutoSize = True
  22.    Me.ScaleMode = 3
  23.    Me.AutoRedraw = True
  24.  
  25.    Ox = 0
  26.    oY = 0
  27.    sizMap = 15
  28.    Call DibujarMapa
  29. End Sub
  30.  
  31. Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  32.    If KeyCode = 37 And Ox > 0 Then Ox = Ox - 1
  33.    If KeyCode = 38 And oY > 0 Then oY = oY - 1
  34.    If KeyCode = 39 And Ox < picture2.Width - sizMap Then Ox = Ox + 1
  35.    If KeyCode = 40 And oY < picture2.Height - sizMap Then oY = oY + 1
  36.    Call DibujarMapa
  37. End Sub
  38. Public Sub DibujarMapa()
  39. Me.Cls
  40. For y = 0 To sizMap
  41. For x = 0 To sizMap
  42.  
  43. z = picture2.Point(Ox + x, oY + y)
  44. Debug.Print z
  45.  
  46. Select Case z
  47.  
  48.  
  49.    Case RGB(0, 0, 255)
  50.  
  51.        EsAgua x * 32, y * 32
  52.  
  53.  
  54.    Case RGB(128, 128, 128)
  55.  
  56.        EsCamino x * 32, y * 32
  57.  
  58.  
  59.    Case RGB(0, 255, 0)
  60.  
  61.        EsLlegada x * 32, y * 32
  62.  
  63. End Select
  64.  
  65. Next x
  66. Next y
  67.  
  68. End Sub
  69. Sub EsAgua(x, y)
  70. Me.PaintPicture pic(0), x, y, 32, 32
  71. End Sub
  72. Sub EsLlegada(x, y)
  73.    Me.PaintPicture pic(1), x, y, 32, 32
  74. End Sub
  75. Sub EsCamino(x, y)
  76.    Me.PaintPicture pic(2), x, y, 32, 32
  77. End Sub
  78.  

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
.
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 saver 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
  1.  
  2.  
  3. Private Priv_stdPic As StdPicture       '   //  Instancia o huevo vacio xP.
  4.  
  5. Private Sub Form_Load()
  6.    Me.Picture = LoadPicture("c:\AmazingNurseNanako03.jpg")    '   //  cargamos imagen en el formulario como fondo xP.
  7.    '   //  se hace una copia en MEMORIA!¡.
  8.    Set Priv_stdPic = Me.Picture
  9. End Sub
  10.  
  11. Private Sub Form_Click()
  12.    With Priv_stdPic            '   //  Obtenemos los datos
  13.        Call MsgBox(.Height)    '   //  Ya sabes que es xP
  14.        Call MsgBox(.Width)     '   //  Ya sabes que es xP
  15.        Set Picture = Nothing
  16.        Call MsgBox("Se a limpiado el FORM!¡.")
  17.    End With
  18.    Set Me.Picture = Priv_stdPic
  19. End Sub
  20.  
  21.  

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
  1.  
  2. Call SavePicture(Image1.Picture, "c:\aaa.jpg")
  3.  
  4.  

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
  1.  
  2.    With Obj_Pic
  3.        call .Render (destDC Or 0&, 0&, 0&, ScaleX(.Width, vbHimetric, vbPixels), ScaleY(.Height, vbHimetric, vbPixels), _
  4.            0&, .Height, .Width, -.Height, ByVal 0&)
  5.    End With
  6.  
  7.  

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!¡.