Escritura en pantalla (pygame)

Solicite, consulte o publique recursos de referencia para desarrolladores.

Escritura en pantalla (pygame)

Notapor endaramiz » Mié Jul 16, 2008 10:03 am

Este ejemplo tiene la función de escribir en pantalla lo que se pulsa en teclado. Algunas techas son excepciones ya que están asignadas a una función: Enter inserta un salto de línea, Retroceso borra el último carácter y Escape cierra el programa.
(*1) En el ejemplo se utiliza la fuente dejavu.ttf que se puede obtener del artículo sobre el menú de esta misma web. Aunque el tipo de fuente es lo de menos.

El código está bajo la licencia GNU GPL v3 siendo yo el autor.
Código: Seleccionar todo
import sys

import pygame
from pygame import *


class Escritura():
    def __init__(self):
        self.line = 0
        self.strings = ['',]
        #self.font = pygame.font.Font('dejavu.ttf', 12) #(*1)
        self.font = pygame.font.Font(None, 28)
       
        self.dist = 20
        self.ipos_x = 50
        self.ipos_y = 50
       
    def update(self, events):
        for event in events:
            if event.type == KEYDOWN:
                if event.key == K_RETURN:
                    self.strings.append('')
                    self.line += 1
                elif event.key == K_ESCAPE:
                    sys.exit()
                elif event.key == K_BACKSPACE:
                    if self.strings[self.line] == '' and self.line > 0:
                        self.strings = self.strings[0:-1]
                        self.line -= 1
                    else:
                        self.strings[self.line] = self.strings[self.line][0:-1]
                else:
                    self.strings[self.line] = str(self.strings[self.line] + event.unicode)
                   
    def draw(self, screen):
        print self.strings
        screen.fill((0, 0, 0))
        for line in range(len(self.strings)):
            img_line = self.font.render(self.strings[line], 1, (255, 255, 255))
            screen.blit(img_line, (self.ipos_x, self.ipos_y + self.dist * line))
           
def main():
    pygame.init()
    screen = pygame.display.set_mode((600, 600))
    salir = False
    escritura = Escritura()
    while salir == False:
        events = pygame.event.get()
        for event in events:
            if event.type == QUIT:
                salir = True
        escritura.update(events)
        escritura.draw(screen)
        display.update()

if __name__ == '__main__': main()


Como siempre: acepto críticas y/o comentarios.
Saludos.

Edit:
(*1) Ver siguiente mensaje de hugoruscitti
Última edición por endaramiz el Mié Jul 16, 2008 11:02 pm, editado 1 vez en total
Avatar de Usuario
endaramiz
 
Mensajes: 283
Registrado: Vie Ago 31, 2007 9:25 am
Ubicación: Barcelona

Notapor hugoruscitti » Mié Jul 16, 2008 4:22 pm

Me gusta, está muy interesante.

Y como sugerencia, tal vez sea mas sencillo de probar si colocas
"pygame.font.Font(None, 32)" en la inicialización de la tipografía,
dado que usando "None" como primer parámetro pygame usa
una fuente predeterminada y eso no requiere de un archivo
.ttf en particular.

Saludos.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor endaramiz » Mié Jul 16, 2008 11:19 pm

Gracias Hugo por tu consejo, la verdad es que es un engorro tener que ir a descargarte una fuente para probar un ejemplo. Si lo hice de esa manera, es por desconocimiento de lo de la fuente predeterminada. En realidad, ahora me suena, pero no me acordaba (Tendría que repasarme un poco la documentación, al menos la parte de font que la tengo bastante descuidada).

No me gusta editar los mensajes, pero, en esta ocasión, creo que es la mejor opción, por ser el cambio muy pequeño (una sola linea). Igualmente, la linea anterior no la borro, solo la comento.

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

Notapor ingemar » Jue Jul 17, 2008 4:08 am

muchas gracias DVD ese ejemplo esta super fino sera que me lo puedes explicar linea por linea o decirme un enlace de donde yo pueda saber como hiciste todo eso que significa y todo...

en resumen saber hacer todo ese codigo yo solo sabien lo que hago como hago que lee para poder aprender hacer eso

GRACIAS POR TU AYUDA
Quiero ser experto en Python
_______________________________
programando juegos
ingemar
 
Mensajes: 28
Registrado: Mié Abr 02, 2008 1:30 am
Ubicación: venezuela

Notapor shackra » Sab Nov 14, 2009 8:34 pm

que coincidencia, yo estaba (o estoy actualmente) desarrollando algunas funciones para imprimier caracteres en la pantalla usando pygame para una Engine en la que estoy trabajando. para hacer WarHacks :p (o un juego de guerra de hackers) llamado Le Chocolat
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica

Notapor endaramiz » Lun Nov 16, 2009 10:19 am

Que curioso, no sabía que existía ese tipo de juegos.
Si tienes alguna duda con el código, no dudes en preguntar. Aunque ahora me he puesto a mirarlo un poco y he notado que tengo algo olvidado python. Pero bueno, a lo mejor hay alguien que lo tiene más fresco y te puede ayudar.

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

Re: Escritura en pantalla (pygame)

Notapor nico.decara » Mié Jul 11, 2012 10:21 pm

Hola, me resulto muy util el codigo, pero tengo un problema, no puedo hacer que lo que se escriba, aparezca arriba de una imagen, las letras las carga en la lista, pero no las muestra en pantalla. Aca abajo les dejo el codigo a ver si me pueden ayudar.
Gracias y saludos!

import pygame, sys
from pygame.locals import *

class Escritura():
def __init__(self):
self.line = 0
self.strings = ['',]
self.font = pygame.font.Font(None, 28)
self.dist = 20
self.ipos_x = 300
self.ipos_y = 300

