Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Proyecto Pacman

Estas en el tema de Proyecto Pacman en el foro de Visual Basic clásico en Foros del Web. Wenas, Estoy haciendo un proyecto (pacman) y necesito algo de ayuda. El pacman como todos sabeis se mueve dentro de un circuito cerrado, el problema ...

  #1 (permalink)  
Antiguo 25/04/2005, 09:08
 
Fecha de Ingreso: noviembre-2004
Mensajes: 30
Antigüedad: 19 años, 5 meses
Puntos: 0
Proyecto Pacman

Wenas,

Estoy haciendo un proyecto (pacman) y necesito algo de ayuda.

El pacman como todos sabeis se mueve dentro de un circuito cerrado, el problema reside en como delimitar la libertad de movimiento de pacman. Para ello yo consigo detener dicho "muñeco" en un punto concreto, pero en realidad no se como debo hacer para crear unas lineas imaginarias que el pacman no pueda cruzar. La pregunta és, ¿sólo se puede conseguir delimitando la linea a traves de puntos, es decir punto a punto?

Gracias de antemano.
  #2 (permalink)  
Antiguo 25/04/2005, 12:06
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Creo que quieres saber qué opción es mejor, si hacer el Pacman "punto a punto" (como el original) o que se pueda acercar a las paredes etc etc (detección de colisiones). Pues seguramente la detección de colisiones te parezca muy complicada si ni siquiera sabes cómo hacerlo. Te recomiendo la de puntos en un principio... Cuando tengas más experiencia programando de puedes meter con ello. En cualquier caso, para casos pequeños (el pacman es pequeño), puedes detectar las colisiones por los pixels, que es sencillo y perfecto. Compruebas antes de mover si en la posición siguiente habrá algún pixel no transparente superpuesto a otro anterior. Pero para eso necesitas usar las imágenes pixel a pixel y no como un control de VB.

Si no entiendes algo, pregunta.
  #3 (permalink)  
Antiguo 25/04/2005, 18:13
Avatar de VisualGuallabo  
Fecha de Ingreso: marzo-2005
Mensajes: 288
Antigüedad: 19 años, 1 mes
Puntos: 2
Tambien puede delimitar por coordenadas sin mucho enredo.
ejemplo:

If muñeco.x=193 Then muñeco.x=192
__________________
"No hay lenguaje de programación potente que sea inferior a otro semejante cuando existe un buen programador que lo defiende"

Yosvanis Cruz Alias VisualGuallabo
Ycruz
  #4 (permalink)  
Antiguo 26/04/2005, 06:03
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por VisualGuallabo
Tambien puede delimitar por coordenadas sin mucho enredo.
ejemplo:

If muñeco.x=193 Then muñeco.x=192
¿? ¿De qué se supone que hablas?
  #5 (permalink)  
Antiguo 26/04/2005, 12:51
 
Fecha de Ingreso: noviembre-2004
Mensajes: 30
Antigüedad: 19 años, 5 meses
Puntos: 0
Gracias por tu respuesta MaxExtreme, un amigo me ha dado la idea de hacer el circuito en un dibujo y k las paredes tuviesen un color diferente al del pacman i al del recorrido y luego verificar k no esta en ese color a partir de los pixels.
Eso se puede hacer?? Si se puede hacer como se programaria??

Gracias de antemano, y perdonad x ser tan pesado ;)

VisualGuallabo, no entiendo lo k kieres decir.
Cita:
Iniciado por VisualGuallabo
Tambien puede delimitar por coordenadas sin mucho enredo.
ejemplo:

If muñeco.x=193 Then muñeco.x=192
  #6 (permalink)  
Antiguo 26/04/2005, 12:55
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por albertosalvad4
Gracias por tu respuesta MaxExtreme, un amigo me ha dado la idea de hacer el circuito en un dibujo y k las paredes tuviesen un color diferente al del pacman i al del recorrido y luego verificar k no esta en ese color a partir de los pixels.
Eso se puede hacer?? Si se puede hacer como se programaria??

Gracias de antemano, y perdonad x ser tan pesado ;)

VisualGuallabo, no entiendo lo k kieres decir.
Esa idea es la que te he escrito antes... Pero mejor: Puedes usar el color transparente y así te evitas problemas de colores.

Dime como estás o vas a programar el juego. Para hacer el tema gráfico deberías usar la API de Windows o DirectDraw como otra opción (que se puede en VB).
  #7 (permalink)  
Antiguo 26/04/2005, 13:09
 
Fecha de Ingreso: noviembre-2004
Mensajes: 30
Antigüedad: 19 años, 5 meses
Puntos: 0
Cita:
Iniciado por MaxExtreme
Esa idea es la que te he escrito antes... Pero mejor: Puedes usar el color transparente y así te evitas problemas de colores.

Dime como estás o vas a programar el juego. Para hacer el tema gráfico deberías usar la API de Windows o DirectDraw como otra opción (que se puede en VB).
La verdad sk sobre DirectDraw y sobre la API de Windows no se nada, ahora me miraré algun manual sobre DirectDraw xk creo k será necesario para poder hacer el progrma. Gracias x tu ayuda haber si ahora con la información puedo empezar a entender esto del DirectDraw y eso. Si sabes de lagun manual bueno pues te agredeceria k me lo dieses.

Asta luego
  #8 (permalink)  
Antiguo 26/04/2005, 14:36
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
http://www.google.es/search?hl=es&q=directdraw&spell=1

:)

Si nunca has programado con librerías gráficas o no te sabes manejar con muchas funciones interrelacionadas o no controlas lo de los punteros (etc), te va a ser _muy_ difícil aprender a usar DirectDraw.

Es preferible que uses las de Windows normales, te costará menos aprenderlas.
  #9 (permalink)  
Antiguo 26/04/2005, 16:10
 
Fecha de Ingreso: noviembre-2003
Ubicación: Mexico
Mensajes: 1.081
Antigüedad: 20 años, 5 meses
Puntos: 7
otra forma de hacerlo, y segun mas facil (yo lo hice asi), es que en lugar de pixeles, sea con posiciones relativas en el mundo, es decir, con matrices.
por ejemplo , suponiendo que tu mundo sea este:

****************
+++++++++++++++*
+********++++*+*
+*+++++++++++*+*
+*+******++++*+*
+++******++++*+*
++++++++++++++++
****************

