Balas en pygame

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

Balas en pygame

Notapor birria4 » Vie Oct 07, 2011 2:39 am

hola soy medio nuevo en esto de pygame y pues me cuesta trabajo mover sprites de forma continua si puedo moverlos cuando digo si presiona tecla tal mover sprite el problema viene cuando quiero hacerlo de forma continua como por ejeplo disparar una bala que siga su trayectoria y no solo avance un espacio.
cuando muevo imagenes normales no hay problema, pero quiero hacer colisiones y para eso ocupo hacer sprites pero el sprite no se mueve como quiero alguien puede darme un ejemplo porfavor ya me cheque los tutoriales y manejan clases si entiendo un poco pero el unico codigo que he encontrado con las caracteristicas que quiero es el de space invaders de esta pagina pero el codigo es muy largo y me confunde y no entiendo alguien me podria porfavor poner un codigo de como mover sprites de forma continua al presionar una tecla
gracias
birria4
 
Mensajes: 6
Registrado: Vie Oct 07, 2011 2:32 am

Re: Balas en pygame

Notapor Barajas » Vie Oct 07, 2011 4:15 am

Bueno, es una pregunta interezante :).
creo que tu problema esta en el método "update()" de la bala :). Si se mueve, asumo que escribiste de forma que solo se moviera cuando se presione una tecla...
intenta remplazar la clase del sprite de la bala por esto:
class Bala( pygame.sprite.Sprite ):  #"heredamos" los métodos de la clase Sprite nativa en pygame
def __init__(self, pos_i_x, pos_i_y ): #inicializamos la clase con dos valores, de la posición inicial en "x" y en "y"
pygame.sprite.Sprite.__init__(self) #inicializamos la clase que heredamos...

#en la linea siguiente, cargamos la imagen...
self.image = TuFuncionParaCargarImagenes(dirección_de_la_imagen) #asumo, ya la tienes hecha :)

self.rect = self.image.get_rect() #obtenemos las "rectas" de nuestra imagen...

self.rect.center = (pos_i_x, pos_i_y) #colocamos la imagen en la posición inicial :)

#ahora, definiremos la velocidad de nuestra bala :)
self.dx = 0 # la velocidad en x
self.dy = -3 # la velocidad en y, recuerda por que es negativa :)

def update(self):
self.rect.move_ip((self.dx, self.dy)) #esto mueve continuamente nuestra bala

if self.rect.y < 0 : #esto revisa si la bala sale por la parte superior de la pantalla :)
self.kill() #... y la destruye si sale


Espero que eso sea lo que buscas, si no... bueno... ¿podridas mostrar el código para ver exactamente si ese es el problema? :) . Y si tienes dudas, solo dilo :)
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: Balas en pygame

Notapor birria4 » Vie Oct 07, 2011 11:00 pm

gracias infinitamente la verdad no he checado estoy en otra pc que no es mia pero pues gracias por ayudarme.
creo que tienes razon en lo del update() no lo use quisa sea eso en fin este esta mas claro y limpio intentare haber que pasa... saludos
birria4
 
Mensajes: 6
Registrado: Vie Oct 07, 2011 2:32 am

Re: Balas en pygame

Notapor birria4 » Lun Oct 10, 2011 2:06 am

hola de nuevpo lo intente y quedo con el mismo resultado se mueve solo uno por cada vez que aprieto el boton ayuda aqui dejo el codigo
la pokebola (la uso como bala XD) solo se mueve un espacio en vez de seguir avan zando como una bala


# -*- coding: cp1252 -*-
import pygame, sys
from pygame.locals import *

class pokebola( pygame.sprite.Sprite ):
def __init__(self, pos_i_x, pos_i_y ):
pygame.sprite.Sprite.__init__(self)

self.image = pygame.image.load("pokeball.png")
self.rect = self.image.get_rect()
self.rect.center = (trainer_left, trainer_top)

self.dx = 0
self.dy = -3

def update(self):

self.rect.move_ip((self.dx, self.dy))

if self.rect.y < 0 :
self.kill()

clock = pygame.time.Clock()
screen = pygame.display.set_mode((1000,500))

pygame.mouse.set_visible(0)

trainer = pygame.image.load("back1.png")
trainer2 = pygame.image.load("back2.png")
trainer_top = screen.get_height() - trainer.get_height()
trainer_left = screen.get_width()/2 - trainer.get_width()/2

bg = pygame.image.load("valle.png")

screen.blit(bg,(0,0))
screen.blit(trainer, (trainer_left,trainer_top))

pokebola = pokebola(trainer_left,trainer_top)

while True:

screen.blit(bg,(0,0))
screen.blit(trainer, (trainer_left,trainer_top))
x = 0
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
trainer_left = trainer_left - 10
x = x-10
if event.key == pygame.K_RIGHT:
trainer_left = trainer_left + 10
x = x+10
if event.key == pygame.K_SPACE:
screen.blit(pokebola.image,pokebola.rect.center)
screen.blit(trainer2, (trainer_left,trainer_top))
pokebola.update()


pygame.display.update()
birria4
 
Mensajes: 6
Registrado: Vie Oct 07, 2011 2:32 am

Re: Balas en pygame

Notapor kiketom » Lun Oct 10, 2011 7:01 am

Donde tienes el "for event in pygame.event.get():" cambialo por esto.

teclas_pulsadas = pygame.key.get_pressed()

if teclas_pulsadas[K_ESCAPE]:
sys.exit()
elif teclas_pulsadas[K_LEFT]:
# Lo que tengas que hacer
elif teclas_pulsadas[K_RIGHT]:
# Lo que tengas que hacer
elif teclas_pulsadas[K_SPACE]:
# Lo que tengas que hacer

y así con todos los eventos del teclado

