domingo, 11 de diciembre de 2011

Objetos del Mundo

Hola a todos, durante estos días que no he publicado nada he ido mejorando la estructura del juego para que nos sea más fácil de entender a todos.
No os asustéis, todo lo que hemos visto hasta ahora no cambia mucho. Lo que he hecho es redefinir y reubicar los métodos de algunas clases y crear otras que nos será de utilidad en futuras entregas.
Hoy voy a presentar la clase Objeto_Mundo. Esta clase establece los valores por defecto y los métodos comunes de todos los objetos con los que se quiere interactuar en el juego (Jugador, NPC, Objetos varios, etc..).
Os adjunto el código fuente con los comentarios correspondientes para que no os perdáis mucho.
# -*- coding: utf-8 -*-
import pygame
from utilidades.imagen import cortar_tileset


class Objeto_Mundo:
   
    NORTE = 0
    SUR = 1
    ESTE = 2
    OESTE = 3
    
    # Velocidad de movimiento del Objeto.
    VELOCIDAD = 0
    
    def __init__(self, nombre, imagen, tile_alto, tile_ancho):

        # Nombre identificativo del Objeto
        self.nombre = nombre
        self.tipo = "Objeto"

        self._tile_alto = tile_alto
        self._tile_ancho = tile_ancho

        # Nos definimos un rectangulo para moverlo por el juego
        self._rect = pygame.Rect(0, 0, self._tile_ancho, self._tile_alto)
        
        # Tileset con las imagenes del objeto.
        self._tileset = cortar_tileset(imagen, (self._tile_ancho, self._tile_alto), False)
        
        # Offset para dibujar el objeto. 
        # Por defecto es el centro del tile.
        self._offset_x = self._tile_ancho / 2
        self._offset_y = self._tile_alto / 2
        
        # Establecemos la dirección por defecto hacia donde mirará el Objeto.
        self._direccion = Objeto_Mundo.SUR
        
        # Creamos un array con los valores de [fila,columna] con respecto a su posición en los 4 puntos cardinales.
        # Por ejemplo, para ir hacia el NORTE deberemos restar -1 a la fila en la que estamos y la columna la 
        # deberemos dejar igual, en este caso le sumaríamos 0.
        self._direcciones = [[-1, 0], [1, 0], [0, 1], [0, -1]] # N,S,E,O
        
        # Creamos el array con las animaciones.
        # Por defecto siempre se dibujará el tile 0 del array de imagenes del tileset que hemos cargado anteriormente.
        self._animacion = [[0],[0],[0],[0]] # N,S,E,O
                      
        # Frame actual de la animación.
        self._frame = 0
        
        # Variable para bloquear un objeto y no se pueda mover
        self.bloqueado = True                    
        
        # Nos guardamos una imagen del tileset, en este caso la primera.
        self.imagen_objeto = self._tileset[0]
        
    def update(self):
        pass
        
    def dibujar(self, destino):
        # Obtenemos el _frame que debemos dibujar dependiento de la orientaci�n del personaje.
        cuadro_animacion = self._animacion[self._direccion][self._frame]

        # Dibujamos el tile correspondiente, teniendo encuenta el offset que establecimos al principio.
        destino.blit(self._tileset[cuadro_animacion], (self._rect.centerx - self._offset_x, self._rect.centery - self._offset_y))

    # Retorna las coordenadas centrales X e Y del objeto.
    def obtener_coordenadas(self):
        return (self._rect.centerx, self._rect.centery)

    # Establece la dirección del objeto.
    def actualizar_direccion(self, direccion):
        self._direccion = direccion
    
    # Obtiene la dirección actual del objeto.
    def obtener_direccion(self):
        return self._direccion

    # Establece la nueva coordenada central X e Y del objeto.
    def actualizar_posicion(self, (coord_x, coord_y)):
        self._rect.centerx = coord_x
        self._rect.centery = coord_y
        
    # Mueve el rectángulo del objeto, en la orientación indicada un número de pixeles igual a la velocidad pasada. 
    def mover(self, orientacion, velocidad=VELOCIDAD):        
        if ((orientacion != None) and (not self.bloqueado)): # Si no está bloqueado entonces se puede mover.
            self.actualizar_direccion(orientacion)
            self._rect.move_ip(self._direcciones[self._direccion][1] * velocidad, self._direcciones[self._direccion][0] * velocidad)


Ahora que ya tenemos la estructura básica de un Objeto del juego, vamos a declara una clase que herede de esta que se llamará Objeto_Vacio.
¿Para que servirá?: Pues imaginaros que con el Tiled Map Editor hemos creado un mapa, con un reloj en una pared y queremos que el Personaje pueda interactuar con él.
La clase crea un Objeto del Mundo con una imagen transparente (objeto_vacio.png).
# Clase que define un Objeto con una imagen transparente.
class Objeto_Vacio(Objeto_Mundo):
    
    def __init__(self, nombre):
        Objeto_Mundo.__init__(self, nombre,'data/imagenes/objeto_vacio.png',16,16)
Para crear un objeto de este tipo en el juego solo deberemos escribir el siguiente código:
self._ordenador = Objeto_Vacio('Reloj')


Si tenéis alguna duda al respecto dejar un comentario y os contestaré lo antes posible.

No hay comentarios:

Publicar un comentario