donde los asteriscos * son las paredes y los signos de mas + son la comida,
puedes representarlos con una matriz bidimensional (x,y) de bools..
los * seran true y los + seran false.
entonces, tu posicionaras desde el inicio a tu pacman en una posicion False, y entonces checas si se oprimio una tecla, y antes de que lo muevas, checas si la nueva posicion es true or false. Si es true NO se puede mover (ya que hay pared) y si es false Si se puede.
Para saber cual es su nueva posicion, pues simplemente checas que tecla se oprimio. Podria ser que si se oprimio para abajo se sumas 1 en Y y se se oprimio para la derecha le sumas uno en X (ya depende como lo quieras).

Eso es mas sencillo que hacerlo pixel por pixel, ya que te evitas lidiar con checar si estas dentro del area de la comida o de la pared.......

Ahora, para los enemigos, la tecnica es igual para las colisiones.
Y para la "Inteligencia Artificial", lo que debes de hacer, es primero tener una posicion con el pacman y los fantasmitas que estaran ocupando un lugar true en el mundo (tu matriz), y puedes hacer que unos se muevan aleatoreamente y que otros sigan la trayectoria del pacman (siempre y cuando su nueva posicion no este en TRUE).


Espero haberme explicado bien y que sirva.......
saludos
  #10 (permalink)  
Antiguo 26/04/2005, 23:33
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
¡¡¡ BlackWind !!!

Esa idea es la que llamamos en este post "punto a punto"......... ¿Quieres leer primero los topic y despues hablar?
  #11 (permalink)  
Antiguo 27/04/2005, 01:31
 
Fecha de Ingreso: noviembre-2003
Ubicación: Mexico
Mensajes: 1.081
Antigüedad: 20 años, 5 meses
Puntos: 7
Cita:
Iniciado por MaxExtreme
¡¡¡ BlackWind !!!

Esa idea es la que llamamos en este post "punto a punto"......... ¿Quieres leer primero los topic y despues hablar?

de que hablas?

lo que yo dije NO es "punto a punto".

Y punto a punto es pixel por pixel, lo cual es TOTALMENTE diferente.
Si lees bien, lo que ustedes dijeron "punto a punto" (sera que siempre leo los tutoriales en ingles, pero nunca habia escuchado ese termino) es pixel por pixel, lo cual es mas dificil.

Ademas, el pregunto como podria hacerlo, yo le di una solucion sencilla, rapida y me parece que clara.
  #12 (permalink)  
Antiguo 27/04/2005, 06:18
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por blackwind
de que hablas?

lo que yo dije NO es "punto a punto".

Y punto a punto es pixel por pixel, lo cual es TOTALMENTE diferente.
Si lees bien, lo que ustedes dijeron "punto a punto" (sera que siempre leo los tutoriales en ingles, pero nunca habia escuchado ese termino) es pixel por pixel, lo cual es mas dificil.

Ademas, el pregunto como podria hacerlo, yo le di una solucion sencilla, rapida y me parece que clara.

!!!! NO !!!!

Lee los posts. Punto a punto se refiere NO a pixel a pixel, si no a POSICION (punto) a POSICION (punto), o sea, array bidimensional.

Pixel a pixel es lo que he estado explicando yo.


Cita:
Iniciado por Max Extreme
Creo que quieres saber qué opción es mejor, si hacer el Pacman "punto a punto" (como el original) o que se pueda acercar a las paredes etc etc (detección de colisiones).
  #13 (permalink)  
Antiguo 27/04/2005, 08:55
 
Fecha de Ingreso: noviembre-2004
Mensajes: 30
Antigüedad: 19 años, 5 meses
Puntos: 0
Wenas,

MaxExtreme como se k el pixel k viene a continuación es de un color diferente. He mirado algunos manuales sobre la API de Windows y Visual Basic, xo no lo acabo de entender. No te estoy pidiendo codigo, solo una breve explicacion. Perdona por las molestias.

Gracias
  #14 (permalink)  
Antiguo 27/04/2005, 09:05
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por albertosalvad4
Wenas,

MaxExtreme como se k el pixel k viene a continuación es de un color diferente. He mirado algunos manuales sobre la API de Windows y Visual Basic, xo no lo acabo de entender. No te estoy pidiendo codigo, solo una breve explicacion. Perdona por las molestias.

Gracias
Veamos, ¿has conseguido hacer funcionar algo de la API? Porque si no logras inicializarlo, va a ser inútil decirte cómo obtener un píxel.

En cualquier caso, la función es:

Código:
Declare Function GetPixel Lib "gdi32" Alias "GetPixel" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long

Const CLR_INVALID = &HFFFF
· hdc
Identifies the device context.
El hDC que estás usando para pintar.

· nXPos
Specifies the logical x-coordinate of the pixel to be examined.
Posición X del pixel.

· nYPos
Specifies the logical y-coordinate of the pixel to be examined.
Posición Y del pixel.

Return Value
If the function succeeds, the return value is an RGB value. If the pixel is outside of the current clipping region, the return value is CLR_INVALID.

Valor de Retorno
Si la función termina satisfactoriamente, devolverá el valor RGB (el color). Si el pixel está fuera de la región de pintado, el valor será CLR_INVALID (constante).



Otra cosa: Los colores son en el formato hexadecimal RRGGBB, RR el byte rojo, GG el byte verde y BB el byte azul. Por ejemplo, FFFF00 será el color amarillo: 255 rojo, 255 verde, 0 azul. Pero eso supongo que lo sabes.
  #15 (permalink)  
Antiguo 27/04/2005, 09:28
 
Fecha de Ingreso: noviembre-2003
Ubicación: Mexico
Mensajes: 1.081
Antigüedad: 20 años, 5 meses
Puntos: 7
Cita:
Iniciado por MaxExtreme
!!!! NO !!!!

Lee los posts. Punto a punto se refiere NO a pixel a pixel, si no a POSICION (punto) a POSICION (punto), o sea, array bidimensional.

Pixel a pixel es lo que he estado explicando yo.

Punto a Punto, a lo que originalmente se referia el que posteo el problema es lo que se le llama Pixel Por Pixel.......si no.....¿dime por que crees que lo esta queriendo hacer asi?.
Ya que lo que te ha preguntado son formas de hacerlo Pixel por Pixel.
Tu en tu primer post "revolviste" las cosas y llamaste que punto a punto (que es pixel por pixel) es diferente que a lo que tu llamaste "deteccion de colisiones". Cuando en realidad es lo mismo.
Y si para ti "punto a punto" es diferente de "pixel por pixel" dejamente decirte que estas mal. Ya que es lo mismo.