def update(self, events):
for event in events:
if event.type == KEYDOWN:
if event.key == K_RETURN:
self.strings.append('')
self.line += 1
elif event.key == K_ESCAPE:
sys.exit()
else:
self.strings[self.line] = str(self.strings[self.line] + event.unicode)

def draw(self, screen):
print self.strings
screen.fill((0, 0, 0))
for line in range(len(self.strings)):
img_line = self.font.render(self.strings[line], 1, (255, 255, 255))
screen.blit(img_line, (self.ipos_x, self.ipos_y + self.dist * line))

def main():
pygame.init()
screen = pygame.display.set_mode((700, 600))
imagen=pygame.image.load("previa.png")
screen.blit(imagen,(0,0))
pantallaBase= screen.copy()
salir = False
escritura = Escritura()
while salir == False:
events = pygame.event.get()
for event in events:
if event.type == QUIT:
salir = True
escritura.update(events)
escritura.draw(screen)
screen.blit(pantallaBase,(0,0))
pygame.display.update()
if __name__ == '__main__':
main()
nico.decara
 
Mensajes: 6
Registrado: Mar Jun 19, 2012 10:56 pm

Re: Escritura en pantalla (pygame)

Notapor Barajas » Jue Jul 12, 2012 1:25 pm

nico.decara escribió:Hola, me resulto muy util el codigo, pero tengo un problema, no puedo hacer que lo que se escriba


Bueno, en tu código veo esto:

escritura.update(events)
escritura.draw(screen)
screen.blit(pantallaBase,(0,0))


Resumiendo, lo que haces es:

Actualizo los eventos de escritura....
Dibujo la escritura
Dibujo la pantalla sobre todo lo demás

Solo hay que cambiar el orden y ya esta :D
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: Escritura en pantalla (pygame)

Notapor nico.decara » Vie Jul 13, 2012 7:56 pm

Barajas escribió:
nico.decara escribió:Hola, me resulto muy util el codigo, pero tengo un problema, no puedo hacer que lo que se escriba


Bueno, en tu código veo esto:

escritura.update(events)
escritura.draw(screen)
screen.blit(pantallaBase,(0,0))


Resumiendo, lo que haces es:

Actualizo los eventos de escritura....
Dibujo la escritura
Dibujo la pantalla sobre todo lo demás

Solo hay que cambiar el orden y ya esta :D


Hola Barajas, hice lo que me dijiste, pero si cambio el orden, me aparece la pantalla negra con lo que escribo. la imagen de fondo nunca aparece :S
nico.decara
 
Mensajes: 6
Registrado: Mar Jun 19, 2012 10:56 pm

Re: Escritura en pantalla (pygame)

Notapor Barajas » Sab Jul 14, 2012 12:38 am

nico.decara escribió:Hola Barajas, hice lo que me dijiste, pero si cambio el orden, me aparece la pantalla negra con lo que escribo. la imagen de fondo nunca aparece :S


Eso es por que en el método draw tienes:

def draw(self, screen):
print self.strings
screen.fill((0, 0, 0)) #<<<<<< Llena la pantalla de negro....
for line in range(len(self.strings)):
img_line = self.font.render(self.strings[line], 1, (255, 255, 255))
screen.blit(img_line, (self.ipos_x, self.ipos_y + self.dist * line))


Y en el orden en el que ocurren seria algo así

Código: Seleccionar todo
Dibujamos imagen al fondo
Dibujamos Texto con draw
    draw nos dice que primero llenemos el fondo de negro, y después dibujemos el texto



Para arreglarlo, solo borra la linea en draw que dibuja en negro, :D. No me había fijado en ese detalle; detalles que a uno se le escapan :roll: .
Un consejo, para prevenir estos errores es revisa el flujo en el que suceden las cosas en tus programas :)
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: Escritura en pantalla (pygame)

Notapor nico.decara » Dom Jul 15, 2012 5:19 am

Barajas escribió:
nico.decara escribió:Hola Barajas, hice lo que me dijiste, pero si cambio el orden, me aparece la pantalla negra con lo que escribo. la imagen de fondo nunca aparece :S


Eso es por que en el método draw tienes:

def draw(self, screen):
print self.strings
screen.fill((0, 0, 0)) #<<<<<< Llena la pantalla de negro....
for line in range(len(self.strings)):
img_line = self.font.render(self.strings[line], 1, (255, 255, 255))
screen.blit(img_line, (self.ipos_x, self.ipos_y + self.dist * line))


Y en el orden en el que ocurren seria algo así

Código: Seleccionar todo
Dibujamos imagen al fondo
Dibujamos Texto con draw
    draw nos dice que primero llenemos el fondo de negro, y después dibujemos el texto



Para arreglarlo, solo borra la linea en draw que dibuja en negro, :D. No me había fijado en ese detalle; detalles que a uno se le escapan :roll: .
Un consejo, para prevenir estos errores es revisa el flujo en el que suceden las cosas en tus programas :)


MUCHAS GRACIAS!
nico.decara
 
Mensajes: 6
Registrado: Mar Jun 19, 2012 10:56 pm

Re: Escritura en pantalla (pygame)

Notapor shackra » Vie Ago 03, 2012 12:02 am

que coincidencia, yo estaba (o estoy actualmente) desarrollando algunas funciones para imprimier caracteres en la pantalla usando pygame para una Engine en la que estoy trabajando. para hacer WarHacks :p (o un juego de guerra de hackers) llamado Le Chocolat


Nunca terminé el motor xd.
Pero ahora que tengo más experiencia, puede que retome el proyecto desde 0 :)
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica


Volver a Artículos, traducciones y documentación

¿Quién está conectado?

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