No se me ve un objecto en pantalla!!!

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

No se me ve un objecto en pantalla!!!

Notapor dario279 » Lun Feb 02, 2009 6:53 pm

Wenas, estaba acabado un pekeño pintball y he acabado las dos clases, la pelota y la porteria. Cuando le doy a ejecutar se me ejecuta bien pero la porteria no se me ve :S. Estoy buscando q se actualice y todo y no lo encuentro :S.


Donde puede estar el error?




import pygame
from pygame.locals import *
from math import *
from pygame.sprite import Sprite

width = 1024
height = 786

class Bola(Sprite):

def __init__(self, x, y, radio, color=(0, 255, 0)):
Sprite.__init__(self)
self.x, self.y = x, y
self.radio = radio
self.crear_imagen(radio, color)
self.rect = self.image.get_rect(self.image)
self.empujar(0, 0)

def crear_imagen(self, radio, color):
ancho = alto = radio * 2
self.image = pygame.Surface((ancho, alto)).convert()
self.image.set_colorkey((0, 0, 0))
pygame.draw.circle(self.image, color, (radio, radio), radio)

def update(self):
self.x += self.dx
self.y += self.dy
self.rect.center = (self.x, self.y)
self.verificar_limites()

def verificar_limites(self):

if self.rect.top < 0:
self.rect.top = 0
self.y = self.radio
self.dy *= -1.05
elif self.rect.bottom > height:
self.rect.bottom = height
self.y = height - self.radio
self.dy *= -1.05

def empujar(self, dx, dy):
self.dx = dx
self.dy = dy


class Porteria(Sprite):


def __init__(self, x, y, ancho, alto, color=(255, 0, 255)):
Sprite.__init__(self)
self.x, self.y = x, y
self.d = ancho
self.h = alto
self.crear_imagen(x, y, ancho, alto, color)
self.rect = self.image.get_rect(self.image)
self.empujar(0, 0)

def crear_imagen(self, x, y, ancho, alto, color):
ancho2 = ancho * 2
alto2 = alto * 2
self.image = pygame.Surface((ancho, alto)).convert()
self.image.set_colorkey((0, 0, 0))
pygame.draw.rect(self.image, color, (x, y, ancho, alto))

def update(self):
self.y = self.mover_y
self.rect.center = (self.y)
self.verificar_limites()

def verificar_limites():

if self.rect.top < 0:
self.rect.top = 0
self.y = self.h
self.mover_y *= -1
elif self.rect.bottom > height:
self.rect.bottom = heigh
self.y = height - self.h
self.mover_y *=-1
def mover_y():
teclas = pygame.key.get_pressed()
if teclas[K_UP]:
self.y -= 50

elif teclas[K_DOWN]:
self.y += 50

def empujar(self, dx, dy):
self.mover_y = dy



def actualizar_pantalla(screen, bolas, porterias):
screen.fill((0, 0, 0))
bolas.draw(screen)
porterias.draw(screen)
pygame.display.flip()

def main():
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("Pinbola")
bolas = pygame.sprite.Group()
porterias = pygame.sprite.Group()

b1 = Bola(x=400, y=100, radio=10)
b1.empujar(-1.5, 0.4)

p1 = Porteria(x=100, y=30, ancho=10, alto=30)


bolas.add([b1])
porterias.add([p1])
clock = pygame.time.Clock()

while True:

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

clock.tick(300)
actualizar_pantalla(screen, bolas, porterias)
bolas.update()
porterias.update


if __name__ == '__main__':
main()




Gracias!!!
dario279
 
Mensajes: 23
Registrado: Lun Dic 15, 2008 11:18 pm
Ubicación: Barberà del Valles

Notapor hugoruscitti » Lun Feb 02, 2009 11:38 pm

No estoy muy seguro, pero en una de las
últimas lineas dice "porterias.update", como si se
llamara a un método pero no están los signos "()" al
final de la misma. Seguramente se te ha olvidado
eso...
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor dario279 » Mar Feb 03, 2009 10:31 pm