Pero bueno, no voy a estar discutiendo por que tu confundas las cosas, tal pareciera que quisieras ser el unico en poder dar soluciones, o que quisieras que las que yo doy siempre esten mal o o sobren......pero bueno.

Por cierto albertosalvad4 , tienes que hacerlo forzosamente "punto a punto"?, porque si no es asi, la solucion que yo te doy es muchísimo mas sencilla, tanto en codigo y sintaxis, como en tiempo de programacion que lo que estas tratando de hacer. Creo que vale la pena que lo leas.
  #16 (permalink)  
Antiguo 27/04/2005, 10:33
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por blackwind
Punto a Punto, a lo que originalmente se referia el que posteo el problema es lo que se le llama Pixel Por Pixel.......si no.....¿dime por que crees que lo esta queriendo hacer asi?.
Ya que lo que te ha preguntado son formas de hacerlo Pixel por Pixel.
Tu en tu primer post "revolviste" las cosas y llamaste que punto a punto (que es pixel por pixel) es diferente que a lo que tu llamaste "deteccion de colisiones". Cuando en realidad es lo mismo.
Y si para ti "punto a punto" es diferente de "pixel por pixel" dejamente decirte que estas mal. Ya que es lo mismo.

Pero bueno, no voy a estar discutiendo por que tu confundas las cosas, tal pareciera que quisieras ser el unico en poder dar soluciones, o que quisieras que las que yo doy siempre esten mal o o sobren......pero bueno.

Por cierto albertosalvad4 , tienes que hacerlo forzosamente "punto a punto"?, porque si no es asi, la solucion que yo te doy es muchísimo mas sencilla, tanto en codigo y sintaxis, como en tiempo de programacion que lo que estas tratando de hacer. Creo que vale la pena que lo leas.
Ni yo estoy mal ni me he confundido. Yo lo he interpretado así, y si no, lee:

Código:
La pregunta és, ¿sólo se puede conseguir delimitando la linea a traves de puntos, es decir punto a punto?
Eso, por lo menos a mi, me da a entender que quiere crear unas zonas que no se puedan pasar, o sea, a través de "puntos". Cada punto representa una casilla, atravesable o no. Y eso de "es decir punto a punto", a mi me suena a casillas, qué quieres que te diga. Por eso mismo puse comillas en la expresión "punto a punto", porque no se refería a puntos de la pantalla (pixels), sino a casillas en un array como luego tú has comentado.

Y yo recomiendo hacerlo pixel a pixel, porque es mucho más interesante, te permite escenarios muchísimo más complejos, creas una idea nueva, etc etc. Hacer un simple array bidimensional es una cosa bastante simplona. Por otra parte, él se ha interesado (y su amigo también se lo ha recomendado) hacerlo pixel a pixel.

Ahora te pregunto yo... dices que yo intento imponerme... ¿y tú? ¿no será que quieres que se hagan las cosas como tú dices? Que no sepas superarte no significa que los demás tengamos que hacerlo con un array y no intentarlo más avanzado. Él se ha interesado, me ha preguntado sobre la API, pues no metas más baza.
  #17 (permalink)  
Antiguo 27/04/2005, 11:23
 
Fecha de Ingreso: noviembre-2004
Mensajes: 30
Antigüedad: 19 años, 5 meses
Puntos: 0
Wenas (esto se esta liando un poco...),

Blackwind no neceseariamente lo tengo que hacer asi, pero es como se me ocurrió al principio y por eso lo pregunte asi. Quizás deberia haber hexo la pregunta de otra forma. Por lo tanto a mi lo k me interesa es k el pacman pare cuando llegue a una pared, x el metodo que sea. No hace falta que sea un metodo muy complejo, solo para realizar los mapas tipicos del pacman, no muy complicados y que sea un codigo lo menos cargado posible para mwejorar el rendimiento. Clon este proyecto lo que quiero hacer es con mi compañero mejorar nuestros conocimientos sobre Visual basic y nuevas formas de hacer las cosas. Asi que en realidad me gustaria saberlo hacer de dos formas.

Principalmente haria la propuesta por blackwind que parece mas sencilla, y luego ya con mas conocimientos para mejorarlo lo intentaria hacer como dice MaxExtreme.

Gracias a los 2 por vuestras propuestas.
  #18 (permalink)  
Antiguo 27/04/2005, 11:48
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cuando habláis en VB soléis hablar "del rendimiento" ;) Tranquilo, un juego tan simple le hagas como le hagas el ordenador no lo va a notar. Piensa que un ordenador antiguo generaba decenas de imágenes 3D por _segundo_ en juegos como Quake1 (sin aceleración gráfica, por procesador) y no se resentía. ¿Crees que un Pacman le cuesta? :)



Ahora la explicación:

Para hacerlo por casillas te sugiero seguir esta forma:


Defines una estructura que contenga la información sobre el estado del mapa: Si hay pared, si hay comida, si hay premio.

Código:
Type Casilla
    Pared As Boolean
    Comida As Boolean
    Premio As Boolean
End Type

El array doble que harás será declarado de este tipo, con el tamaño, por ejemplo, de 25x25 donde cargarás y usarás el mapa.

Código:
Dim Mapa(25, 25) As Casilla
Por otro lado puedes tener unas variables que digan dónde está el Pacman, los monstruos y el lugar de comienzo de ambos, por decir algo. Pero eso _no_ en la estructura del mapa que te he puesto antes sino fuera.

Te sugiero que no hagas todo a lo loco (estilo VB), y primero crees una función que tome como argumento un array (el mapa) y un Formulario. Esta función pintará el mapa en el formulario dado, aunque sea con Shapes.

Después de comprobar que funciona bien, creas otra función que calcule la siguiente posición del PacMan y los monstruos, incluyendo que mire que teclas están pulsadas (para saber a dónde va PacMan... Esto se suele también incluir en otra función aparte, pero bueno, para esto es suficiente), que compruebe que la casilla siguiente está vacía (en el array Mapa se ve), que añada un punto si en la casilla hay un "coco" y también le borre de esa casilla después de pasar, los premios, etc.

Después haces una función "proceso", que sea llamada por un Timer cada 600 milisegundos por ejemplo, y esta función lo que hará será llamar a la función de cálculo y después a la de pintado.

