laberinto

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

laberinto

Notapor xulubkisin » Dom Jun 21, 2009 4:14 pm

bueno, me acerco a uds para ver si me colaboran en esto que quiero hacer hace rato, pero por falta de sabiduria no he podido terminar, se trata de un laberinto casi imposible de solucionar, pero la cuestin es hacer una colision para una imagen completa y ademas tan grande en formato "png".

la otra parte del juego que es el movimiento de la pelota atravez del laberinto y la creacion de un afecto camara, eso lo saque de un ejemplo de esta pagina http://brunoprog64.blogsome.com/2008/01/24/efecto-de-camera-con-pygame/ el de esta pagina tiene unos cuantos errores que arregle a duras penas, quemando pestaña toda una semana, por que la verdad no encontre nada mas en ningun sitio, y no se mucho de programar, por eseo me fue tan dificil, pero ya esta. bueno, aqui esta el codigo

Código: Seleccionar todo
# #### efecto camara laberinto #### #

# -*- coding: iso-8859-1 -*-

import wx

provider = wx.SimpleHelpProvider()
wx.HelpProvider_Set(provider)

import MyFrame


class App(wx.App):
    def OnInit(self):
        wx.InitAllImageHandlers()
        self.main = MyFrame.MyFrame(None,-1,'')
        self.main.Show()
        self.SetTopWindow(self.main)
        return 1

def main():
    application = App(0)
    application.MainLoop()

if __name__ == '__main__':
    main()




class VwXtaskBar(wx.TaskBarIcon):
    def __init__(self,win):
        self.win=win
        wx.TaskBarIcon.__init__(self)
        self.Bind(wx.EVT_TASKBAR_MOVE,self.VwXAllEvents)
        self.Bind(wx.EVT_TASKBAR_LEFT_DOWN,self.VwXAllEvents)
        self.Bind(wx.EVT_TASKBAR_LEFT_UP,self.VwXAllEvents)
        self.Bind(wx.EVT_TASKBAR_RIGHT_DOWN,self.VwXAllEvents)
        self.Bind(wx.EVT_TASKBAR_RIGHT_UP,self.VwXAllEvents)
        self.Bind(wx.EVT_TASKBAR_LEFT_DCLICK,self.VwXAllEvents)
        self.Bind(wx.EVT_TASKBAR_RIGHT_DCLICK,self.VwXAllEvents)
        self.Bind(wx.EVT_MENU,self.OnMenu,id=-1)
       
    def VwXAllEvents(self,event):
        self.win.GetEventHandler().ProcessEvent(event)
        if(event.GetEventType()==wx.wxEVT_TASKBAR_RIGHT_DOWN):
            event.Skip(True)

    def CreatePopupMenu(self):
        return self.win.VwXGetTaskBarMenu()

    def OnMenu(self,event):
        self.win.GetEventHandler().ProcessEvent(event)



import pygame
from pygame.locals import *

pygame.init()



campo = pygame.image.load('imag/campo.jpg')
bola = pygame.image.load('imag/icono3.png')
fondo = pygame.image.load("imag/laberinto.png")
bol = bola.get_rect()




bol.left = 35
bol.top = 45

bola_tl = bol.left
bola_tt = bol.top
ayu = 5

clock = pygame.time.Clock()

screen = pygame.display.set_mode((320,240))

n = 0
campo_x = 0
campo_y = 0





while n <> 1:
    screen.blit(campo, (campo_x,campo_y))
    screen.blit(bola, (bola_tl, bola_tt))
    screen.blit(fondo, (campo_x, campo_y))
    pygame.display.flip()
   
    clock.tick(50)
   
    pygame.event.pump()
    tecla_pres = pygame.key.get_pressed()
   
 
   
    if tecla_pres[K_LEFT]:
        bol.left = bol.left - 5
        bola_tl = bola_tl - 5
       
        if bola_tl <10> 10:
               
                bola_tl = 10
                campo_x = campo_x + ayu
            else:
                bola_tl = 10
                bol.left = 10
       
    if tecla_pres[K_RIGHT]:
        bol.left = bol.left + 5
        bola_tl = bola_tl + 5
       
       
        if bola_tl > 290:
            if bol.left  <4970> 20:
                   
                   bola_tl = 290
                   campo_x = campo_x - ayu
            else:     
              bola_tl = 290
              bol.left = 4970
             
               
             
               
    if tecla_pres[K_UP]:
        bol.top = bol.top - 5
        bola_tt = bola_tt - 5
       
        if bola_tt <10> 10:
               
                bola_tt = 10
                campo_y = campo_y + ayu
            else:
                bola_tt = 10
                bol.top = 10
         
       
    if tecla_pres[K_DOWN]:
        bol.top = bol.top + 5
        bola_tt = bola_tt + 5
       
       
        if bola_tt > 210:
            if bol.top  <4970> 210:
                   
                   bola_tt = 210
                   campo_y = campo_y - ayu
            else:     
                bola_tt = 210
                bol.top = 4970
             
             
             
             
             
    for event in pygame.event.get():
        if event.type == QUIT:
            n = 1
        if event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                n = 1
            if event.key == K_p:
                print "Valor Campo_x: ", campo_x
                print "Valores de bola - Camara:"
                print "Left: ", bol.left
                print "Top: ", bol.top
                print "Valores de bola - Pantalla:"
                print "Left: ", bola_tl
                print "Top: ", bola_tt


