Array

Arrays en Pygame

Posted on mayo 13, 2007. Filed under: Array, PyGame, Python |

Para trabajar con arrays hay que tener el paquete Numpy (antes conocido como Numeric) de python, ya que  pygame no lo trae incluido así que hay que instalarlo.
Lo bajan de aqui y pueden elegir el .exe o el codigo fuente, para eso hay que escribir lo siguiente: python setup.py install

La libreria Numpy tienen millones de funciones utiles para realizar calculos matematicos, tiene desde arccos() hasta funciones para ordenar por quicksort, son muchisimas, en esta pagina hay un listado con ejemplos.

Para utilizar esta libreria, al comienzo de nuestro codigo fuente hay que agregar esto: from numpy import * entonces nuestra cabecera quedaria asi:

import pygame
from pygame.locals import *
from
numpy import *

Para el caso puntual de la creación de un vector:

a =  array ([1,2,3,4])
b= array([5,6,7,8])
print a + b

Resultado: [6,8,10,12]

Hay muchos ejemplos de trabajos con arrays, lo mejor seria que chequeen los ejemplos que trae en la documentación, en el link que les pasé antes.

Algunas funciones importantes:

Por ejemplo para crear un vector vacio (lleno de ceros) usamos la funcion zero, de esta forma:

zeros(5)   #devuelve un vector con 5 ceros (en flotante)

zeros ((2,2), int)  #devuelve:
                                                  [0,0]
                                                  [0,0]

Atencion: si no se especifica int, la funcion zeros devuelve un array con coma flotante.

Otra función bastante útil es crear un array con numeros aleatorios, para eso usamos la función random_integers(), pero para esto debemos agregar el paquete random de numpy y nuestro código quedaría así:

from numpy import *
from
numpy.random  import *

Entonces para crear un array con números aleatorios escribimos lo siguiente random_integers(minimo,maximo,tamaño) donde mínimo es el menor numero aleatorio posible y máximo el mayor, en tamaño debemos establecer la dimensión del array, por ejemplo puede ser (2,2) o  (3,5), etc.

Si quisiéramos obtener un numero aleatorio y no un array usamos la función randint()

Una aplicación práctica

Hoy necesitaba guardar los botones que se están presionando en el mouse, entonces utilicé la funcion get_pressed pero esta función solo me devolvía los 3 botones presionados (y mi mouse tiene 5 contando la ruedita) ejemplo de uso:

botones=pygame.mouse.get_pressed()  #esto me devuele un array de 3 elementos

Si yo tengo apretado el boton izquierdo me devuelve este array (1,0,0) y si tengo apretado el derecho (0,0,1). La desventaja de esta función, es que no lee la “ruedita del mouse”, entonces utilice lo siguiente:

botones=zeros(5,int)       #creamos un vector (0,0,0,0,0) para guardar los estados de los botones

while 1:
       for event in pygame.event.get():     
          if event.type == MOUSEBUTTONDOWN:
             botones[event.button-1]=1
          if event.type == MOUSEBUTTONUP:
             botones[event.button-1]=1

Con este codigo estamos leyendo siempre si se aprietan o se sueltan los botones del mouse. Si giramos la ruedita del mouse puede ser para arriba (boton 4) o para abajo (boton 5), y en la posicion 3 y 4 respectivamente guardamos 1. Todo esto lo solucionamos de una manera bastante sencilla usando arrays.

Nota: En este ejemplo, cuando giramos la ruedita, se graba 1 en el vector pero como luego la soltamos se vuelve a poner en cero, y parece que no esta apretado, para solucionar eso podemos usar una variable bandera.

Powered by ScribeFire.

Anuncios
Leer entrada completa | Make a Comment ( 1 so far )

Colisiones entre infinitos MovieClip para Juego de Disparos – Juegos Flash ActionScript

Posted on enero 12, 2007. Filed under: Array, Clases, Colisiones, Condicionales, Ejemplos Mios, Eventos, Flash, Funciones, Guias, Loop, Movie Clips, Movimiento, Objetos |

Bueno, ya conseguí hace mi primer juego de disparos aca esta el link

Aca el los archivos fuente. Aunque hay que actualizarlos con este codigo

El problema de hacer un juegos con infinitos disparos y enemigos, es como asignar los nombres para efectuar las colaciones. No sabia como hacerlo al comienzo, pero pregunte en cristalab me ayudaron y lo termine. Aca el post

El código es este
Película principal

Código Película principal :
////////// Inicio Muros
// Crea la Array que va a guardar los nombres de todas las rocas que caen
var MiArray:Array = new Array();
// Variable que nos sirve de contador para que cada nuevo clip tenga nombre nuevo
var contaMuros:Number = 0;
// Funcion que hace que apareca un nuevo Muro en la pelicula
function crearMuros() {
   // Cada vez que se ejecuta la funcion crearMuros se aumenta en 1 el contador
   contaMuros++;
   // Agrega en la ultima posicion de la array un attachMovie y queda como valor el nombre de el mouro.
   // El movieClip id_muro sirve de padre de todas las rocas. Hereda las propiedades de la Clase Muro.as
   _root.MiArray.push(_root.attachMovie("id_muro", "muro"+contaMuros, getNextHighestDepth()));
}
// Intervalo que hace que se ejecute la funcion crearMuros
var miInterval:Number = setInterval(crearMuros, 500);
////////// Fin Muros