Y ya tienes el juego hecho. Un poco de decoración, te curras la inteligencia artificial, algún añadido original (como un premio que te permita andar por todo el mapa, incluyendo paredes, y si pasas por una desaparece... Es cuestión de quitar simplemente el estado booleano y un Timer adicional para los premios... ¿Ves lo fácil que es teniendo un juego bien estructurado?) y listo. :)

No es nada complicado, inténtalo (los dos solos) siguiendo las pautas que te he escrito aquí y voilá!
  #19 (permalink)  
Antiguo 27/04/2005, 12:01
 
Fecha de Ingreso: agosto-2004
Mensajes: 14
Antigüedad: 19 años, 8 meses
Puntos: 0
He leido este post y me ha parecido muy interesante.
Yo tambien estaba intentando hacer el pacman y a mi la verdad me interesa mas el metodo que propuso MaxExtreme, en el cual el pacman solo se mueve segun el color de los pixels, o eso me ha parecido. Aunque no se del todo como llevarla a cabo.
Saludos
  #20 (permalink)  
Antiguo 27/04/2005, 12:08
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por galber
He leido este post y me ha parecido muy interesante.
Yo tambien estaba intentando hacer el pacman y a mi la verdad me interesa mas el metodo que propuso MaxExtreme, en el cual el pacman solo se mueve segun el color de los pixels, o eso me ha parecido. Aunque no se del todo como llevarla a cabo.
Saludos
La idea es que el Pacman no vaya por casillas sino libre: chocándose, por mapas de cuelquier forma, etc etc. Es una buena manera de revivir el pacman

Debes usar la API de Windows para pintar o en todo caso DirectDraw, pero es más complicado aún.

Lee sobre mis otros posts sobre API y DirectDraw que hay cerca de éste para enterarte de como va. Parece que hay mucha demanda en ésto (salir de la jaula de VB) y está interesante. Quizás este "puente" que viene este fin de semana en España ponga alguna introducción... Quizás...
  #21 (permalink)  
Antiguo 27/04/2005, 17:46
 
Fecha de Ingreso: noviembre-2003
Ubicación: Mexico
Mensajes: 1.081
Antigüedad: 20 años, 5 meses
Puntos: 7
respondido el msg privado alberto.
Espero te sirva, cualquier duda ya sabanas.......
saludos
  #22 (permalink)  
Antiguo 04/05/2005, 09:09
 
Fecha de Ingreso: noviembre-2004
Mensajes: 30
Antigüedad: 19 años, 5 meses
Puntos: 0
MaxExtreme,

He estado provando con la api de windows, ahora lo que quiero saber es como detectar el color del pixel ya que con los que me dijiste no me funciona.

gracias
  #23 (permalink)  
Antiguo 06/05/2005, 18:41
Avatar de Boxmaster  
Fecha de Ingreso: agosto-2004
Ubicación: Ahorita... frente a mi PC
Mensajes: 74
Antigüedad: 19 años, 8 meses
Puntos: 0
Exclamación Tutorial del PACMAN en VB.NET (1a Parte)

Un PacMan avec VB.NET. Tutoriel POO

Ce jeu de PacMan n'est absolument pas optimisé. Mais son but est de vous montrer les nouveautés de la programmation orientée objet de VB.net
(vu 6829)



PacMan is back


Bon, autant vous prévenir tout de suite, le code qui vous est présenté ce mois-ci n’est absolument pas optimisé et défit même par moment les règles élémentaires de programmation (et en plus, le jeu n’est pas terrible alors…). Mais il a l’avantage de vous présenter plusieurs Namespaces et certaines nouvelles fonctionnalités de VB.NET, bref il n’est présent que dans un but pédagogique.

Vous allez donc créer, grâce à VB.NET, une énième version du PacMan
(comme dirait Droopy, « I’m happy »).

Toutes les classes que vous pouvez manipuler avec VB.NET sont sagement rangées dans des Namespaces ou espaces de nom (dans un même Namespace, deux classes du même nom ne peuvent cohabiter).

La plate-forme Microsoft.NET nous livre nombre de Namespaces qui contiennent eux-même, nombre de classes. Une bonne partie de la maîtrise de VB.NET va donc consister à bien connaître ces Namespaces et savoir utiliser les bonnes classes au bon endroit.

La structure de l’application
Regardons maintenant comment vous allez organiser votre application. Vous avez à dessiner la carte, le PacMan, les fantômes et à animer le tout. Vous allez créer les classes suivantes :

cSprite, une classe qui dessine un élément mouvant,
cPacMan pour le PacMan, qui hérite de cSprite,
cFantome pour un fantôme, qui hérite de cSprite,
cFantomes, une classe collection qui contient l’ensemble des fantômes,
cSquare pour un élément du décor,
cSquares, une classe collection qui contient l’ensemble des éléments de décors,
cAppli, la classe à la tête de votre hiérarchie.
Au début de votre application, vous allez créer une instance de votre classe cAppli. Dans son constructeur, vous passez en paramètres la Form ou vous affichez votre jeu ainsi que le nom du fichier où se trouve la carte :

Public Sub New(ByVal FormA As Form1, ByVal sMapFile As String)

Dans le constructeur, vous allez lire le fichier contenant la carte et créer les instances de tous les objets dont vous avez besoin

Commençons tout de suite l’exploration très fort avec le NameSpace System.IO pour la lecture de la carte.

Lecture de la carte
Chaque niveau de votre jeu va être stocké dans un fichier texte. Pour concevoir un niveau, utilisez simplement Excel en créant un tableau de 19 lignes par 19 colonnes. Dans chaque cellule, placez des 1 pour les murs, 0 pour du vide, 5 pour l’emplacement de départ du PacMan, 4 pour les fantômes (les méchants), etc. Puis, sauvegardez le tout dans un fichier au format cvs (on dirait une recette de cuisine ! ). Ce qui vous donne un fichier du genre :

1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1
1;5;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;4;1
1;0;1;1;1;0;1;0;1;0;1;0;1;0;1;1;1;0;1


1;6;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;4;1
1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1

La lecture de ce fichier va vous permettre de remplir votre collection cSquares d’objets cSquare.

Pour pouvoir lire un fichier au format texte, vous utilisez un objet nommé StreamReader qui fait partie de System.IO.

Dans System.IO, vous avez des classes qui vous permettent de lire et écrire le contenu de fichiers soit au format binaire (BinaryReader, BinaryWriter), soit au format texte (StreamReader, StreamWriter). C’est ce qui nous intéresse ici mais il y a également des classes qui vous permettent d’obtenir des informations sur les fichiers (File) et les dossiers (Directory) et de les renommer, supprimer, déplacer, etc. Ces derniers remplacent les classes de la référence FileSystemObject.