...
Avatar de Usuario
kiketom
 
Mensajes: 82
Registrado: Lun Ene 03, 2011 3:01 pm
Ubicación: Valencia, España

Re: Balas en pygame

Notapor kaiser » Lun Oct 10, 2011 4:50 pm

Hola birria4, si te fijas lo que hace el método update() es mover una cierta cantidad de píxeles el sprite cada vez que lo invocas. Si quieres que el sprite se mueva continuamente deberás invocar al método continuamente y tú solo lo invocas cada vez que pulsas la tecla SPACE. Prueba a sacar el método update() fuera del for event in pygame.event.get():, es decir, ponlo a la misma altura que el pygame.display.update() y verás como la pokeball se desplaza continuamente. Aún así creo que tu juego tiene varios fallos más, pero es posible que me equivoque ya que no lo he jugado, solo he mirado el código por encima.

Creo que has malinterpretado el comentario de Barajas sobre que el método update() permite que el sprite se desplace continuamente, si lo piensas para que esto sea cierto una de dos: o el resto del juego se congelaría hasta que terminase de ejecutarse ese método, o necesitarías correrlo en un thread distinto.

PD: yo que tú metería el bliteado de la pokeball en el método update() o lo pondría donde se ejecute continuamente, igual que el update().

Un Saludo!
De la API al IDE y del IDE a la API.
Avatar de Usuario
kaiser
 
Mensajes: 121
Registrado: Mié Nov 24, 2010 7:47 pm
Ubicación: Madrid (España)

Re: Balas en pygame

Notapor Barajas » Lun Oct 10, 2011 10:28 pm

Curioso, puedo ver que llevas poco tiempo con pygame :D
Yo asumí que estabas trabajando con sprites, y tu utilizas simples imágenes. No digo que este mal, solo que es un poco practico en proyectos algo más grandes.

Bueno, te introduzco al mundo de los sprites y resolveremos el problema, no te preocupes, ni te ofendas, iré lento:
# -*- coding: cp1252 -*-
import pygame, sys
from pygame.locals import *
#defino unas variables globales para el ancho y el alto
Ancho = 1000
Alto = 500

#se crea la clase para la pokebola, no cambia para nada :)
class Pokebola( pygame.sprite.Sprite ):
def __init__(self, pos_i_x, pos_i_y ):
pygame.sprite.Sprite.__init__(self)

self.image = pygame.image.load("pokeball.png")
self.rect = self.image.get_rect()
self.rect.center = (pos_i_x, pos_i_y)
# retire lo del trainer por que no estaba definido dentro de la clase
self.dx = 0
self.dy = -3

def update(self):
self.rect.move_ip((self.dx, self.dy))
if self.rect.y < 0 :
self.kill()

#creo una clase para el personaje principal :)
#que también es un sprite...
class Trainer( pygame.sprite.Sprite ):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("back1.png")
self.rect = self.image.get_rect()
self.rect.center = (1000/2,500/2 ) #aquí ,lo colocamos en una posición inicial
#la ventaja de utilizar rect, es que nos permite, como creo intentaste, colocar
#la imagen con el centro como lo ponemos
#además, resulta redundante preguntar el alto y el ancho si sabemos que es de 1000 X 500 :)
self.dx = 10
def update(self):
#es mucho mejor dejar que el personaje se actualice a si mismo :)
posx, posy = self.rect.center #creamos dos variables para la posición
for event in pygame.event.get():
#en esta parte modificamos la posición
if event.type == KEYDOWN:
if event.key == K_LEFT:
posx -= self.dx
if event.key == K_RIGHT:
posx += self.dx
self.rect.center = (posx, posy) #y aquí lo aplicamos :)

def main(): #creo una función principal
pygame.init() #inicialzo a pygame
pantalla = pygame.display.set_mode( (Ancho,Alto) ) #creo la pantalla
pygame.mouse.set_visible(False) #no digo que este mal el "0", solo que así se entiende más :)
bg = pygame.image.load("valle.png") #esto no lo explico :)
#ahora, creamos algo que te parecerá nuevo:
# "un grupo de sprites"
sprites = pygame.sprite.RenderClear()
#y añadimos a nuestro personaje al grupo
trainer = Trainer()
sprites.add( trainer )
jugar = True
while jugar:
for event in pygame.event.get():
if event.type == pygame.QUIT:
jugar = False; pygame.quit() #el punto y coma permite poner sentencias en la misma linea
sys.exit()
if event.type == KEYDOWN:
if event.key == K_SPACE:
#ahora, cuando presiones, se agregara una bala
x, y = trainer.rect.center #tomamos la posición inicial, que sera la misma
#que la del personaje
pokebola = Pokebola(x,y) #lo pasamos como argumento para inicializarla :)
sprites.add(pokebola) #y la añadimos al código
pantalla.fill((250,250,250))
pantalla.blit(bg, (0,0) )
sprites.draw(pantalla) #esto dibuja TODOS los sprites en el grupo
sprites.update() #y esto actualiza TODOS los sprites en el grupo
#esa es la gran ventaja de trabajar con esprites
pygame.display.update()
main()


No cargue la segunda nave... pero esto funciona :)
Si tienes alguna duda sobre el código, solo pregunta :)
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: Balas en pygame

Notapor birria4 » Mié Oct 12, 2011 10:36 pm

hola de nuevo gracias por ayudarme sin embargo por alguna razon trate todos las sugerencias e incluso copie el codigo de barajas y aun asi sigue sin funcionar.
en el codigo de barajas ni si quiera aparece la pokebola(bala) en los demas sigue como lo tenia yo solo avansa un solo :/.
birria4
 
Mensajes: 6
Registrado: Vie Oct 07, 2011 2:32 am


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