Cierto, se me habia pasado.

Pero al ponerlo y retocar otro error q me daba, se me ejecuta y me sigue sin salir el palito. :cry:


Puede ser que a la hora de crear la imagen:

pygame.draw.rect(self.image, color, (x, y, ancho, alto))

Haya algun fallo?
dario279
 
Mensajes: 23
Registrado: Lun Dic 15, 2008 11:18 pm
Ubicación: Barberà del Valles

Notapor dario279 » Mar Feb 03, 2009 10:49 pm

Ya esta, problema solucionado, un pekeño detalle de la escritura!!!
dario279
 
Mensajes: 23
Registrado: Lun Dic 15, 2008 11:18 pm
Ubicación: Barberà del Valles

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

dario279 escribió:Cierto, se me habia pasado.

Pero al ponerlo y retocar otro error q me daba, se me ejecuta y me sigue sin salir el palito. :cry:


Puede ser que a la hora de crear la imagen:

pygame.draw.rect(self.image, color, (x, y, ancho, alto))

Haya algun fallo?

Tus sospechas son correctas. Piensa que el 'rect' que se le pasa representa el rectángulo que se dibujará en la superficie. Por lo tanto, el rect tiene que comenzar desde el inicio de la imagen hasta el final <rect(0, 0, ancho, alto)>.
Aunque resulta más sencillo hacer:
Código: Seleccionar todo
self.image.fill(color)


Yo me las he apañado para conseguir tu código indentado. Pero ten en cuenta que, para que la gente te pueda contestar mejor, tendrías que poner tu código entre etiquetas 'code'.

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

Notapor dario279 » Mar Feb 03, 2009 11:59 pm

Lo de las etiquetas code? Me has dejado perdido? Como lo ago?

Y otra cosilla, ahora se me ve la imagen, pero el problema q me pone es

in update
self.rect.center = (self.x, self.y)
TypeError: invalid rect assignment

Nose q le pasa, pero weno, mi gran problema q creo q debe ser el causante de todo es a la hora de crear movimiento al "palito", lo ice cn un programa pero sin funciones, y claro, esta es mi primera clase, y perdido q estoy. jeje.

Puede q haya algun fallo gordo, nose :S. Haber q me podeis decir

Mersi!!!
dario279
 
Mensajes: 23
Registrado: Lun Dic 15, 2008 11:18 pm
Ubicación: Barberà del Valles

Notapor endaramiz » Mié Feb 04, 2009 3:02 pm

dario279 escribió:Lo de las etiquetas code? Me has dejado perdido? Como lo ago?

A la hora de editar el mensaje, tienes que poner el código que quieras entre [code ] y [/code ] (sin espacios). O seleccionando el código y pulsando en el botón Code que hay debajo del asunto del mensaje.

dario279 escribió:Y otra cosilla, ahora se me ve la imagen, pero el problema q me pone es

in update
self.rect.center = (self.x, self.y)
TypeError: invalid rect assignment

Nose q le pasa, pero weno, mi gran problema q creo q debe ser el causante de todo es a la hora de crear movimiento al "palito", lo ice cn un programa pero sin funciones, y claro, esta es mi primera clase, y perdido q estoy. jeje.

Puede q haya algun fallo gordo, nose :S. Haber q me podeis decir

Mersi!!!

Yo encontré un error en tú código porque ponía:
Código: Seleccionar todo
self.rect.center = (self.y)
Y tendría que ser:
Código: Seleccionar todo
self.rect.center = (self.x, self.y)

A simple vista, el código ese es correcto. Pero como tú dices, puede haber un fallo gordo, que venga de antes (como que la x no sea un entero).
Para intentar descubrir el error, sería mejor que volvieses a colgar el código entero.

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

Notapor dario279 » Mié Feb 04, 2009 5:16 pm

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

width = 250
height = 250