Pour ouvrir votre fichier, il vous faut créer une instance de la classe StreamReader. Celle-ci possède 9 constructeurs différents mais vous allez utiliser le plus simple qui demande juste le nom du fichier :

Dim oStreamR As New System.IO.StreamReader(sMapFile)

Puis pour lire une ligne :

sRead = oStreamR.ReadLine

A la fin de votre fichier, ReadLine retourne un String vide.

La classe cSquares est une simple classe collection (cf article du mois dernier). Chaque élément du décors (de type cSquare) peut êre un mur, un bonus, un superBonus, etc. Pour une meilleure lisibilité de votre code, vous allez définir une nouvelle énumération définie dans cSquares :

Public Enum eSquareTypes
Vide = 0
Mur = 1
Point = 5
Bonus = 2
SuperBonus = 3
End Enum

Rien de bien différent par rapport à VB6 mais attention, en utilisant cette énumération, vous définissez un nouveau type. Cela signifie que si vous tapez le code suivant :

Dim i as Integer = 1
objSquare.SquareType = i ‘un mur

Le compilateur en mode Strict On va générer une erreur. Pour éviter cela, il faut convertir le type Integer en type eSquareTypes :

Dim i as Integer = 1
objSquare.SquareType = cType(i,eSquareTypes) ‘un mur

Pour ajouter un élément au décor, vous allez définir la méthode Add suivante :

Public Function Add(ByVal X As Integer, ByVal Y As Integer, ByVal SquareType As eSquareTypes, ByVal PoidsA As Integer) As cSquare

X et Y sont la position de l’élément, SquareType le type et Poids son poids (il nous servira par la suite pour le calcul de la trajectoire des fantômes).

Je vous laisse le soin de regarder le code qui permet d’extraire les informations d’une ligne qui est somme toute classique. N’oubliez pas tout de même de fermer votre fichier :

oStreamR.Close()

Vous aurez remarqué que pour créer mon objet, vous avez été obligé de taper System.IO.StreamReader. Vous êtes de grand fainéant comme moi (si, si) ? Vous pouvez dire au compilateur VB que dans le fichier où est écrit ce code, vous allez utiliser le Namespace System.IO. De la même façon, vous allez le prévenir que vous souhaitez utiliser les déclarations qui sont dans cSquares (l’énumération entre autres). Pour cela, ajoutez les lignes suivantes en tête de votre fichier :

Imports System.IO
Imports c2iPacMan.cSquares

Attention, il ne s’agit pas d’ajouter une nouvelle référence à votre projet, mais bel et bien de dire au compilateur que le code qui suit (dans ce fichier .vb) utilise ce Namespace.

Pour les fantômes et le PacMan, lors de leur création, vous indiquez juste leurs positions et couleurs.

Une fois tous les objets instanciés, il reste à les dessiner le tout sur votre Form. Pour cela, vous allez avoir besoin d’un autre NameSpace : System.Drawing.

Un peu de dessin
Le dessin n’a jamais été le fort de Visual Basic. J’en veux comme exemple l’aberration pour dessiner un rectangle plein :

Form1.Line (5,10) – Step(10,10),,BF

Gasp ! Comme programmation orientée objets, on faisait mieux et encore, je passe sur les Twips, AutoRedraw & Co. Pour dessiner dans une Form, il vous faut dans un premier temps obtenir l’objet où vous allez dessiner. Sous Win32, il était appelé Devicecontext. Sous MS.NET, c’est un objet Graphics qui fait partie de System.Drawing. C’est lui qui possède toutes les méthodes dont vous avez rêvé pour dessiner toutes les formes que vous voulez. Vous pourrez ainsi dessiner des lignes, des ellipses, des rectangles (classique, quoi) mais plus étonnant des courbes de Beziers, des camemberts, des images, des icônes, etc.

Comment l’obtenir ? La meilleure façon (et la plus sûre) pour récupérer le graphics d’une Form est d’utiliser l’événement Paint. Ce dernier vous renvoie l’objet e de type PaintEventArgs qui possède comme propriété l’objet Graphics ou vous souhaitez dessiner :

Public Sub Form1_Paint(ByVal sender As Object, ByVal e As System.WinForms.PaintEventArgs) Handles Form1.Paint
Dim gForm as Graphics
gForm = e.graphics

End Sub

Il existe une autre méthode que vous utiliserez dans ce projet qui obtient l’objet Graphics d’un objet à partir de son Handle :

Dim gForm as Graphics
gForm = Graphics.FromHWND(mForm.Handle)

Il est très important d’obtenir cet objet juste avant le moment où l’on va s’en servir car il change en permanence notamment quand vous redimensionnez la form. Vous comprenez maintenant pourquoi l’objet Form est une propriété de votre classe cAppli.

Maintenant, vous allez devoir dessiner des rectangles pleins en noir (pour les zones vides) et des cercles pleins (pour les bonus). Pour cela, vous devrez utilisez des Pens (stylos) et des Brushes (pinceaux).

Toutes les méthodes de Graphics qui dessinent des lignes commencent par Draw et utilisent un Pen.

Toutes les méthodes qui dessinent des formes pleines commencent par Fill et utilisent un Brush. Un Pen de couleur noire se défini ainsi :

Dim oPen as New Pen(Color.Black)

Puis pour dessiner une ligne noire du point (10,10) au point (50,50) :

gForm.DrawLine(oPen,10,10,50,50)

Dans votre cas, ce sont des zones remplies donc vous allez travailler avec des Brushes. Par exemple, pour un cercle de 10 de rayon au point (5,5), vous devez écrire :

gForm.DrawEllipse(New SolidBrush(color.Black), 5, 5, 10, 10)

Le pinceau utilisé est solide, cela signifie que le remplissage est plein, mais vous pouvez aussi utiliser des textures grâce à la classe TextureBrush. C’est ce que vous ferez pour dessiner les murs. Pour cela, le constructeur d’un TextureBrush attend un objet Image qui peut être créé à partir d’un fichier bitmap :

Dim mBitmapMur as New Bitmap(“mur.bmp”)
e.FillRectangle(New TextureBrush(mBitmapMur), 0, 0, 50, 50)

Dans ce cas, on texture un rectangle de 50 pixels de large et de hauteur à partir du fichier mur.bmp.
  #24 (permalink)  