y pues aca esta un rar de el proyecto, por si quieren verlo funcionando y veran que es lo que quiero hacer, es un poquito pesado, pero por lo que las imagenes de el laberinto son tan grandes.
por algo es un laberinto casi imposible de solucionar.

http://rapidshare.com/files/247044695/laberinto_paso_1.rar.html
xulubkisin
 
Mensajes: 8
Registrado: Vie Jun 19, 2009 3:46 pm

Notapor lacabra25 » Mar Jun 23, 2009 9:52 am

Primero, si ya tenias abierto un tema para este problema no veo la nacesidad de ke vuelvas a abrir otro tema para lo mismo, en una parte porque ahora toda la informacion esta separada en dos temas (y no es nada gracioso tener que estar de un tema a otro para ver de ke va la cosa) y por otra parte por ser una forma poco eficiente de aprovechar la capacidad comunicativa de un foro ya que haces a la gente perder el tiempo en mirar mas temas cuando tratan de lo mismo, ademas de uqe dificultas que te puedan responder pues no es comodo como ya he mencionado tener que saltar de un tema a otro tratando de lo mismo.

Ahora respecto al laberinto, como ya te han mencionado lo que estas haciendo no es para nada eficiente, en lugar de tener todo el laberinto ya dibujado y solo cargarlo y mostrarlo en pantalla lo mas eficiente y que es como se suele hacer (y recuerdo que ya te lo han comentado en el otro tema que pusistes para esto mismo) es usar tiles, con tener una imagen de un solo cuadrado del laberinto puedes dibujar cualquier laberinto en la pantalla con una funcion que teniendo en cuenta una matriz 2x2 se encargue de dibujar el mapa.

101111111
101110111
100000001
111111101

Con esto ademas se te queda muy facil el tema de las colisiones ya que solo debes tener en cuenta las coordenadas de la bola y la matriz con la que dibujas el laberinto y asi saber si la bola esta mas en un ladrillo o en el espacio entre los mismos, por ejemplo si el ladrillo mide 10 px, teniendo en cuenta la matriz anterior, y suponiendo que la bola esta en las coordenadas 15 20 y que la bola tiene un diametro de 10 px estaria en la segunda columna (centrada) y entre la primera y segunda fila, por lo que estaria en el espacio y rozando con los ladrillos de los lados pero sin atravesarlos.

El tema de las colisiones es facil si se aplica la geometria en el, solo debes conocer la posicion de lo que va a colisionar, contra que va a colisionar y segun la distancia entre ambas coordenadas decidir si estan en contacto y han colisionado o no. En la web de losersjuegos tienes bastante informacion sobre colisiones, hay unos buenos manuales y tutoriales que puedes descargar en PDF.

Si estas empezando, lo que te han comentado de colision pixel a pixel mejor dejalo para despues, aunque no es muy aconsejable, en un ejemplo pequeño y sencillo va bien pero en un juego mas complejo podria suponer demasiado tiempo y ralentizar el juego, no es algo de lo ke abusar. Lo que yo considero mejor es usar figuras geometricas y mucha matematicas para las colisiones, por ejemplo, con vectores y puntos se pueden representar rectas y planos y se puede calcular y se cortan en algun punto, si dos planos se cortan en una recta, si dos rectas son secantes, si dos planos se cortan formando un angulo recto o si son paralelos, si un punto pertenece a un plano, si dos planos estan tocandose completamente por que uno contenga al otro....... eso si, para este tema que te acabo de comentar ahora mismo como ultimo detalle (el de rectas y planos) hace falta saber trabajar con matrices y vectores en matematicas y puede ser una teoria algo larga de leer pero merece la pena para als colisiones.
Esta cuenta ahora a pasado a la cuenta jhg
Avatar de Usuario
lacabra25
 
Mensajes: 222
Registrado: Mié Abr 02, 2008 9:45 pm
Ubicación: Tenerife (España)

Notapor xulubkisin » Mar Jun 23, 2009 2:43 pm

lacabra25 escribió:Primero, si ya tenias abierto un tema para este problema no veo la nacesidad de ke vuelvas a abrir otro tema para lo mismo, en una parte porque ahora toda la informacion esta separada en dos temas (y no es nada gracioso tener que estar de un tema a otro para ver de ke va la cosa) y por otra parte por ser una forma poco eficiente de aprovechar la capacidad comunicativa de un foro ya que haces a la gente perder el tiempo en mirar mas temas cuando tratan de lo mismo, ademas de uqe dificultas que te puedan responder pues no es comodo como ya he mencionado tener que saltar de un tema a otro tratando de lo mismo
.

bueno, pues les pido disculpas por lo de este otro tema, si alguien lo puede borrar de aca, que me haga el favor y dejamos el otro, si algo, pongo el laberinto alla. gracias "lacabra25"
xulubkisin
 
Mensajes: 8
Registrado: Vie Jun 19, 2009 3:46 pm


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