class Bola(Sprite):

    def __init__(self, x, y, radio, color=(0, 255, 0)):
        Sprite.__init__(self)
        self.x, self.y = x, y
        self.radio = radio
        self.crear_imagen(radio, color)
        self.rect = self.image.get_rect(self.image)
        self.empujar(0, 0)

    def crear_imagen(self, radio, color):
        ancho = alto = radio * 2
        self.image = pygame.Surface((ancho, alto)).convert()
        self.image.set_colorkey((0, 0, 0))
        pygame.draw.circle(self.image, color, (radio, radio), radio)

    def update(self):
        self.x += self.dx
        self.y += self.dy
        self.rect.center = (self.x, self.y)
        self.verificar_limites()

    def verificar_limites(self):
        if self.rect.left < 0:
            self.rect.left = 0
            self.x = self.radio
            self.dx *= -1.01
        elif self.rect.right > width:
            self.rect.right = width
            self.x = width - self.radio
            self.dx *= -1.01
        if self.rect.top < 0:
            self.rect.top = 0
            self.y = self.radio
            self.dy *= -1.05
        elif self.rect.bottom > height:
            self.rect.bottom = height
            self.y = height - self.radio
            self.dy *= -1.05

    def empujar(self, dx, dy):
        self.dx = dx
        self.dy = dy


class Porteria(Sprite):

   def __init__(self, x, y, ancho, alto, color=(255, 0, 255)):
      Sprite.__init__(self)
      self.x, self.y = x, y
      self.d = ancho
      self.h = alto
      self.crear_imagen(x, y, ancho, alto, color)
      self.rect = self.image.get_rect(self.image)
      self.empujar(0, 0)

      
   def crear_imagen(self, x, y, ancho, alto, color):
      ancho2 = ancho * 2
      alto2 = alto * 2
      self.image = pygame.Surface((ancho, alto)).convert()
      self.image.set_colorkey((250, 0, 0))
      pygame.draw.rect(self.image, color, (x, y, ancho, alto))
      
   def update(self):
      self.y = self.mover_y()
      self.rect.center = (self.x, self.y)
      self.verificar_limites()

      
   def verificar_limites(self):
      if self.rect.top < 0:
         self.rect.top = 0
         self.y = self.h
         self.mover_y *= -1
      elif self.rect.bottom > height:
         self.rect.bottom = heigh
         self.y = height - self.h
         self.mover_y *=-1
         
   def mover_y(self):
      teclas = pygame.key.get_pressed()
      if teclas[K_UP]:
         self.y -= dy
     
      elif teclas[K_DOWN]:
         self.y += dy
   
   def empujar(self, dx, dy):
      self.dy = dy
      


def actualizar_pantalla(screen, bolas, porterias):
   screen.fill((0, 0, 0))
   bolas.draw(screen)
   porterias.draw(screen)
   pygame.display.flip()

def main():
   screen = pygame.display.set_mode((width, height))
   pygame.display.set_caption("Pinbola")
   bolas = pygame.sprite.Group()
   porterias = pygame.sprite.Group()

   b1 = Bola(x=400, y=100, radio=10)
   b1.empujar(-1.5, 0.4)

   p1 = Porteria(x=100, y=30, ancho=10, alto=30)
   

   bolas.add([b1])
   porterias.add([p1])
   clock = pygame.time.Clock()

   while True:
         
      for e in pygame.event.get():
         if e.type == QUIT:
            return
           
      clock.tick(300)
      actualizar_pantalla(screen, bolas, porterias)
      bolas.update()
      porterias.update()


if __name__ == '__main__':
    main()


Vale. Ahora echale un vistazo aver, asi es como me sale el error de ayer. El ultimo de invalid rect assigment. Igualmente esta bien la forma que he hecho pra mover el "palito"? O me tendria q hacer falta alguna variable global?

Es la parte final de mi treball de recerca, jeje, si eres de barcelona sabras lo q te digo. jeje

Mersi de nuevo!!!
dario279
 