Antiguo 06/05/2005, 18:43
Avatar de Boxmaster  
Fecha de Ingreso: agosto-2004
Ubicación: Ahorita... frente a mi PC
Mensajes: 74
Antigüedad: 19 años, 8 meses
Puntos: 0
Exclamación Tutorial del PACMAN en VB.NET (2a Parte)

Pour dessiner une image, c’est aussi simple. Sous VB6, il fallait charger une image dans un PictureBox invisible et de faire des BitBlt ou des PaintPicture sur la Form de destination. On pouvait également utiliser des images en mémoire uniquement, mais cela nécessitait une bonne maîtrise des API. Avec VB.NET, no problemo (citation de Homer. S.) :

e.DrawImage( mBitmapPacMan, 10,10)

Ou, vous l’aurez deviné, mBitmapPacMan est un objet Image.



Bien, vous savez maintenant charger le fichier grâce à System.IO, dessiner votre décor, votre PacMan et vos fantômes (grâce à System.Drawing). Pour les détails, je vous laisse le soin de regarder dans le code sur le CDROM)

En ce qui concerne votre Pacman et vos fantômes, pour que ce soit plus sympathique, il faut les animer. La solution retenue à été d’alterner l’objet Image utilisé toutes les x millisecondes (ces dernières sont en réalité stockées dans une collection ArrayList). Rien de bien compliqué sauf qu’il faut générer cet événement toutes les x millisecondes. Vous pourriez utiliser un contrôle Timer dans votre Form comme sous VB6, mais cela lierait votre objet cPacMan (et cFantome) à votre Form et nuierait à la suite de cet article. Heureusement, vous pouvez maintenant instancier un Timer dans une classe et surtout, s’abonner à son événement : plus besoin de contrôle.

Les évènements
Il existe deux sortes de Timers sous VB.NET. Un dans le NameSpace System.Winforms (le contrôle Timer traditionnel ) et un dans System.Threading. C’est ce dernier que vous allez utiliser. Pour s’abonner à son événement, vous allez utiliser la délégation (nous reviendrons plus en détail dans un autre numéro sur la délégation et les évènements avec VB.NET) grâce à un objet TimeCallBack.

Dim oTCallBack as New TimerCallback(AddressOf Me.Change)
Dim objTimerChange As New Timer(oTCallBack, Me, 50, 0)

Grâce au constructeur de l’objet TimerCallback, vous indiquez que la procédure Change de l’objet où il est instancié (Me) doit être appelée. L’événement généré par le Timer exécutera la procédure Change. Puis vous abonnez votre objet au callback du nouveau Timer. Contrairement au Timer traditionnel qui génère un événement qui se répète régulièrement, le Timer de Threading génère l’événement (au bout de 50ms dans notre cas) puis se détruit. Si l’on veut de nouveau rappeler la procédure Change 50 ms après, il faut recréer un nouveau Timer :

Private Sub Change(ByVal sender As Object)

Dim objTimerChange As New Timer(New TimerCallback(AddressOf Me.Change), Me, 50, 0)
End Sub

Il est important dans la déclaration de Change d’ajouter le paramètre sender as Object pour que la délégation fonctionne.

Petite remarque concernant la beta 1 de MS.NET Framework : au début du développement de cette application, j’avais envisagé de créer un Threading.Timer pour chaque Sprite animé. Malheureusement, au bout de quelques secondes, il perd un peu les pinceaux et les évènements ne sont plus générés. On se limitera donc à un seul Timer pour l’instant.

Deuxième remarque, l’implémentation du Threading.Timer ne fonctionne que sous Windows 2000 pour l’instant.

Tant qu’on y est avec les évènements, vous allez ajouter un événement à votre classe PacMan : Score_Changed. Dès que notre cher PacMan mange des bonus, son score est augmenté. Pour en avertir l’application, vous décidez de créer un événement dans sa classe. Pour la création et la génération de l’événement, rien ne change en apparence :

Public Event Score_Changed(ByVal iScore As Integer)

Public Sub Change()

RaiseEvent Score_Changed(iScore)

End Sub

Pour pouvoir s’abonner à cet événement, la classe (ici cAppli) doit d’abord en avertir le compilateur avec la ligne classique :

Private WithEvents mHero As cPacMan

En revanche, la déclaration de l’évènement change quelque peu :

Public Sub mHero_Score_Changed(ByVal iScore As System.Integer) Handles mHero.Score_Changed

Vous reprenez la définition de l’évènement et pour assurer la délégation, vous utilisez le mot clé Handles en précisant quelle fonction est gérée. Cela se passe exactement de la même façon pour capturer les évènements des contrôles dans une form :

Dim WithEvents Form1 As System.WinForms.Form

Public Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Form1.Click

End Sub

Hiérarchisons un peu le tout
Je vous ai dit au début de cet article que les classes cPacMan et cFantome héritaient d’une classe cSprite. Il est temps maintenant de s’expliquer plus avant. Si l’on considère ces deux objets graphiques, tous deux possèdent des propriétés et des méthodes qui se ressemblent étrangement. On doit dessiner un bitmap, ils ont une position X, Y tous les deux, ils se déplacent de la même façon, c’est-à-dire qu’ils évitent les murs, etc. Donc plutôt que de dupliquer le code dans ces deux classes, vous allez créer la classe cSprite qui contiendra les membres communs. Le code dans les classes qui en hériteront sera donc bien spécifique à leur nature. Pour qu’une classe hérite d’une autre (attention, contrairement au C++, les classes MS.NET ne peuvent hériter que d’une seule classe), juste après la définition de la classe, ajoutez la ligne suivante :

Public Class cPacMan
Inherits cSprite

Il y a beaucoup de membres communs si l’on se penche en détail sur le programme mais nous ne regarderons ici que quelques uns d’entres eux.

Les membres Public
Les propriétés X et Y qui représentent la case où se trouve le sprite doivent être accessibles à l’extérieur de la classe. Définissez les ainsi dans la classe cSprite :

Private mX as Integer

Public Property X() As Integer
Get
Return mX
End Get
Set
mX = Value
End Set
End Property

Comme cPacMan hérite de cSprite, vous pourrez écrire :

ObjPacMan.X = 5

Et c’est le code dans la classe parente qui sera exécutée.

C’est le cas le plus simple.