////////// Inicio Laser
// Variable que nos sirve de contador para que cada nuevo clip tenga nombre nuevo
var contaLaser:Number = 0;
this.boton.onPress = function() {
   // Cada vez que se pulsa el boton se aumenta en 1 contaLaser
   contaLaser++;
   // Agrega un laser en la pelicula. Este larser hereda todas las propiedades de la Clase Laser.as
   _root.attachMovie("id_laser", "laser"+contaLaser, getNextHighestDepth());
};
////////// Fin Laser

////////// Inicio Explosion y Puntaje
// Funcion que hace que aparesca la explosion. Se activa cuando hay una colisión.
// Cada vez que explota  cambia el puntaje
_global.contaExplosion = 0;
function Explosion() {
   // Variable que nos sirve de contador para que cada nuevo clip tenga nombre nuevo
   contaExplosion++;
   _root.attachMovie("id_explosion", "explosion"+contaExplosion, getNextHighestDepth(), {_y:115, _x:350});
   // Hay un texto dinamico con variable llamada Puntaje.
   Puntaje = "Puntos: "+(contaExplosion*20);
}
////////// Fin Explosion y Puntaje

////////// Inicio Cronometro
// Esto hace que el juego dure 15 segundos.
var Cronometro:Number = 15;
// Funcion que se repetira cada 1000 milisegundos osea 1 segundo
function cuentaAtras() {
//   Cada vez que se ejectua esta funcion se le resta 1 a el Cronometro
   Cronometro--;
   // cuando la variable cronometro llega a 0 para los muros y va al frame 3
   if (Cronometro<0) {
      _root.gotoAndStop(3);
      clearInterval(miInterval);
   }
   // Esto hace que aparesca el tiempo en un texto dinamico
   tiempo = "Tiempo: "+Cronometro;
}
var Reloj:Number = setInterval(cuentaAtras, 1000);
////////// Fin Cronometro

Código Clase laser Laser.as  :

// Importa la clase Tween que nos va a servir para darle movimiento  a la bala
import mx.transitions.Tween;
// La Clase Laser hereda las propiedades del objeto MovieClip, para que pueda hacer todas las cosas que
// hace un MovieClip y no de error. Esta Clase la hereda el MovieClip id_laser en la película principal desde la biblioteca
class Laser extends MovieClip {
    // Funcion Constructora. Se ejecuta cuando el MovieClip que hereda esta clase se crea con un attachMovie
   function Laser() {
      // Posicion vertical
      this._y = 115;
      // Este codigo hace que el disparo se mueva.
      var miDisparo:Tween = new Tween(this, "_x", mx.transitions.easing.None.easeNone, 70, 500, 15, false);
      // variable que ayuda a que no se pierda la referencia de this en las siguientes funciones.
       var scope = this;
      // un evento de la clase Tween que ejecuta un codigo cuando el movimiento termina el recorrido.
      // Parecido a enterFrame
      miDisparo.onMotionFinished = function():Void  {
         // Cuando termina el recorrido el Movieclip, este es eliminado
         scope.removeMovieClip();
      };
      // un evento de la clase Tween que ejecuta un codigo cuando el movimiento se esta produciendo. Parecido a enterFrame
      miDisparo.onMotionChanged = function():Void  {
         // Este pedazo es la razon de este post y la parte mas dificil. Asi que veneradlo. Si lees el post entenderas este pedazo
         // Cada vez que nace un muro, este deja el registro de su nombre en la array MiArray.
         // Y cada vez que un muro es eliminado o termina su recorrido, su nombre tambien es eliminado de la array.
         // Cada vez que nace un laser, este revisa todos los muros que hay en la pelicula,
         // revisando todos los datos que hay en la array MiArray.
         for (var i:Number = 0; i<_root.MiArray.length; i++) {
            if (scope.hitTest(_root.MiArray[i])) {
               // Si choca contra algun movieClip que tenga el nombre archivado en la Array MiArray
               // de la pelicula principal, el movieClip que herede esta clase se elimina
               scope.removeMovieClip();
               // elimina tambien la roca con la que choco
               _root.MiArray[i].removeMovieClip();
               // ejecuta la funcion Explosion de la pelicula principal. Esta funcion hace que salga la explosion
               _root.Explosion();
            }
         }
      };
   }
}

Código Clase Muro Muro.as:

