Creando un mapa

Agrupa todas las consultas sobre los lenguajes de programacion como C, C++, Python, Java ...

Creando un mapa

Notapor Mindro » Mié Jun 18, 2008 11:27 am

¡Buenas! Verán tengo un problema a la hora de crear un mapa, pues no se como ponerlo de fondo.Lo que unico que quiero es que la nave pueda "volar" sobre el mapa. Aquí está el código, supongo que la class Nivel estará entera mal. Os dejo aquí un pequeño pack con los gráficos y el código

Código: Seleccionar todo
#!/usr/bin/env python

import pygame
from pygame.locals import *
from sys import exit
from pygame.sprite import Sprite

class Nave(Sprite):
   
    def __init__(self):
        Sprite.__init__(self)
        self.image = pygame.image.load("nave.png")
        self.dx = 320
        self.dy = 240
       
    def update(self):
        self.update_input()
       
    def update_input(self):
        teclas = pygame.key.get_pressed()
       
        if teclas[K_UP]:
            self.dy-=1
     
        if teclas[K_DOWN]:
            self.dy+=1
   
        if teclas[K_LEFT]:
            self.dx-=1
     
        if teclas[K_RIGHT]:
            self.dx+=1
       
class Nivel(Sprite):
   
    def __init__(self):
        self.isla = 1
        self.agua = 0
   
    def getLayout(self):
        return [[9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 ,9, 9, 9, 9, 9, 9, 9, 9, 9, 9],\
                [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 ,9, 9, 9, 9, 9, 9, 9, 9, 9, 9],\
                [9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0, 0, 0, 0, 0, 0, 0, 1, 0, 9],\
                [9, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 ,0, 1, 0, 0, 0, 0, 0, 0, 0, 9],\
                [9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0, 0, 0, 0, 0, 0, 0, 0, 0, 9],\
                [9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,0, 0, 0, 0, 0, 0, 0, 0, 0, 9],\
                [9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0, 0, 0, 0, 0, 0, 0, 0, 0, 9],\
                [9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0, 0, 0, 1, 0, 1, 0, 0, 0, 9],\
                [9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9],\
                [9, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9],\
                [9, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9],\
                [9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9],\
                [9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 9],\
                [9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9],\
                [9, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 9],\
                [9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9],\
                [9, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9],\
                [9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 9],\
                [9, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9],\
                [9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9],\
                [9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 9],\
                [9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9],\
                [9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9]]
   
    def getSprites(self):
        isla, rect = pygame.image.load("isla.png")
        agua, rect = pygame.image.load("oceano.png", -0)
        return [isla,agua] 
   
pygame.init()

screen = pygame.display.set_mode((640,480),0,32)
pygame.display.set_caption("Shooter")
nave = Nave()
nivel = Nivel()

while True:

    for event in pygame.event.get():
        if event.type == QUIT:
            exit()
   
    screen.fill((0,0,0))
    screen.blit(nave.image,(nave.dx,nave.dy))
    nave.update()
    nivel.update()
    pygame.display.update()


Gracias :D
Avatar de Usuario
Mindro
 
Mensajes: 6
Registrado: Sab Mar 08, 2008 4:44 pm
Ubicación: Cádiz - España

Notapor endaramiz » Mié Jun 18, 2008 7:58 pm

Hola Mindro, he hecho la clase del mapa y te he corregido algunas cosillas de menos importancia pero que te ayudarán a tener una mejor base a la hora de ampliar el código.

Código: Seleccionar todo
#!/usr/bin/env python

# -*- coding: utf-8 -*-



import pygame

from pygame.locals import *

from sys import exit

from pygame.sprite import Sprite



class Nave(Sprite):

   

    def __init__(self):

        Sprite.__init__(self)

        # He añadido convert_alpha para que trabaje mejor el programa

        # He cambiado la extensión porque linux distingue entre minúsculas y mayúsculas

        self.image = pygame.image.load("nave.PNG").convert_alpha()

        # Aunque se puede evitar hacerlo, es recomendable tener self.rect en un sprite

        # ya que se utiliza en colisiones, draw...

        self.rect = self.image.get_rect()

       

        self.dx = 320

        self.dy = 240

        # Se sitúa el rect en su posición

        self.rect.center = (self.dx, self.dy)

       

    def update(self):

        self.update_input()

       

    def update_input(self):

        # He añadido espacios siguiendo la guía de estilo de python

        teclas = pygame.key.get_pressed()

       

        if teclas[K_UP]:

            self.dy -= 1

     

        if teclas[K_DOWN]:

            self.dy += 1

   

        if teclas[K_LEFT]:

            self.dx -= 1

     

        if teclas[K_RIGHT]:

            self.dx += 1

        # Al actualizar la posición también se tiene que mover el rect

        self.rect.center = (self.dx, self.dy)

       