Les membres protégés
Maintenant, comment créer des membres qui sont privées à la classe mais qui peuvent être utilisées dans les classes filles. Si vous définissez une variable comme Private dans la classe cSprite, celle-ci ne sera visible que dans les objets cSprite. Pour remédier à ce problème, vous allez les déclarer comme Protected. Par exemple, pour la taille du sprite qui n’est pas visible à l’extérieur de la classe :

Protected mWidth as Integer
Protected mHeight as Integer

C’est le cas également pour la méthodes CalculPosition :

Protected Function CalculPosition() As Boolean

Ces membres, définis dans la classe cSprite sont visibles dans la classe cPacMan mais invisibles à l’extérieur de la classe.

Redéfinition d’un membre
Dans certains cas, vous allez devoir redéfinir des membres. Pour vos deux classes, vous devez à chaque appel du Timer afficher le sprite, le code est donc commun. Mais pour le PacMan, vous en profitez pour réactualiser son score et pour les fantômes, calculer leurs trajets. Il faut donc avertir le compilateur que la méthode commune (Change) doit pouvoir être redéfinissable grâce au mot clé Overridable :

Public Overridable Sub Change()

Vous redéfinnissez la procédure Change de la classe cPacMan avec le mot clé Overrides. Comme vous devez faire appel à la méthode Change de la classe parente, vous utilisez MyBase, qui fait référence à la classe parente puis vous ajoutez son code spécifique :

Public Overrides Sub Change()
MyBase.Change()
… ‘code spécifique
End Sub
  #25 (permalink)  
Antiguo 06/05/2005, 18:44
Avatar de Boxmaster  
Fecha de Ingreso: agosto-2004
Ubicación: Ahorita... frente a mi PC
Mensajes: 74
Antigüedad: 19 años, 8 meses
Puntos: 0
Exclamación Tutorial del PACMAN en VB.NET (3a Parte y ultima)

Classes internes
Si vous avez lu l’article du mois dernier sur les classes internes du JDK 1.1 de Java par Philippe Prados, sachez que maintenant, avec VB.NET, vous pouvez définir une classe au sein d’une autre classe. Si vous la définissez comme Private, elle ne sera visible que par les membres de la classe. C’est ce que vous allez faire avec la classe Delta qui représente la position du sprite dans une case :

Public Class cSprite

Private Delta

End Class
End Class

C’est une solution avantageuse par rapport à la définition de structure privée puisqu’elle apporte toute la puissance de la programmation orientée objet.

Rendons nos fantômes intelligents


Comme je vous l’ai dis plus haut, au moment où l’on dessine un fantôme (Change), vous calculez sa trajectoire. Ce calcul peut-être très long et il peut être intéressant de l’effectuer dans un autre thread. Bon, je l’avoue, l’implémentation du multithread dans ce programme n’est là juste qu’à titre pédagogique et pourrait être évitée. Faire cela avec VB6 était un véritable casse-tête qui, il faut l’avouer, ne marchait pas (si un lecteur à un exemple qui fonctionne, je suis preneur mais très sceptique). Sous VB.NET, deux lignes suffisent :

Dim t As New Thread(AddressOf Me.CalculTrajectoire)
t.Start()

Plus simple, je ne pense pas que ce soit possible. Dans le NameSpace System.Threading, vous créez un objet Thread en indiquant l’adresse de la procédure à exécuter (ici, CalculTrajectoire). Puis, pour démarrer le nouveau thread, vous utilisez sa méthode Start. Il existe d’autres méthodes qui vous permettent par exemple d’interrompre ou de mettre en veille l’exécution d’un thread de différentes façons(Abort, Interrupt, Stop, Sleep).

Une fois votre Thread créé, vous allez devoir calculer la trajectoire de vos fantômes. La solution retenue est l’implémentation de l’algorithme A* que nous vous avons présentée dans un précédent article. D’accord, c’est un peu comme utiliser un Boeing 747 pour transporter une lettre mais ce qui est intéressant dans ce cas précis, c’est que le code existait déjà sous VB6.

On en arrive au cas délicat de la migration de projets.

VB.NET est livré (pour la Beta 1) avec un wizard qui effectue la migration de vos projets VB6. Quand on pose la question à Microsoft sur l’efficacité de ce Wizard, la réponse est étonnante :

« si ca marche, tant mieux »

Je pense que la question n’est pas la bonne, je dirais plutôt, pourquoi migrer ? Votre projet fonctionne parfaitement sous VB6, pourquoi allez-vous passer 6 mois de déboggage pour simplement utiliser VB.NET ? De plus, vous n’allez certainement pas profiter des avantages de MS.NET. Je reprends l’exemple du mois dernier sur les collections. Votre projet utilise un objet collection de VB6. Si vous migrez celui-ci sous VB.NET, il utilisera un objet collection de compatibilité avec VB6 qui est largement moins performant que les nouveaux objets collections de MS.NET.

Dans le cas de l’implémentation de l’algorithme A*, la migration du code s’est effectuée sans aucun problèmes mais en analysant le code, il a fallu réécrire une bonne partie de celui-ci pour pouvoir profiter de tous les avantages de VB.NET. Par exemple, l’algorithme A* utilise une collection type Fist In, First Out. Celle-ci n’existait pas sous VB6, il fallait donc créer « à la main » une classe qui implémentait cette fonctionnalité. Sous VB.NET, elle existe en natif et est beaucoup plus rapide. De même, au niveau des tests conditionnels du type :

If a=True And b=True Then

End If

ceux-ci étaient décomposés pour des raisons d’optimisation comme suit puisque VB6 évaluait les deux conditions :

If a=True Then
If b=True Then

End If
End If

alors que ce n’est pas nécessaire avec VB.NET. En effet il n’évalue la seconde condition que si la première est vérifiée. Cela permet une meilleure lisibilité du code. Ce ne sont que deux exemples, mais ils sont symptomatiques des problèmes que vous risquez de rencontrer dans le cas d’une migration.

Pour conclure
MS.NET et Visual Basic.NET vous permettent de créer de véritables applications orientées objets. C’est le grand saut pour les développeurs Visual Basic, cela nécessitera certainement un temps d’apprentissage important, mais, franchement, cela en vaut la chandelle. Juste un conseil : n’essayez pas de porter vos développements VB6 sous VB.Net, vous seriez déçus. Il y a une telle différence que c’est comme si vous attendiez une mise en page sophistiquée de vos textes écrits sous NotePad dans Word 2000. VB.NET est un nouveau produit, avec une nouvelle approche mais qui vous permettra de développer très rapidement des applications sophistiquées, robustes et évolutives.

