Hola, eh intentado crear un tilemap y lo eh conseguido (Dejo el Código)
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 :)
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"?
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
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
Hola, primero que nada gracias por responder, pero probé el código y no me funciona :S
Algien tiene otra idea ??
chequea esto:
Parallax Scrolling (http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=63962&lngWId=1)
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...
.
Es mucho mejor con Apis... pero si es muy serio entonces seria con DirectX y/o OpenGL!¡.
Dulces Lunas!¡.
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 :-\
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!¡.
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.
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
Guardalo en un stdpicture ( private/dim/public/global/ variable as stdpicture) o cargalo en un hdc (CreateCompatibleDC, etc...)
Dulces Lunas!¡.
ejemplo del post anterior
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!¡.
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.
extraño a mi si me anda!¡
Call SavePicture(Image1.Picture, "c:\aaa.jpg")
Dulces Lunas!¡.
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
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:
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!¡.