Empujar un objeto con otro

Solicite, consulte o publique recursos de referencia para desarrolladores.

Empujar un objeto con otro

Notapor PLC » Lun Abr 21, 2008 6:04 am

Necesito una rutina que me permita con un personaje empujar un objeto????????? :roll: :?:
PLC
 
Mensajes: 21
Registrado: Lun Feb 11, 2008 12:02 am

Re: Empujar un objeto con otro

Notapor hugoruscitti » Lun Abr 21, 2008 5:15 pm

PLC escribió:Necesito una rutina que me permita con un personaje empujar un objeto????????? :roll: :?:


Pero depende mucho del juego que quieras hacer, intenta ser
mas descriptivo. Puede que te sirva iniciar el movimiento de bloques
en base a una matriz (como en los juegos RPG o de ingenio), o
usar un sistema de fuerzas estilo la ley de Newton para cosas que
aparenten mas realismo... pero bueno, sería bueno que lo hagas
lo mas simple posible.

PD: intenta redactar correctamente las preguntas también, con
puntuación y apertura en los signos de pregunta por favor.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor PLC » Lun Abr 21, 2008 5:38 pm

Lo que quiero hacer es que por ejemplo yo tengo una imagen que es un bloque, y tengo otra que es el personaje como tal, entonces que el personaje pueda empujar ese bloque , es decir mientras camina se mueve el bloque, no que lo empuje y el se queda parado, sino que lo empuje a medida que va caminando es decir se van moviendo los dos al mismo tiempo.
PLC
 
Mensajes: 21
Registrado: Lun Feb 11, 2008 12:02 am

Notapor PLC » Lun Abr 21, 2008 5:41 pm

Yo soy el muchacho que te escribio hace algun tiempo el que esta haciendo el primer nivel de zeek park, parece que tu correo tiene problemas, me haria falta tambien mandarte lo que he hecho para preguntarte otras cositas, puede ser?????
PLC
 
Mensajes: 21
Registrado: Lun Feb 11, 2008 12:02 am

Notapor hugoruscitti » Lun Abr 21, 2008 8:07 pm

PLC escribió:Lo que quiero hacer es que por ejemplo yo tengo una imagen que es un bloque, y tengo otra que es el personaje como tal, entonces que el personaje pueda empujar ese bloque , es decir mientras camina se mueve el bloque, no que lo empuje y el se queda parado, sino que lo empuje a medida que va caminando es decir se van moviendo los dos al mismo tiempo.


En ese caso tendrías que cambiar la posición de cualquier caja
en colisión con el personaje mientras este se mueve.

Modificando un poco el código de otro ejemplo del foro armé un
ejemplo sencillo:

Imagen

El programa consiste en mover un cuadrado verde que puede
mover a los bloques azules. Te dejo el código:

Código: Seleccionar todo
# -*- encoding: utf-8 -*-
import pygame
from pygame.sprite import Sprite
import random


class Caja(Sprite):

    def __init__(self, x, y):
        Sprite.__init__(self)
        self.crear_imagen_representacion()
        self.rect.center = x, y

    def crear_imagen_representacion(self):
        size = random.randint(10, 40)
        self.image = pygame.surface.Surface((size, size))
        self.image.fill((100, 100, 255))
        self.rect = self.image.get_rect()

    def draw(self, screen):
        screen.blit(self.image, self.rect)

class Personaje(Sprite):
    "Personaje rectangular que puede caminar y saltar."

    def __init__(self):
        Sprite.__init__(self)
        self.crear_imagen_representacion()

    def crear_imagen_representacion(self):
        self.image = pygame.surface.Surface((20, 20))
        self.image.fill((100, 255, 100))
        self.rect = self.image.get_rect()
        self.rect.center = 160, 120

    def update(self, cajas):
        "Actualiza la posición del personaje en base al estado del teclado."

        teclas = pygame.key.get_pressed()

        if teclas[pygame.K_LEFT]:
            self.move(-1, 0, cajas)
        elif teclas[pygame.K_RIGHT]:
            self.move(1, 0, cajas)

        if teclas[pygame.K_UP]:
            self.move(0, -1, cajas)
        elif teclas[pygame.K_DOWN]:
            self.move(0, 1, cajas)

    def draw(self, screen):
        "Muestra al personaje en pantalla."
        screen.blit(self.image, self.rect)

    def move(self, x, y, cajas):
        speed = 4
        self.rect.move_ip(x * speed, y * speed)

        for caja in cajas:
            if self.rect.colliderect(caja.rect):
                caja.rect.move_ip(x * speed, y * speed)