****
Soluciones, no discusiones.
****
  #26 (permalink)  
Antiguo 06/05/2005, 18:45
 
Fecha de Ingreso: noviembre-2003
Ubicación: Mexico
Mensajes: 1.081
Antigüedad: 20 años, 5 meses
Puntos: 7
orale, que buena solucion diste...........en frances!!
  #27 (permalink)  
Antiguo 07/05/2005, 03:32
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Jajajaja, que facil es el mundo asi ...
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #28 (permalink)  
Antiguo 07/05/2005, 03:38
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por MaxExtreme
Código:
Declare Function GetPixel Lib "gdi32" Alias "GetPixel" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long

Const CLR_INVALID = &HFFFF
· hdc
Identifies the device context.
El hDC que estás usando para pintar.

· nXPos
Specifies the logical x-coordinate of the pixel to be examined.
Posición X del pixel.

· nYPos
Specifies the logical y-coordinate of the pixel to be examined.
Posición Y del pixel.

Return Value
If the function succeeds, the return value is an RGB value. If the pixel is outside of the current clipping region, the return value is CLR_INVALID.

Valor de Retorno
Si la función termina satisfactoriamente, devolverá el valor RGB (el color). Si el pixel está fuera de la región de pintado, el valor será CLR_INVALID (constante).



Otra cosa: Los colores son en el formato hexadecimal RRGGBB, RR el byte rojo, GG el byte verde y BB el byte azul. Por ejemplo, FFFF00 será el color amarillo: 255 rojo, 255 verde, 0 azul. Pero eso supongo que lo sabes.

Eso debería funcionar. ¿Has conseguido pintar bien? ¿Sabes a qué se refiere cada parámetro: handles, colores, etc...?
  #29 (permalink)  
Antiguo 07/05/2005, 15:49
 
Fecha de Ingreso: noviembre-2004
Mensajes: 30
Antigüedad: 19 años, 5 meses
Puntos: 0
Miren,

De momento he echo esto, el pacman se para cuando llega a una parte negra, el problema esta en k si la parte negra esta por arriba el pacman se para, pero si kuando esta parado kiero tirar hacia la izquierda o derecha el pacman se me va parando, otra cosa es k si tngo una parte negra por debajo,el pacman no se para hasta k no llega a la parte superior de la imagen. Weno pos estos son mis problems, si puede ser les agradeceria mucho su ayuda.

Cita:
Dim k As Variant
Private Type POINTAPI
X As Long
Y As Long
End Type
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long

Public Sub picture1_KeyDown(KeyCode As Integer, Shift As Integer)

If KeyCode = vbKeyDown Then
tmrtimer.Enabled = False
Call moure
k = 0
End If
If KeyCode = vbKeyRight Then
tmrtimer.Enabled = False
Call moure
k = 1
End If
If KeyCode = vbKeyUp Then
tmrtimer.Enabled = False
Call moure
k = 2
End If
If KeyCode = vbKeyLeft Then
tmrtimer.Enabled = False
Call moure
k = 3
End If
End Sub
Private Sub tmrtimer_Timer()
Select Case k

Case 0:
picpac.Top = (picpac.Top + 1)
Call black
If tmrtimer.Enabled = False Then
tmrtimer.Enabled = True
End If
Call black
Case 1:
picpac.Left = (picpac.Left + 1)
Call black
If tmrtimer.Enabled = False Then
tmrtimer.Enabled = True
End If
Call black
Case 2:
picpac.Top = (picpac.Top - 1)
Call black

Case 3:

picpac.Left = (picpac.Left - 1)
Call black


End Select
End Sub

Function moure()
tmrtimer.Enabled = True

End Function

Function black()
Dim XX As Long, YY As Long, A As Long
XX = picpac.Left - 1
YY = picpac.Top - 1
If vbBlack = GetPixel(Picture1.hdc, XX, YY) Then
tmrtimer.Enabled = False
End If
End Function
Copien este codigo y creen una picturebox que se llame "picture1".En picture cargan una imagen con una parte negra i otra de otro color.
Creen una Image dentro del picture que se llame "picpac", procurenle ponerla en la parte que no esta negra del picture1.
Creen un timer i nombrenlo "tmrtimer" ponganle en las opciones enabled FALSE y interval 1.

Asi podran ver lo k tngo exo. Por favor ayudenme k estoy estancado.

Gracias a todos.;)
  #30 (permalink)  
Antiguo 07/05/2005, 19:07
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por albertosalvad4
Miren,

De momento he echo esto, el pacman se para cuando llega a una parte negra, el problema esta en k si la parte negra esta por arriba el pacman se para, pero si kuando esta parado kiero tirar hacia la izquierda o derecha el pacman se me va parando, otra cosa es k si tngo una parte negra por debajo,el pacman no se para hasta k no llega a la parte superior de la imagen. Weno pos estos son mis problems, si puede ser les agradeceria mucho su ayuda.



Copien este codigo y creen una picturebox que se llame "picture1".En picture cargan una imagen con una parte negra i otra de otro color.
Creen una Image dentro del picture que se llame "picpac", procurenle ponerla en la parte que no esta negra del picture1.
Creen un timer i nombrenlo "tmrtimer" ponganle en las opciones enabled FALSE y interval 1.

Asi podran ver lo k tngo exo. Por favor ayudenme k estoy estancado.

Gracias a todos.;)
Veamos, has liado demasiado el código. Lo que debes hacer es colocar un Timer que será el bucle del juego principal, llamado cada X tiempo (100 ms por ejemplo). Cada vez que el timer "salte", entonces compruebas si hay algo pulsado y mueves el pacman... Pero antes debes comprobar si roza con algo. para ello, si primero lo quieres hacer cuadrado (o sea, que en realidad sea un cuadrado lo que choque y no un círculo), tienes que comprobar no lo que pones, sino:

Si no se sale de la zona de juego, entonces: Compruebas que no haya ningún pixel negro en todos los pixels "siguientes". Me explico: Tu tienes tu cuadrado que es el PacMan. Bien, entonces debes mirar si hay algún pixel negro en todos los pixels de alrededor: si se mueve hacia arriba, deberás comprobar toda la línea que va desde la esquina superior izquierda hasta la superior derecha, y así con todas las direcciones que se vaya a mover el PacMan.

Cuando consigas eso, sólo te queda añadir que también se "lea" el PacMan y se mire sólo los colores diferentes de blanco (que sería el supuesto fondo) comparándolos con los negros.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:21.