// Lo mismo que la Clase Laser :)
import mx.transitions.Tween;
class Muro extends MovieClip {
   public function Muro() {
      this._x = 342;
      var miDisparo:Tween = new Tween(this, "_y", mx.transitions.easing.None.easeNone, -35, 200, 25, false);
      var scope = this;
      miDisparo.onMotionFinished = function() {
         scope.removeMovieClip();
// Cuando una roca termina su recorrido, elimina el primer elemento de la array, Osea, el nombre del MovieClip que heredo esta clase
         _root.MiArray.shift();
      };
   }
}

Leer entrada completa | Make a Comment ( 17 so far )

Eliminar elementos de una Array

Posted on diciembre 22, 2006. Filed under: Array, Flash |

delete

var miLista = [1,2,3,4,5,6,7];
delete miLista[2];

Resultado:

trace (miLista);
1,2,undefined,4,5,6,7

length

var miLista = [1,2,3,4,5,6,7];
miLista.length=3;

Resultado:

trace (miLista);
1,2,3

pop

var miLista = [1,2,3,4,5,6,7];
miLista.pop();

Resultado:

trace (miLista);
1,2,3,4,5,6

shift

var miLista = [1,2,3,4,5,6,7];
miLista.shift();

Resultado:

trace (miLista);
2,3,4,5,6,7

reverse

var miLista = [1,2,3,4,5,6,7];
miLista.reverse();

Resultado:

trace (miLista);
7,6,5,4,3,2,1

sort

var miLista = [2,7,4,6,3,5,1];
miLista.sort();

Resultado:

trace (miLista);
1,2,3,4,5,6,7

splice

var miLista = [0,1,2,3,4,5,6,7];
miLista.splice(4,2);

Resultado:

trace (miLista);
0,1,2,3,6,7

Sintaxis de splice (indice, conteo, elemento1, elemento2 ………, elementex);

Leer entrada completa | Make a Comment ( 1 so far )

Agregar elementos a una Array

Posted on diciembre 22, 2006. Filed under: Array, Flash |

Manera Directa

var miLista = [0,1,2];
miLista[3] =3;

Resultado:

trace (miLista);
0,1,2,3

push

var miLista = [0,1,2];
miLista.push(3);

Resultado:

trace (miLista);
0,1,2,3

unshift

var miLista = [0,1,2];
miLista.unshift(3);

Resultado:

trace (miLista);
3,0,1,2

splice Agrega elemento en donde se quiera y cuantos se quieran

var miLista = [0,1,2,3,4,5,6,7];
miLista.splice(4,2,”A”,”B”);

Resultado:

trace (miLista);
0,1,2,3,A,B,6,7

Sintaxis de splice (indice, conteo, elemento1, elemento2 ………, elementex);

Leer entrada completa | Make a Comment ( None so far )

Creando Arrays y luego dandole valor

Posted on diciembre 5, 2006. Filed under: Array, Flash |

Lo hacemos asi, Por ejemplo se crear una array sin valores y luego se le dan

var colores = new Array();
colores[0] = “0-Rojo”;
colores[1] = “1-Azul”;
colores[2] = “2-Verde”;
colores[3] = “3-Amarillo”;
trace (colores);

Resultado

0-Rojo,1-Azul,2-Verde,3-Amarillo

Leer entrada completa | Make a Comment ( None so far )

Uso de Array 1 en Flash

Posted on noviembre 30, 2006. Filed under: Array, Flash |

Como se Crear un Array

Asi se muestra una array

var x = [“Campo 1”, 2000, 3000];trace (x);

El resultado es…

Campo 1,2000,3000

Para identificar un campo se hace con [0], [1], [2] etc. De tal manera que…

x[0] = Campo 1
x[1] = 2000
x[2] = 3000

Si queremos cambiar un valor de un campo de la array seria…

var x = [“Campo 1”, 2000, 3000];
x[1] = 1000;
trace (x);

El resultado seria

Campo 1,1000,3000

Si solo queremos utilizar un campo, seria

var x = [“Campo 1”, 2000, 3000];
var y = x;
trace (x[2]);

Resultado seria

3000

x[0] = “Primer elemento”;

var x = [“Marco”, 18, 24.12];
var y = x;
x[2] = “Primer elemento”;
trace (x);

Cuando se crear una variable con array, los datos de esta pueden ser afectados por cualquier variable. Por ejemplo.

var x = [“Campo 1“, 2000, 3000];var y = x;
x[0] = “Campo X“;
y[0] = “Campo Y“;

trace (x[0]);

Resultado

Campo Y
Campo Y

Para que no pase esto, existe la función slice(0)

var x = [“Campo 1“, 2000, 3000];
var y = x.slice(0);
x[0] = “Campo X”;
y[0] = “Campo Y”;
trace (x[0]);
trace (y[0]);

Resultado

Campo X
Campo Y

Como identificar el Numero de Campos ocupados por una Array con length . Ejemplo

var Usuario = [“Pepe”, “Paco”, “Ramon”, “Juan”];
trace (“El Nº de Usuarios es “+Usuario.length);

El resultado seria…

El Nº de Usuarios es 4

Leer entrada completa | Make a Comment ( None so far )

Liked it here?
Why not try sites on the blogroll...