# Programa principal

if __name__ == '__main__':
    salir = False
    screen = pygame.display.set_mode((320, 240))
    personaje = Personaje()
    cajas = [Caja(50, 50), Caja(200, 200), Caja(100, 40)]

    while not salir:

        for evento in pygame.event.get():
            if evento.type == pygame.QUIT:
                salir = True
            elif evento.type == pygame.KEYDOWN:
                if evento.key == pygame.K_q:
                    salir = True

        personaje.update(cajas)

        screen.fill((100, 100, 100))

        for caja in cajas:
            caja.draw(screen)

        personaje.draw(screen)
        pygame.display.flip()

        pygame.time.delay(10)


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

Notapor PLC » Mar Abr 22, 2008 5:32 am

tengo un problema, cuando empujo una imagen con el personaje y entonces ya no quiero seguir empujando, y me muevo en otra direccion la imagen que empujaba entonces se sigue moviendo con el personaje.

Este es el metodo para mover el personaje que tengo


Código: Seleccionar todo
def moverse(self, dx, dy, muros,comedoras,frutas):
         """Intenta mover al personaje pero sin cruzar muros."""
         rect_collision = self.rect.move(dx, dy)
         rect_collision.width =24   
         rect_collision.height = 27 
         rect_collision.x +=  5 
         rect_collision.y += 9 

         for muro in muros:
             if muro.colisiona_con(rect_collision):
                 self.choque = 1
                 return
         for comedora in comedoras:
             if comedora.colisiona_con(rect_collision):
                 self.choque = 1
                 return
         #En fruta estan los sprite que quiero mover
         for fruta in frutas:
            if self.rect.colliderect(fruta.rect):
                 fruta.rect.move_ip(dx , dy)
         # si se puede realizar el movimiento
         self.rect.move_ip(dx, dy)
         self.choque = 0 [code][/code]
PLC
 
Mensajes: 21
Registrado: Lun Feb 11, 2008 12:02 am

Notapor hugoruscitti » Mar Abr 22, 2008 5:54 pm

PLC escribió:tengo un problema, cuando empujo una imagen con el personaje y entonces ya no quiero seguir empujando, y me muevo en otra direccion la imagen que empujaba entonces se sigue moviendo con el personaje.


pero en el código que publiqué eso no ocurre, ¿o si?. Tendrías
que ver el estado de los objetos usando "print" y corroborar
que el problema no esté con el tamaño de los rectángulos.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor PLC » Mié Abr 23, 2008 4:00 am

lo que paso fue que cuando comprobaba que el personaje estuviera en colision con lo que empuja le habia quitado el *

Lo tenia sin * 4 que bueno es logico no, mueve lo que se empuja un poco mas para alla de lo que se me mueve el personaje

Código: Seleccionar todo
for fruta in frutas:
            if self.rect.colliderect(fruta.rect):
                 fruta.rect.move_ip(dx * 4 , dy * 4)


pero bueno en mi caso el movimiento del personaje esta implementado para que este se pueda sobrepasar los limites de otros objetos y se me da el caso que en una posicion determinada el personaje no llega a empujar la caja por ejemplo, pero ya hace colision y si me dirijo en otra direccion que no es la de empujar, lo que empujo se pasa para esa direccion.




Código: Seleccionar todo
def moverse(self, dx, dy, muros,comedoras,frutas):
         """Intenta mover al personaje pero sin cruzar muros."""
         rect_collision = self.rect.move(dx, dy)
         rect_collision.width =24   
         rect_collision.height = 27 
         rect_collision.x +=  5 
         rect_collision.y += 9 

         for muro in muros:
             if muro.colisiona_con(rect_collision):
                 self.choque = 1
                 return
         for comedora in comedoras:
             if comedora.colisiona_con(rect_collision):
                 self.choque = 1
                 return
         for fruta in frutas:
            if self.rect.colliderect(fruta.rect):
                 fruta.rect.move_ip(dx * 4 , dy * 4)
         # si se puede realizar el movimiento
         self.rect.move_ip(dx, dy)
         self.choque = 0
PLC
 
Mensajes: 21
Registrado: Lun Feb 11, 2008 12:02 am


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 2 invitados