Problema con BlockBreaker

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

Problema con BlockBreaker

Notapor Juanxo » Sab Ene 31, 2009 3:40 am

Buenas a todos! soy un newbie en esto de pygame. estoy tratando de hacer un BlockBreaker(ese juego de una bola rompiendo ladrillos) y me ha surgido un problemilla.
Mi intencion es la de hacer diferentes bloques con diferentes numero de vidas(uno se rompa con un golpe, otro con 2, etc)
Existe alguna manera de automatizar esto o tendria que ir comprobando bloque por bloque aver si hay choques y restar vidas??

Gracias de antemano
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Notapor sofoke » Sab Ene 31, 2009 7:27 pm

A mi parecer (probablemente habrá mejores opciones) pero creo que la mejor manera es comprobar bloque por bloque e ir restando vida... Lo cual implica que incluso a los que deben de morir (desaparecer) con un golpe darle un porcentaje de vida (por ejemplo 1, y restar -1 en cada impacto).
Tal vez (y por que no) una buena idea seria crear un namespace (espacio con nombre) y crear varios ( de la misma base, claro..) crearlo para cada uno de los bloques lo cual creo que te ahorrara muchas lineas ( e incluso tal vez, algo de tiempo)...
Aun que si encuentras una forma mejor , seria maravilloso que nos comentaras de como fueron los resultados que obtuviste...
...cuando lo popular no es suficiente...
Gnu-Linux-y-Más
Avatar de Usuario
sofoke
 
Mensajes: 102
Registrado: Jue May 24, 2007 8:10 pm
Ubicación: México

Re: Problema con BlockBreaker

Notapor hugoruscitti » Dom Feb 01, 2009 3:06 am

Juanxo escribió:Buenas a todos! soy un newbie en esto de pygame. estoy tratando de hacer un BlockBreaker(ese juego de una bola rompiendo ladrillos) y me ha surgido un problemilla.


uhh, si, me acuerdo de ese juego, yo lo concía bajo el
nombre "arkanoid".

Juanxo escribió:Mi intencion es la de hacer diferentes bloques con diferentes numero de vidas(uno se rompa con un golpe, otro con 2, etc)
Existe alguna manera de automatizar esto o tendria que ir comprobando bloque por bloque aver si hay choques y restar vidas??

Gracias de antemano


no, en realidad no es algo que se automatice, en todo
caso lo que puedes hacer es crear una clase de objeto
que tenga el comportamiento de un bloque y luego
replicarlo en todos los bloques que necesites.

Te dejo un ejemplo reducido de como imagino que se podría
hacer:

Imagen

El objetivo del ejemplo es mostrar un pelota blanca que se
mueve de izquierda a derecha, los rectángulos de colores
son bloques que cambian de color cuando la pelota los
toca. Cada bloque se puede eliminar pegángole con la
pelota 3 veces.

Aquí está el código:

Código: Seleccionar todo
import pygame
from pygame.sprite import Sprite

class Pelota(Sprite):
    """Representa una pelota que se mueve de izquierda a derecha."""

    def __init__(self):
        Sprite.__init__(self)
        x = 160
        y = 100

        self.rect = pygame.Rect(x, y, 20, 20)
        self.direction = 1

    def draw(self, screen):
        color = (255, 255, 255)
        pygame.draw.circle(screen, color, self.rect.center, 10)
   
    def update(self):
        """Simula un movimiento de izquierda a derecha.

        El movimiento depende directamente de la variable `direction`
        que se altera solamente llamando al metodo 'flip()'."""

        self.rect.x += self.direction

        # aplica limites a la pantalla
        if self.rect.right > 320:
            self.rect.right = 320
            self.flip()
        elif self.rect.left < 0:
            self.rect.left = 0
            self.flip()

    def flip(self):
        "invirte el sentido de movimiento de la pelota."
        self.direction *= -1



class Bloque(Sprite):
    """Representa un bloque de color que puede ser golpeado por la pelota."""

    def __init__(self, x, y):
        Sprite.__init__(self)
        self.life = 2
        self.rect = pygame.Rect(x, y, 40, 20)

    def draw(self, screen):
        colores = [(200, 100, 100), (100, 255, 100), (255, 255, 100)]
        color = colores[self.life]

        pygame.draw.rect(screen, color, self.rect)

    def reduce_life(self):
        "Reduce la vida del bloque, y elimina el bloque si ya no tiene vida."

        if self.life == 0:
            print "se elimina el bloque"
            self.kill()
        else:
            self.life -= 1
            print "reduciendo la vida del bloque a:", self.life


def main():
    pygame.init()
    screen = pygame.display.set_mode((320, 240))
    clock = pygame.time.Clock()
    quit = False

    # Genera los sprites de la escena.
    pelota = Pelota()

    bloques = pygame.sprite.Group()
    bloques.add(Bloque(2, 100))
    bloques.add(Bloque(50, 100))
    bloques.add(Bloque(250, 100))


    # bucle principal del juego
    while not quit:
        clock.tick(60)

        for e in pygame.event.get():
            if e.type == pygame.QUIT:
                quit = True

        # colisiones
        sprite_collided = pygame.sprite.spritecollideany(pelota, bloques)

        if sprite_collided:
            sprite_collided.reduce_life()
            pelota.flip()   # invierte el sentido de movimiento.

        # actualizacion logica
        pelota.update()
        bloques.update()


        # actualizacion de pantalla
        gris = (100, 100, 100)
        screen.fill(gris)
        pelota.draw(screen)

        # pinta los bloques uno por uno.
        for bloque in bloques.sprites():
            bloque.draw(screen)

        pygame.display.flip()

if __name__ == '__main__':
    main()
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor Juanxo » Dom Feb 01, 2009 1:14 pm

Gracias a todos por la ayuda. lo de cambiar de color es una cosa interesante.Lo que voi a intentar es transformar los bloques grises(2 golpes) en uno morado(1 golpe) cuando la bola choque con ellos

Gracias de verdad
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Notapor Juanxo » Mar Feb 03, 2009 5:43 pm

Creo que encontre la solucion!!!
Mirando en pygame docs encontre un metodo llamado collidelist, que comprueba si alguno de los rectangulos en la lista ha colisionado, devolviendo el indice del que ha colisionado.

Usando esto puedo hacer una lista que contenga los bloques de 2 golpes, hallar cual colisiona y transformarlo o quitarle vidas o lo que sea...

Esto es lo que yo entendí. si alguien me lo confirmara o me lo desmintiera se lo agradeceria

Gracias
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Notapor endaramiz » Mar Feb 03, 2009 11:22 pm

Juanxo escribió:Creo que encontre la solucion!!!
Mirando en pygame docs encontre un metodo llamado collidelist, que comprueba si alguno de los rectangulos en la lista ha colisionado, devolviendo el indice del que ha colisionado.

Usando esto puedo hacer una lista que contenga los bloques de 2 golpes, hallar cual colisiona y transformarlo o quitarle vidas o lo que sea...

Esto es lo que yo entendí. si alguien me lo confirmara o me lo desmintiera se lo agradeceria
Mi inglés no es muy bueno, pero yo también entendí eso. Aunque podría provocar un comportamiento algo extraño en las colisiones. A lo mejor conviene más utilizar collidelistall.
También puede ser interesante utilizar 'Group's que pueden tratar colisiones.

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


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