Mensajes: 23
Registrado: Lun Dic 15, 2008 11:18 pm
Ubicación: Barberà del Valles

Notapor endaramiz » Jue Feb 05, 2009 11:51 am

dario279 escribió:Vale. Ahora echale un vistazo aver, asi es como me sale el error de ayer. El ultimo de invalid rect assigment.

Como me temía, el error venía de antes. Me dí cuenta al hacer un print de self.x y self.y antes de la línea donde petaba el programa. La 'y' valía None porque se le da el valor de una función que no retorna nada:
Código: Seleccionar todo
self.y = self.mover_y()
Y tendría que ser:
Código: Seleccionar todo
self.mover_y()


Igualmente esta bien la forma que he hecho pra mover el "palito"? O me tendria q hacer falta alguna variable global?

Siempre es mejor que no utilices ninguna variable global (exceptuando las constantes que has declarado 'width' y 'height').
Respecto de si es la mejor manera... Pues la verdad es que yo me he liado un poco con las variables 'y', 'x'... de tu código. Creo que se podrían eliminar y trabajar directamente sobre el rectángulo.
Yo lo haría así:
Código: Seleccionar todo
class Porteria(Sprite):

   def __init__(self, x, y, ancho, alto, dy, color=(255, 0, 255)):
      Sprite.__init__(self)
      self.x, self.y = x, y
      self.image = self.crear_imagen(ancho, alto, color)
      self.rect = self.image.get_rect(self.image)
      self.rect.center = (x, y)
      self.dy = dy
     
   def crear_imagen(self, ancho, alto, color):
      image = pygame.Surface((ancho, alto)).convert()
      image.fill(color)
      return image
     
   def update(self):
      self.mover_y()
      self.verificar_limites()
     
   def verificar_limites(self):
      if self.rect.top < 0:
         self.rect.top = 0
      elif self.rect.bottom > height:
         self.rect.bottom = height
         
   def mover_y(self):
      teclas = pygame.key.get_pressed()
      if teclas[K_UP]:
         self.rect.y -= self.dy
      elif teclas[K_DOWN]:
         self.rect.y += self.dy

Fíjate que ahora, al crear las porterías, le tendrías que pasar dy.

Es la parte final de mi treball de recerca, jeje, si eres de barcelona sabras lo q te digo. jeje
Jeje... sí, demasiado bien me lo conozco... Para quien no lo sepa, es un trabajo de investigación. Como un trabajo de final de carrera pero que se hace antes de acceder a la universidad.
¿Cuanto te falta para entregarlo? Es que, corrigiendo tu código, un error me llevaba a otro. Y, en ocasiones, no sabía muy bien lo que querías hacer. Si te ves apurado de tiempo, podríamos quedar en la sala de LosersJuegos (preferiblemente) o por el msn. Aunque con la condición de que luego se publique el código corregido. Así más gente podrá aprender. Si eso, envía mensaje privado.

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

Notapor dario279 » Jue Feb 05, 2009 3:16 pm

Lo pongo aki q x mp se me reiniciaba la conexion cada vez q lo enviaba.

Muchas gracias x todo.

Mira te comento, el juego lo tengo q entregar el dia 24 de este mes.

Se basa en un simple pintball como los de toda la vida. Tengo un menu ya hecho y lo unico q me keda es eso, como has podido comprobar cn la pelota no hay ningun problema, pero los palos si. Y estoy deskifiado xq claro, nose a kien acudir.

Si me puedes ayudar como me has dicho me vendria perfecto. Lo q la sala de loserjuegos nose si es un espacio fisico o virtual xD. Llevo poco tiempo en este mundo.

Y lo de colgar el codigo correjido, no hay ningn problema, ya que mi ilusion era acabar colgando mi jueguecito cuando lo tuviera acabado.

Gracias!!!
dario279
 
Mensajes: 23
Registrado: Lun Dic 15, 2008 11:18 pm
Ubicación: Barberà del Valles


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

cron