class Nivel():#Sprite): No hace falta que sea un sprite por la función que tiene

    def __init__(self):

        #self.isla = 1

        #self.agua = 0

        self.getSprites()

        self.image = self.crear_mapa()

       

    def crear_mapa(self):

        tamanyo_sprite = self.agua.get_size()

        lado = tamanyo_sprite[0]  # La medida del lado del tile base (agua)(en este caso, 32)

        matriz_mapa = self.getLayout()

        isla = 1 # Número que tendrá la isla en la matriz

        # Se crea la superficie del mapa

        img_mapa = pygame.Surface((len(matriz_mapa[0]) * lado, len(matriz_mapa) * lado))

        # Se dibuja en todo el mapa un tile base (agua)

        for fila in range(0, len(matriz_mapa) - 1):

            for columna in range(0, len(matriz_mapa[0]) - 1):

                img_mapa.blit(self.agua, (columna * lado, fila * lado))

        # Se dibuja una isla cuando se encuentra un 1 en la matriz

        for fila in range(0, len(matriz_mapa) - 1):

            for columna in range(0, len(matriz_mapa[0]) - 1):

                if matriz_mapa[fila][columna] == isla:

                    img_mapa.blit(self.isla, (columna * lado, fila * lado))

        return img_mapa

   

    def getLayout(self):

        return [[9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 ,9, 9, 9, 9, 9, 9, 9, 9, 9, 9],\

                [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 ,9, 9, 9, 9, 9, 9, 9, 9, 9, 9],\

                [9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0, 0, 0, 0, 0, 0, 0, 1, 0, 9],\

                [9, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 ,0, 1, 0, 0, 0, 0, 0, 0, 0, 9],\

                [9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0, 0, 0, 0, 0, 0, 0, 0, 0, 9],\

                [9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,0, 0, 0, 0, 0, 0, 0, 0, 0, 9],\

                [9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0, 0, 0, 0, 0, 0, 0, 0, 0, 9],\

                [9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0, 0, 0, 1, 0, 1, 0, 0, 0, 9],\

                [9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9],\

                [9, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9],\

                [9, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9],\

                [9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9],\

                [9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 9],\

                [9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9],\

                [9, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 9],\

                [9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9],\

                [9, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9],\

                [9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 9],\

                [9, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9],\

                [9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9],\

                [9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 9],\

                [9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9],\

                [9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9]]

   

    def getSprites(self):

        # He añadido convert para que trabaje mejor el programa

        # image.load() solo devuelve una superficie

        # He añadido el self. delante para así no tener que hacer el return

        self.isla = pygame.image.load("isla.PNG").convert()

        self.isla.set_colorkey(self.isla.get_at((0, 0)))

        self.agua = pygame.image.load("agua.PNG").convert()#"oceano.png"), -0)

        #return [isla,agua] 

   

pygame.init()



screen = pygame.display.set_mode((640,480),0,32)

pygame.display.set_caption("Shooter")

nave = Nave()

nivel = Nivel()



# Se crea un grupo de sprites (ver mas abajo)

sprites = pygame.sprite.Group()

sprites.add(nave)



while True:

    for event in pygame.event.get():

        if event.type == QUIT:

            exit()

   

    screen.blit(nivel.image, (0, 0))

    #screen.fill((0,0,0))  # Al dibujar el mapa no hay que pintar la pantalla de negro

    #screen.blit(nave.image, nave.rect)  # No es que este mal... (ver mas abajo)

    #nave.update()

   

    sprites.update()  # Pero así mejor (ver mas abajo)

    sprites.draw(screen)

   

    #nivel.update()

    pygame.display.update()



# Se podía hacer de la manera que lo estabas haciendo pero una ventaja de los

# sprites es poder actualizar y dibujar todos a la vez, sobretodo si tienes

# mas de uno, que es lo que suele pasar en los juegos.

He ido comentando lo que hacía pero si hay algo que no te ha quedado claro no dudes en preguntar.
Esta es la guía de estilo que te he comentado. Estaría bien que te la leyeses. También tienes la versión en inglés.

Saludos.
Avatar de Usuario
endaramiz
 
Mensajes: 283
Registrado: Vie Ago 31, 2007 9:25 am
Ubicación: Barcelona

Notapor Mindro » Jue Jun 19, 2008 7:34 am

Muchisimas gracias dvd, por el código y por la guía, me es muy util ^^
Avatar de Usuario
Mindro
 
Mensajes: 6
Registrado: Sab Mar 08, 2008 4:44 pm
Ubicación: Cádiz - España


Volver a Sobre lenguajes de programación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado