posición de objetos pygame

Tratamos sobre el manejo de APIs frecuentemente utilizadas en el desarrollo de videojuegos, como SDL, pygame o SFML.

posición de objetos pygame

Notapor IrvingProg » Vie May 13, 2011 1:22 am

Hola.

Estoy desarrollando un juego con el material de la pagina y pilas, el mono, la banana y la bomba :), El juego es sencillo. Lo que busco ahora es generar aleatoria mente la posición de X cantidad de bananas, pero no logro hacerlo:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

#Modulos
import pygame
from pygame.locals import*
import sys

#Constantes
WIDHT = 640
HEIGHT = 480

#variables

#Clases
class Mono(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("/home/irving/Desktop/mbpy/mono1.png")
self.rect = self.image.get_rect()
self.rect.x = 5
self.rect.y = 360
def mover(self,time,tecla):
if tecla[pygame.K_LEFT]:
self.rect.x -=10
if self.rect.x <=0:
self.rect.x = 0
if tecla[pygame.K_RIGHT]:
self.rect.x +=10
if self.rect.x >= 483:
self.rect.x = 483

class Banana(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("/home/irving/Desktop/mbpy/banana.png")
self.rect = self.image.get_rect()
self.rect.x = 1
self.rect.y = 0

#Funciones

def main():
screen =pygame.display.set_mode((WIDHT,HEIGHT))
pygame.display.set_caption("Monkey Banana")
fondo = pygame.image.load("/home/irving/Desktop/mbpy/fondo.png")
mono = Mono()
banana = Banana()
clock = pygame.time.Clock()
while True:
time = clock.tick(60)
tecla = pygame.key.get_pressed()
for eventos in pygame.event.get():
if eventos.type == QUIT:
sys.exit(0)
screen.blit(fondo,(0,0))
screen.blit(mono.image,mono.rect)
for i in range(20):
screen.blit(banana.image,(banana.rect.x*i+2*20,banana.rect.y))
mono.mover(time,tecla)
#if tecla[pygame.K_LEFT]:
# xmono -= 10
pygame.display.flip()
return 0

if __name__ == '__main__':
pygame.init()
main()

Quiero que las bananas aparezcan en diferentes lugares de la pantalla para que no salgan todas en una misma posición, pero aun no se bien como va esto :), si me pueden orientar estaría muy agradecido.
Avatar de Usuario
IrvingProg
 
Mensajes: 24
Registrado: Vie Ene 07, 2011 7:36 pm
Ubicación: México

Re: posición de objetos pygame

Notapor hugoruscitti » Vie May 13, 2011 2:01 am

Buenas, hay un modulo de python llamado random que te
permite calcular numeros elatorios.

Por ejemplo, si quiero un numero entre 0 y 600
puedo escribir:


>>> import random
>>> random.randint(0, 600)
477



Creo que en tu codigo, el retorno de esa funcion
se las prodrias asignar a "self.rect.x", en el metodo __init__
de la clase Banana.

Avisanos si te sirve...

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

Re: posición de objetos pygame

Notapor IrvingProg » Vie May 13, 2011 2:40 am

hugoruscitti escribió:Buenas, hay un modulo de python llamado random que te
permite calcular numeros elatorios.

Por ejemplo, si quiero un numero entre 0 y 600
puedo escribir:


>>> import random
>>> random.randint(0, 600)
477



Creo que en tu codigo, el retorno de esa funcion
se las prodrias asignar a "self.rect.x", en el metodo __init__
de la clase Banana.

Avisanos si te sirve...

Saludos.


Gracias me sirvió.

Ya conocía ese modulo, incluso lo empece a utilizar después de hacer la pregunta, solo que dentro del bucle y lo que hacia era generar una posición aleatoria a cada pasada del bucle. Ya poniéndolo donde me has dicho funciona perfecto, aun no como quiero pero funciona :D

Básicamente lo que quiero lograr es que las bananas se generen de forma aleatoria en X y en Y fuera de la pantalla para que después caigan poco a poco y el mono las pueda tomar. Tipo esos juegos de atrapar cosas. Mira dejo un vídeo:

Avatar de Usuario
IrvingProg
 
Mensajes: 24
Registrado: Vie Ene 07, 2011 7:36 pm
Ubicación: México

Re: posición de objetos pygame

Notapor hugoruscitti » Vie May 13, 2011 3:32 pm

um... no pudé ver el video, porque creo que ya no
está disponible.

Igualmente, creo que te entendí, si quieres que las bananas "caigan" desde
la parte superior de la ventana, podrías asignarle una posición inicial, fuera
de la pantalla y luego ir haciendola bajar poco a poco:

import random

class Banana(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("/home/irving/Desktop/mbpy/banana.png")
self.rect = self.image.get_rect()
self.rect.x = random.randint(0, 640)
self.rect.y = -50

def update(self):
self.rect.y += 1


y en el bucle while tienes que llamar regularmente:

banana.update()


Ten en cuenta que si quieres que caigan muchas bananas, lo mas indicado
es ir creando una banana por vez, por ejemplo cada 3 segundos. pygame tiene
algo llamado grupos que te puede ser de utilidad para hacer eso.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Re: posición de objetos pygame

Notapor IrvingProg » Vie May 13, 2011 3:53 pm

Raro lo del vídeo, no lo he borrado, supongo que fue un error de enlace. Lo dejo aquí:



Y ya he hecho algunos cambios, donde hago que funcione mejor el efecto, me falta agregar algo de sprites y colisiones, que ya estoy estudiando, haber si las implemento en un rato mas. Ahora mismo me pasa algo que si cualquier banana pasa de la pantalla todas las del "grupo" empiezan a desaparecer. Te dejo el código, y al ultimo el vídeo de como va.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

#Modulos
import pygame
from pygame.locals import*
import sys
import random

#Constantes
WIDHT = 640
HEIGHT = 480

#variables

#Clases
class Mono(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("/home/irving/Desktop/mbpy/mono_normal.png")
self.rect = self.image.get_rect()
self.rect.x = 5
self.rect.y = 360
def mover(self,time,tecla):
"""movimiento del personaje"""
if tecla[pygame.K_LEFT]:
self.rect.x -=10
if self.rect.x <=0:
self.rect.x = 0
if tecla[pygame.K_RIGHT]:
self.rect.x +=10
if self.rect.x >= 483:
self.rect.x = 483

class Banana(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("/home/irving/Desktop/mbpy/banana.png")
self.rect = self.image.get_rect()
self.rect.x = random.randint(0,600)
self.rect.y = random.randint(0,100)
def mover(self):
self.rect.y += 4

class Bomba(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("/home/irving/Desktop/mbpy/bomba1.png")
self.rect = self.image.get_rect()
self.rect.x = random.randint(0,550)
self.rect.y = random.randint(0,120)
def mover(self):
self.rect.y += 3

#Funciones

def main():
screen =pygame.display.set_mode((WIDHT,HEIGHT))
pygame.display.set_caption("Monkey Banana")
fondo = pygame.image.load("/home/irving/Desktop/mbpy/fondo.png")
mono = Mono()
bananas=[Banana(),Banana(),Banana(),Banana(),Banana(),Banana()]
bombas=[Bomba(),Bomba(),Bomba(),Bomba()]
clock = pygame.time.Clock()
while True:
time = clock.tick(60)
tecla = pygame.key.get_pressed()
for eventos in pygame.event.get():
if eventos.type == QUIT:
sys.exit(0)
screen.blit(fondo,(0,0))
screen.blit(mono.image,mono.rect)
mono.mover(time,tecla)
for i in range(6):
screen.blit(bananas[i].image,(bananas[i].rect.x,bananas[i].rect.y-110*i))
bananas[i].mover()
if bananas[i].rect.y >= 480:
bananas[i].rect.y = 40*i-random.randint(20,40)
bananas[i].rect.x = random.randint(0,600)
for i in range(4):
screen.blit(bombas[i].image,(bombas[i].rect.x,bombas[i].rect.y-120*i-50))
bombas[i].mover()
if bombas[i].rect.y >= 480:
bombas[i].rect.y = 40*i-random.randint(20,40)
bombas[i].rect.x = random.randint(0,600)
pygame.display.flip()
return 0

if __name__ == '__main__':
pygame.init()
main()


Avatar de Usuario
IrvingProg
 
Mensajes: 24
Registrado: Vie Ene 07, 2011 7:36 pm
Ubicación: México

Re: posición de objetos pygame

Notapor IrvingProg » Sab May 14, 2011 4:38 pm

Hola.

Escribo para agregar que sigo trabajando en el juego, le agregue un contador de puntos y también colisiones entre bananas y el mono, solo que no logro hacer el efecto de las bananas vuelvan a una posición definida de la pantalla, así como cuando pasan el limite, ahora mismo sólo me doy cuenta que hay colisión debido a que aumentan los puntos. Dejo mi código por si me pueden echar un cable con lo de las colisiones y también de las imágenes, me gustaría que el mono cambie de cara cuando toma la banana.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

#Modulos
import pygame
from pygame.locals import*
import sys
import random

#Constantes
WIDHT = 640
HEIGHT = 480

#Clases
class Mono(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("/home/irving/Desktop/mbpy/mono_normal.png")
self.rect = self.image.get_rect()
self.rect.x = 5
self.rect.y = 390
def mover(self,time,tecla):
"""movimiento del personaje"""
if tecla[pygame.K_LEFT]:
self.rect.x -=10
if self.rect.x <=0:
self.rect.x = 0
if tecla[pygame.K_RIGHT]:
self.rect.x +=10
if self.rect.x >= 540:
self.rect.x = 540

class Banana(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("/home/irving/Desktop/mbpy/banana.png")
self.rect = self.image.get_rect()
self.rect.x = random.randint(0,600)
self.rect.y = random.randint(80,120)*-random.randint(1,6)
def mover(self):
self.rect.y += 4
#Si se sale de la pantalla localizamos el objeto en otra posición
if self.rect.y >=480:
self.rect.x = random.randint(0,600)
self.rect.y = -70*random.randint(1,6)-random.randint(20,50)

class Bomba(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("/home/irving/Desktop/mbpy/bomba.png")
self.rect = self.image.get_rect()
self.rect.x = random.randint(0,550)
self.rect.y = random.randint(80,120)*-random.randint(1,6)-50
def mover(self):
self.rect.y += 3
if self.rect.y >= 480:
#Si se sale de la pantalla localizamos el objeto en otra posición
self.rect.x = random.randint(0,550)
self.rect.y = random.randint(80,120)*-random.randint(1,6)-50

#Funciones
def score(fuente,screen,puntos):
blanco = (255,255,255)
puntos_img = fuente.render("Puntos " + str(puntos),1,blanco)
screen.blit(puntos_img,(490,10))

def main():
screen =pygame.display.set_mode((WIDHT,HEIGHT))
pygame.display.set_caption("Monkey Banana")
fondo = pygame.image.load("/home/irving/Desktop/mbpy/fondo.png")
#------------Actores-------------------------------------------
mono = Mono()
bananas=[Banana(),Banana(),Banana(),Banana(),Banana(),Banana()]
bombas=[Bomba(),Bomba(),Bomba(),Bomba()]
#------------Fin-----------------------------------------------
fuente = pygame.font.Font(None,40)
clock = pygame.time.Clock()
puntos = 0
sprites = pygame.sprite.RenderClear()
bananaz = pygame.sprite.RenderClear()
monop = pygame.sprite.RenderClear()
while True:
time = clock.tick(60)
tecla = pygame.key.get_pressed()
for eventos in pygame.event.get():
if eventos.type == QUIT:
sys.exit(0)
bananaz.add(bananas[:])
monop.add(mono)
for tomar in pygame.sprite.groupcollide(monop,bananaz,1,1):
puntos +=1
screen.blit(fondo,(0,0))
screen.blit(mono.image,mono.rect)
mono.mover(time,tecla)
screen.blit(bananas[0].image,bananas[0].rect)
screen.blit(bananas[0].image,bananas[1].rect)
screen.blit(bananas[0].image,bananas[2].rect)
screen.blit(bananas[0].image,bananas[3].rect)
screen.blit(bananas[0].image,bananas[4].rect)
screen.blit(bananas[0].image,bananas[5].rect)
bananas[0].mover()
bananas[1].mover()
bananas[2].mover()
bananas[3].mover()
bananas[4].mover()
bananas[5].mover()
screen.blit(bombas[0].image,bombas[0].rect)
screen.blit(bombas[0].image,bombas[1].rect)
screen.blit(bombas[0].image,bombas[2].rect)
screen.blit(bombas[0].image,bombas[3].rect)
bombas[0].mover()
bombas[1].mover()
bombas[2].mover()
bombas[3].mover()
score(fuente,screen,puntos)
pygame.display.flip()
return 0

if __name__ == '__main__':
pygame.init()
main()


Y un vídeo para que vean como va:

Avatar de Usuario
IrvingProg
 
Mensajes: 24
Registrado: Vie Ene 07, 2011 7:36 pm
Ubicación: México

Re: posición de objetos pygame

Notapor Alzacon » Sab May 14, 2011 4:56 pm

Un ejemplo que puede ayudarte, es basicamente lo que quieres pero solo con un elemento (bananas por ejemplo) pero que se desplazan horizontalmente
http://silveiraneto.net/2009/08/12/pyga ... ce-effect/
Y buscandolo he dado con otro identico con el desplazamiento vertical
http://codentronix.com/2011/04/24/simpl ... nd-pygame/

Tendrias que buscar repetir código para las bombas y bananas o crear una función dondé con parametros te evites "duplicar" código.

Otra cosilla, porque en lugar de escribir "Banana()" n veces y otras tantas la clase Bomba en sus respectivas variables: bananas y bombas, utilizas algo como
bananas=[]
for i in range(6):
bananas.append(Banana())

y si cambias el número por una variable, por ejemplo nBananas=6.

Por ejemplo algo asi creo que puede ser útil:
# Constantes y Variables
nBananas = 6 #Número de bananas
nBombas = 4 #Número de bombas
# ---
bananas = bombas =[]

# Funciones
def crear_N_i(lista,num,elemento):
''' Se añaden N vece el elemento a la lista , ya existente, indicada.'''
for i in range(num):
lista.append(elemento)

# Uso
crear_N_i(bananas,nBananas,Banana())
crear_N_i(bombas,nBombas,Bomba())


Son sugerencias, pero tú eres el único que sabe como te vas a aclarar y trabajar mejor
Alzacon
 
Mensajes: 19
Registrado: Jue Ene 27, 2011 8:35 pm


Volver a Sobre las bibliotecas multimedia

¿Quién está conectado?

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