Proyecto Funes

Proyecto Funes

Notapor Barajas » Mar Ene 10, 2012 10:11 am

Como sabrán ustedes (o eso asumo...) ha comenzado el concurso de videojuegos de loserjuegos. http://concurso.ep.io/
Me decidido participar con un proyecto al cual he decidido nombrar por el nombre clave de "Funes".

Aquí me encargare SOLO de portear el avance del proyecto en cuanto a código, y otras cosas, pero la historia del mismo me la reservare hasta el final (ya la tengo, solo que quiero que sea una sorpresa). Sobre el juego, solo comentare que tendrá elementos de aventura-acción, y un aspecto gráfico tipo minecraft (o al menos así me salen los sprites XD ), todo esto en un mundo que alterna entre el 2d y el 2.5D... pero de cualquier forma, les pediré que no se hagan muchas ilusiones con el juego :)

Se aceptan criticas y sugerencias :)

Empezando, he de decir que primero hay que formarse una idea de lo que quieres hacer, lo que crees que debes hacer y finalmente , lo que puedes hacer.

Ejemplo:

DEBO hacer un juego...
QUIERO hacer un juego como Shadow of the colossus...
PUEDO hacer un pong (la verdad un poco mas avanzado, pero es solo un ejemplo)

Y después intentar reducir la linea entre lo que quieres y lo que puedes hacer.

Ejemplo:

QUIERO hacer un buen juego.
PUEDO investigar lo que necesito.

Por eso, me he puesto ha investigar unas cosas...
http://codentronix.com/2011/05/12/rotating-3d-cube-using-python-and-pygame/

Adjunto el código con nuestro (de momento) personaje principal, para moverlo, se utilizan las direccionales (o teclas de flechas, como prefieran), para saltar utilicen la tecla X y es todo por el momento :)
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: Proyecto Funes

Notapor kaiser » Mar Ene 10, 2012 11:15 am

Jajaja, si señor! De lo mejorcito que he visto por LJ últimamente. Es el sistema de pseudo 3D que se usó en los primeros juegos FPS, creó que traerá muy buenos recuerdos a la gente, a mi por lo menos me los trae :D

Intentad documentar/comentar el código lo mejor posible porque puede resultar muy muy útil para el resto de programadores.

Yo, después de tanto apoyar la idea del concurso, no sé si al final podré participar porque me ha pillado justo con los exámenes finales de la uni, pero si por algo me gustaba la idea de crear un concurso es porque estaba seguro que sacaría lo mejor de nosotros y parece que así está siendo.

Ánimo y a seguir así.

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: Proyecto Funes

Notapor shackra » Mar Ene 10, 2012 6:31 pm

kaiser escribió:Yo, después de tanto apoyar la idea del concurso, no sé si al final podré participar porque me ha pillado justo con los exámenes finales de la uni, pero si por algo me gustaba la idea de crear un concurso es porque estaba seguro que sacaría lo mejor de nosotros y parece que así está siendo.


Pero tenes tres meses de tiempo para desarrollar algo!! :D, yo en lo personal estoy esperando que salga SFML 2 y su respectivos bindings para Python, de ahí en adelante sera prueba y error como también aplicar eso del DEBO, QUIERO y PUEDO :p
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica

Re: Proyecto Funes

Notapor Barajas » Mar Ene 10, 2012 6:42 pm

Bueno, pues sobre el código, he de confesar sinceramente que lo estoy armando por partes. (tomo un poco del código, hago un avance que considero considerable, guardo, creo una copia y lo renombro, y sobre esa copia sigo trabajando hasta que hago otro avance, continuo hasta que llego a, algo que considero bueno). Así empezar modificando el código del articulo que comente arriba (de hecho cree una versión mucho mas pequeña de su código), compredi como funcionaba, y se me ocurrió que podría basarme en su principio para crear la sensación de profundidad. De hecho, la proyección el 3D es una consecuencia de la trigonometría...

Puedo documentarlo, pero de momento me da un poco de flojera, cosa muy diferente de responder dudas sobre el mismo....
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: Proyecto Funes

Notapor Mightygaver » Mar Ene 10, 2012 7:22 pm

Está superbien!

Nunca había pensado en ese tipo de proyección para dar la impresión 3D cuando es básicamente 2D, aunque estoy seguro de haber jugado a algún juego de ese tipo porque me suena mucho :P

Mucha suerte con tu proyecto, yo aún no tengo muy claro por donde quiero moverme, pero tendré que ponerme pronto si quiero hacer algo decente.

Por otro lado quería recomendarte que puedes utilizar control de versiones para las copias del código, ya que la práctica de copias que comentas se te puede automatizar mucho usando control de versiones y así te acostumbras a usarlo, ya que es una de las mejores prácticas de desarrollo que conozco. Puedes escoger entre svn, git y mercurial. En mi opinión git y mercurial son superiores por ser distribuidos, pero si vas a hacer un desarrollo en solitario subversion también te puede valer.

Gracias por compartir el código, trataré de estudiarlo cuando arregle mi pc :D
Mightygaver
 
Mensajes: 69
Registrado: Vie Ago 27, 2010 5:46 pm
Ubicación: Vila-real, España

Re: Proyecto Funes

Notapor Barajas » Jue Ene 12, 2012 4:57 pm

El siguiente paso que he tomado, es gestionar la interacción con el mundo, es decir, los mensajes de dialogo entre NPC o con los objetos (como un cartel...)

Para esto, se me ocurrió utilizar una cola donde se agregaran, en pseudo codigo seria algo asi...:

cola_dialogo = []
mientras juego:
dibujar_mundo
dibujar_personajes
si no hay diálogos en la cola:
actualizar_mundo y personajes
si hay dialogo:
cola_dialogo[primer elemento]dibujar
cola_dialogo[primer elemento]actualizar
gestionar_eventos:
si se presiona tecla tal
retirar el primer elemento de la cola


Su implementación básica en Python y pygame es:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pygame
import sys
from pygame.locals import *
ALTO = 480
ANCHO = 640
DEFAULTFONT = pygame.font.get_default_font()

class Dialogo():
def __init__(self, Dice="..."):
self.fuente = pygame.font.Font(DEFAULTFONT, 30)
self.dice = Dice
def imprime(self,pantalla):
titulo = self.fuente.render(self.dice, 1, (255,255,255))
pantalla.blit(titulo,(20,20))

def main():
pygame.init()
screen = pygame.display.set_mode((ANCHO,ALTO))
clock = pygame.time.Clock()
jugar = True
cola_dialogos = []
cola_dialogos.append(Dialogo("hola mundo"))
cola_dialogos.append(Dialogo(u"¿como estas?"))
cola_dialogos.append(Dialogo(u"Bien, y tú?"))
while jugar:
for event in pygame.event.get():
if event.type == pygame.QUIT:
jugar = False
if len(cola_dialogos)>0 and event.type == KEYDOWN:
if event.key == K_x:
cola_dialogos.pop(0)
clock.tick(25)
screen.fill((0,0,0))
if len(cola_dialogos)>0:
cola_dialogos[0].imprime(screen)
pygame.display.update()

main()
sys.exit()


consideremos que quiero la interacción con npcs, para eso, al "hablar" con un npc, lo que se aria, es agregar a la cola de eventos el dialogo correspondiente, en pseudo código:

cola_dialogo = []
mientras juego:
dibujar_mundo
dibujar_personajes
si no hay diálogos en la cola:
actualizar_mundo y personajes
si hay dialogo:
cola_dialogo[primer elemento]dibujar
cola_dialogo[primer elemento]actualizar
gestionar_eventos:
si se presiona tecla tal
retirar el primer elemento de la cola
si se presiona tecla tal y hay un personaje en rango:
agregar a cola dialogo de personaje



Lo bueno de utilizar una cola es que en caso de que dos personajes estén en rango, se agregan a la cola por quien este primero o mas cerca (aun que yo no he implementado eso ultimo):

Aquí dejo el código con dos NPCs, la imagen utilizada es la misma que del ejemplo de arriba. Aun me falta crear una versión del algoritmo del pintor para los sprites

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pygame.locals import *
import pygame
import sys
import os
from math import sin, cos, radians
from random import randrange
DEFAULTFONT = pygame.font.get_default_font()
ALTO = 640
ANCHO = 480

class Punto3D():
def __init__(self, x=0.0, y=0.0, z=0.0):
print x, ",", y, ",",z, "..."
self.x, self.y, self.z = x,y,z
def rotateX(self, angulo):
cosa = cos(radians(angulo))
sina = sin(radians(angulo))
y = self.y * cosa - self.z * sina
z = self.y * sina + self.z * cosa
self.y, self.z = y, z

def rotateY(self, angulo):
cosa = cos(radians(angulo))
sina = sin(radians(angulo))
z = self.z * cosa - self.x * sina
x = self.z * sina + self.x * cosa
self.x, self.z = x, z

def rotateZ(self, angulo):
cosa = cos(radians(angulo))
sina = sin(radians(angulo))
x = self.x * cosa - self.y * sina
y = self.x * sina + self.y * cosa
self.y, self.x = y, x

def a_2D(self, cdv=258, dis_obs=4, ven_anch=480, ven_alto=640):
#Cambia las cordenadas de 3D a 2D
#cdv = campo de visión
#dis_obs = distancia observador
try:
factor = cdv / (dis_obs + self.z)
except:
factor = cdv
#en la trasformación el 2 es para tomar el centro de la ventana
#como "origen"
x = int(self.x * factor + ven_alto / 2)
y = int(-self.y * factor + ven_anch / 2)
return (x, y)

class Cuadrado():
def __init__(self, dimenciones, centro, prof,
rellenar=False,
color=(255,255,255),
rejilla = True, tipo = "Horizontal", ancho=480,alto=640 ):
self.list_puntos = []
self.centro = centro
self.prof = prof
self.rejilla = rejilla
medio = dimenciones/2.0
x1 = centro[0]-medio
x2 = centro[0]+medio
y1 = centro[1]-medio
y2 = centro[1]+medio
self.ancho= ancho
self.alto = alto
puntos = [(x1,y1),(x1,y2),(x2,y1),(x2,y2)]
for p in puntos:
if tipo != "Horizontal":
self.list_puntos.append(Punto3D(p[0],p[1],prof))
else:
self.list_puntos.append(Punto3D(p[0],prof,p[1]))
self.aristas = [(0,1),(2,3),(2,0),(3,1)]
self.rellenar = rellenar
self.color = color
def dibuja(self,pantalla):
color = self.color
if self.rejilla:
for a in self.aristas:
#Esto dibuja las aristas....
pygame.draw.line(pantalla, color,
self.list_puntos[a[0]].a_2D(ven_anch = self.ancho, ven_alto = self.alto, cdv=256, dis_obs=4),
self.list_puntos[a[1]].a_2D(ven_anch = self.ancho, ven_alto = self.alto, cdv=256, dis_obs=4))
if self.rellenar:
lista_puntos = []
for i in [0,1,3,2]:
punto = self.list_puntos[i].a_2D(ven_anch = self.ancho, ven_alto = self.alto, cdv=256, dis_obs=4)
lista_puntos.append(punto)
pygame.draw.polygon(pantalla, color,lista_puntos)


class AnimacionDeArchivo():
def __init__(self, columnas, filas, image):
self.lista_frames = []
tile_w = image.get_width () / columnas
tile_h = image.get_height () / filas
for f in xrange (filas):
for c in xrange (columnas):
rect = c * tile_w , f * tile_h , tile_w, tile_h
self.lista_frames.append(image.subsurface(rect).copy ())
self._frame = 0
self.inicio = pygame.time.get_ticks()
self._delay = 1000/15
self.ultima_act = 0 #ultima
def redimencion(self, dimencion):
for i in range(len(self.lista_frames)):
frame_i = self.lista_frames[i]
frame = pygame.transform.scale(frame_i, dimencion)
self.lista_frames[i] = frame
def set_alpha(self, alpha):
for i in range(len(self.lista_frames)):
frame_i = self.lista_frames[i]
frame_i.set_alpha(alpha)
self.lista_frames[i] = frame_i
def Frame_es(self, Lista_anima = [0], Reset = False, Frame_return = False):
if Reset:
self._frame = 0
if pygame.time.get_ticks() - self.ultima_act > self._delay:
self._frame += 1
if self._frame >= len(Lista_anima):
self._frame = 0
self.ultima_act = pygame.time.get_ticks()
if Frame_return:
return self.lista_frames[ Lista_anima[self._frame] ], self._frame
else:
return self.lista_frames[ Lista_anima[self._frame] ]

class Sprite_3D(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
heroe = self.carga_imagen("heroe.png")
self.anima = AnimacionDeArchivo(3,3,heroe)
self.constante = 16
self.image = self.anima.Frame_es([7])
self.rect = self.image.get_rect()
self.rect.center = (ANCHO/2,ALTO/2)
self.punto_alto = Punto3D(0,0.5,0)
self.punto_base = Punto3D(0,0,0)
self.const = self.punto_base.a_2D()[1] - self.punto_alto.a_2D()[1]
self.estado = "parado"
self.fuerza_salto = 0.1
self.gravedad = 0.01
self.temp = (0,0)
def carga_imagen(self, name): #función para cargar las imagenes
fullname = os.path.join(name)
try:
image = pygame.image.load(fullname)
except pygame.error, message:
print 'No se puede cargar la imagen: ', fullname
raise SystemExit, message
image = image.convert_alpha()
return (image)
def cambiar_estado(self, nuevo_estado):
self.anima.Frame_es(Reset=True)
self.estado = nuevo_estado
def parado(self):
key=pygame.key.get_pressed()
self.image = self.anima.Frame_es([7])
if key[K_x]:
self.cambiar_estado("salta")
self.temp = (self.punto_base.y, self.punto_alto.y)
if key[K_UP]:
self.cambiar_estado("fondo")
if key[K_DOWN]:
self.cambiar_estado("frente")
if key[K_LEFT]:
self.cambiar_estado("izquierda")
if key[K_RIGHT]:
self.cambiar_estado("derecha")
def al_fondo(self):
key=pygame.key.get_pressed()
if key[K_UP]:
self.image = self.anima.Frame_es([0,0,1,1,2,2,1,1])
self.punto_base.z += 0.1
self.punto_alto.z += 0.1
else:
self.cambiar_estado("parado")
def al_frente(self):
key=pygame.key.get_pressed()
if key[K_DOWN]:
self.image = self.anima.Frame_es([6,6,7,7,8,8,7,7])
if (self.punto_base.z-0.1) > -4:
self.punto_base.z -= 0.1
self.punto_alto.z -= 0.1
else:
self.cambiar_estado("parado")
def derecha(self):
key=pygame.key.get_pressed()
if key[K_RIGHT]:
self.image = self.anima.Frame_es([3,3,4,4,5,5,4,4])
self.punto_base.x += 0.1
self.punto_alto.x += 0.1
else:
self.cambiar_estado("parado")
def izquierda(self):
key=pygame.key.get_pressed()
if key[K_LEFT]:
image = self.anima.Frame_es([3,3,4,4,5,5,4,4])
self.image = pygame.transform.flip(image, True, False)
self.punto_base.x -= 0.1
self.punto_alto.x -= 0.1
else:
self.cambiar_estado("parado")
def salta(self):
if (self.punto_base.y + self.fuerza_salto) < self.temp[0]:
self.fuerza_salto = 0.1
self.cambiar_estado("parado")
self.punto_base.y = self.temp[0]
self.punto_alto.y = self.temp[1]
else:
self.punto_base.y += self.fuerza_salto
self.punto_alto.y += self.fuerza_salto
self.fuerza_salto -= self.gravedad
def update(self):
if self.estado == "frente":
self.al_frente()
elif self.estado == "fondo":
self.al_fondo()
elif self.estado == "derecha":
self.derecha()
elif self.estado == "izquierda":
self.izquierda()
elif self.estado == "salta":
self.salta()
else:
self.parado()
self.const = self.punto_base.a_2D()[1] - self.punto_alto.a_2D()[1]
self.image = pygame.transform.scale(self.image, (self.const,self.const))
self.rect = self.image.get_rect()
self.rect.center = self.punto_base.a_2D()

class Dialogo():
def __init__(self, Dice="..."):
self.fuente = pygame.font.Font(DEFAULTFONT, 30)
self.dice = Dice
def imprime(self,pantalla):
titulo = self.fuente.render(self.dice, 1, (255,255,255))
pantalla.blit(titulo,(20,20))

class Sprite_3D_NPC(pygame.sprite.Sprite):
def __init__(self, x,y):
pygame.sprite.Sprite.__init__(self)
heroe = self.carga_imagen("heroe.png")
self.anima = AnimacionDeArchivo(3,3,heroe)
self.constante = 16
self.image = self.anima.Frame_es([7])
self.rect = self.image.get_rect()
self.rect.center = (ANCHO/2,ALTO/2)
self.punto_alto = Punto3D(x,0.5,y)
self.punto_base = Punto3D(x,0,y)
self.const = self.punto_base.a_2D()[1] - self.punto_alto.a_2D()[1]
self.estado = "parado"
self.fuerza_salto = 0.1
self.gravedad = 0.01
self.temp = (0,0)
self.dialogo = Dialogo(u"Hola, ¿De donde vienes?")
def carga_imagen(self, name): #función para cargar las imagenes
fullname = os.path.join(name)
try:
image = pygame.image.load(fullname)
except pygame.error, message:
print 'No se puede cargar la imagen: ', fullname
raise SystemExit, message
image = image.convert_alpha()
return (image)
def update(self):
self.const = self.punto_base.a_2D()[1] - self.punto_alto.a_2D()[1]
self.image = pygame.transform.scale(self.image, (self.const,self.const))
self.rect = self.image.get_rect()
self.rect.center = self.punto_base.a_2D()


class Campo():
def __init__(self, punto, dimenciones, prof = 0):
self.punto = punto
self.prof = prof
self.dimenciones = dimenciones
self.campo = []
mapa = ["zzzzz zxzzzx",
" zzzzxzzx ",
"zy x z y zz",
" zzxz zzz zz",
" zxz z ",
"zxzz yzz y"]
self.genera(mapa)
def genera(self,mapa):
y = 0
for fila in mapa:
x=0
for columna in fila:
if columna != " ":
centro = ((self.punto[0]+(x)), (self.punto[1]-(y)))
print "el centro es: ", centro
cuadrado = Cuadrado(self.dimenciones,centro,self.prof )
if columna == "x":
cuadrado.rellenar = True
cuadrado.rejilla = False
if columna == "z":
cuadrado.color = (20,20,250)
if columna == "y":
cuadrado.color = (100,100,255)
cuadrado.rellenar = True
self.campo.append(cuadrado)
x+=self.dimenciones
y+=self.dimenciones
def dibuja(self, pantalla):
for cuadrado in self.campo:
cuadrado.dibuja(pantalla)

def main():
pygame.init()
screen = pygame.display.set_mode((ALTO, ANCHO))
clock = pygame.time.Clock()
cuadrado = Campo((-6,7),6,-1)
jugar = True
grupo = pygame.sprite.RenderClear()
npcs_g = pygame.sprite.RenderClear()
spri = Sprite_3D()
spri_2 = Sprite_3D_NPC(-2,0)
spri_3 = Sprite_3D_NPC(1,-2)
grupo.add(spri)
npcs_g.add(spri_2)
npcs_g.add(spri_3)
cola_dialogos = []
while jugar:
for event in pygame.event.get():
if event.type == pygame.QUIT:
jugar = False
if event.type == KEYDOWN:
if event.key == K_z:
if len(cola_dialogos)>0:
cola_dialogos.pop(0)
else:
for sprite in npcs_g:
if (sprite.punto_base.x < spri.punto_base.x+0.5 and sprite.punto_base.x > spri.punto_base.x-0.5) and (sprite.punto_base.z < spri.punto_base.z+0.5 and sprite.punto_base.z > spri.punto_base.z-0.5):
cola_dialogos.append(sprite.dialogo)
clock.tick(25)
screen.fill((200,200,200))
cuadrado.dibuja(screen)
grupo.draw(screen)
npcs_g.draw(screen)
if len(cola_dialogos)>0:
cola_dialogos[0].imprime(screen)
else:
grupo.update()
npcs_g.update()
pygame.display.update()

main()
sys.exit()


¿Qué les parece? :)
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: Proyecto Funes

Notapor Barajas » Dom Ene 15, 2012 8:21 am

Bueno, han sido días interesantes, ahora, he estado trabajando para agregarle una textura al cubo
de momento he conseguido un resultado algo penoso. bugs, solo diré que esta relacionado con la forma en que calculo la trasformación de la textura (hay momentos en que parece que la textura de las caras tiembla)

:)

#resive como argumentos dos tuplas de valores (x,y)
def puntos_inter(self, punto_a, punto_b):
#primero, generamos todos los puntos en x
#siguen los puntos en y
lista_x = []
lista_y = []
if punto_a[0] > punto_b[0]:
for i in range(punto_b[0], punto_a[0]+1):
lista_x.append(i)
else:
for i in range(punto_a[0], punto_b[0]+1):
lista_x.append(i)
lista_x.reverse()
if punto_a[1] > punto_b[1]:
for i in range(punto_b[1], punto_a[1]+1):
lista_y.append(i)
else:
for i in range(punto_a[1], punto_b[1]+1):
lista_y.append(i)
lista_y.reverse()
#creo una lista que contendra los valores de "x" y "y"
lista_puntos = []
#el espacio es por que son mas puntos en x que en y
espaciado = len(lista_x)/len(lista_y)
contador = 0
index_y = 0
for i in range(len(lista_x)):
if contador == espaciado+1:
contador = 0
index_y += 1
lista_puntos.append( (lista_x[i], lista_y[index_y] ) )
contador +=1
return lista_puntos


¿Alguien conoce una mejor forma de hacerlo? :)
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: Proyecto Funes

Notapor maxinarv » Lun Ene 16, 2012 6:59 pm

No estoy muy metido en el tema, pero si entendés inglés te dejo algo que a lo mejor sirva, es un análisis de cómo hace el render el doom. En ese mismo blog hay artículos de cómo hace el render el quake y quake 2.
http://fabiensanglard.net/doomIphone/do ... nderer.php

Saludos
maxinarv
 
Mensajes: 11
Registrado: Jue Ene 12, 2012 7:48 pm

Re: Proyecto Funes

Notapor Barajas » Mar Ene 17, 2012 5:10 am

Muchas gracias, con esto me queda mas claro el algoritmo de raycasting :)
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: Proyecto Funes

Notapor Barajas » Jue Ene 19, 2012 8:43 am

Hola, pasaba para comentar que después de una serie de altibajos (entender código de un lenguaje que no conoces, junto con otro que mas o menos entiendes..... :roll: )

Esta es la parte del proyecto en la que uno se da cuenta de que lo que originalmente pretendía es inviable o, estaba con un enfoque equivocado, es mejor que esto suceda al principio o si no.... (en mi caso, cambiar de simple proyección en 3D y pasar a algo que me revuelve un poco -aun- como el raycasting). Aun así, no es un golpe muy grande.

He revisado una importante cantidad de artículos, testeando código, y haciendo pruebas, aquí el primer resultado; aun no subiré código, es una cosa revuelta y con fragmentos por aquí y por aya, una cosa sin pies y cabeza (el código es un espagueti horrible, y más aparte, de mal sabor XD)

Me dispondré a extender la funcionalidad y hacerlo mucho mas practico :), tal vez cuando este listo, me atreva documentarlo.... espero que no sea solo un propósito XD

Aquí una imagen:
Última edición por Barajas el Lun Ene 23, 2012 6:58 am, editado 1 vez en total
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: Proyecto Funes

Notapor Barajas » Lun Ene 23, 2012 6:57 am

El rumbo que ha tomado el proyecto es:

:arrow: Crear un pequeño motor
:arrow: Preocuparnos por el diseño de niveles después
:arrow: Afinar detalles

Esta vez... si comparto el código, aun esta un poco sucio y confuso, pero es mucho mas claro :D (así que imaginen como estaba la versión anterior :oops: ....)

Es mas que nada un ejemplo. las características principales son:

1-Manejo de sprites básico
2-Dos métodos de realizar texturas animadas
3-Control de la cámara

Cosas que faltan por agregar:

1- Colisiones entre sprites 3D
2- Animaciones de sprites 3D
3- Un personaje principal (aka Heroe) XD

Aquí dejo una copia para descarga, el único requerimiento es python, pygame y una computadora que no sea quisquillosa... :)

Aquí esta el ejemplo: http://db.tt/eewmnn8G

Como siempre, criticas, sugerencias... :) ...y amenazas
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: Proyecto Funes

Notapor hugoruscitti » Lun Ene 23, 2012 2:34 pm

Barajas, mis felicitaciones, no me lo puedo creer... está impresionante tu
implementación, me sorprendió ver animaciones de texturas en las paredes, creo
que los juegos tipo wolf3d no tenían esa característica (creo), así que incluso está
mejorado!!
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Re: Proyecto Funes

Notapor Barajas » Mar Ene 24, 2012 5:08 pm

hugoruscitti escribió:Barajas, mis felicitaciones, no me lo puedo creer... está impresionante tu
implementación, me sorprendió ver animaciones de texturas en las paredes, creo
que los juegos tipo wolf3d no tenían esa característica (creo), así que incluso está
mejorado!!


Muchas gracias Hugo :D

Sobre las texturas animadas he de confesar que tienen el pequeño inconveniente de la velocidad, ya que, para cambiar la imagen, primero tiene que estar dibujada toda la pared, o si no, lo que pasa es un efecto de "persianas" entre las imágenes que componen la animación, veré mas adelante si puede arreglarse... (no es en este momento una prioridad :roll: ).

Ya hice una nueva versión con sprites animados. Ahora me estoy enfocando en crear un sistema de grupos para colisiones entre los sprites similar al que pygame brinda por defecto. :)

A demas, de que tengo algunas ideas interesantes (o al menos, para mi lo son :lol: )
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: Proyecto Funes

Notapor Barajas » Sab Ene 28, 2012 6:28 am

Hola a todos. Hace unos días, comente que me encargaría de hacer mejoras, aquí esta el resultado:
:arrow: http://db.tt/gBfFN1jA

Incluye dos archivos de ejemplo, el primero es mas que nada la colocación y el segundo es un micro juego de disparos, mas bien, podría decirse de que es un ejemplo de como funcionan las colisiones que cree :) (muy rudimentarias, hay veces en que son un poco inexactas, hay cosas por pulir, pero funcionan.... :roll: )

Ahora bien, con esto ya se tiene una primera base para la creación de mi juego, en mi opinión, lo que falta por agregar es:

:arrow: Manejo de "items"
:arrow: Simplificar un poco mas
:arrow: Sprites 2.5 (que puedan verse en vistas frente, 3/4, lado, 3/4, atrás dependiendo de donde este la cámara...)
:arrow: "Horizonte real" (me cuesta un poco explicarlo)
:arrow: Efectos especiales (cosa que me parece mejor dejar para la fase "detalles")

¿Qué les parece? :)
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: Proyecto Funes

Notapor hugoruscitti » Sab Ene 28, 2012 8:59 pm

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

Re: Proyecto Funes

Notapor Mightygaver » Sab Ene 28, 2012 10:03 pm

Mis más sinceras felicitaciones!

Has conseguido que el efecto sea totalmente fluido y realmente da la impresión de ser un mundo 3D.

Gracias por compartir el código, a ver si puedo estudiar el mecanismo de reescalado que utilizas para dar esa impresión.

De nuevo felicitaciones, me ha gustado muchísimo el efecto!
Mightygaver
 
Mensajes: 69
Registrado: Vie Ago 27, 2010 5:46 pm
Ubicación: Vila-real, España

Re: Proyecto Funes

Notapor Barajas » Jue Feb 02, 2012 1:09 am

Muchas gracias a todos :)

He avanzado un poco en el proyecto. He terminado el efecto de "Horizonte real"; creo que merece la pena :). Pueden probarlo en el adjunto (es básicamente lo mismo de arriba, solo que se modifica al archivo motor, unas imágenes del horizonte y se añade el ejemplo 3 )

http://db.tt/BKAMplzs

No creo poder implementar a tiempo lo de los sprites 2.5d, ya que, imaginen una secuencia del personaje caminando serian 8 frames. Ahora bien, para formar el efecto 2.5d se necesitan vistas de cada frame de animación en aumentos de 20 grados para que sea algo mas fluido, lo que implica utilizar para la animación del personaje caminando ¡¡¡la cantidad de 144 frames!!!; si bien, se pueden utilizar aumentos de 45 grados lo que reduce la cantidad de frames a 64, pero es mas brusco el cambio. Y por cuestiones de tiempo para el concurso y que el segundo método no me deja completamente satisfecho, he decidido dejar esa parte de lado.


De momento aun estoy trabajando en la gestión de items; Aquí un pequeño boceto de como seria la interfaz de usuario (tengo la idea de que los items estén en un tipo cola circular). Creo que para el fin de semana, ya estará, y podría comenzar a trabajar enteramente en el juego. ¿A propósito, para que día de marzo se cierra? XD
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: Proyecto Funes

Notapor hugoruscitti » Vie Feb 03, 2012 2:20 am

Barajas escribió:Muchas gracias a todos :)

He avanzado un poco en el proyecto. He terminado el efecto de "Horizonte real"; creo que merece la pena :). Pueden probarlo en el adjunto (es básicamente lo mismo de arriba, solo que se modifica al archivo motor, unas imágenes del horizonte y se añade el ejemplo 3 )


muuuuy bueno, recién lo estoy mirando

Barajas escribió:¿A propósito, para que día de marzo se cierra? XD


¿El concurso?, cierra el 6 de abril:

http://concurso.ep.io/acerca
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Re: Proyecto Funes

Notapor MrBB4 » Vie Feb 03, 2012 10:07 pm

Barajas escribió:... he decidido dejar esa parte de lado.

Y porqué no los haces con una animación infinita como todos los clasicos? o dos si quieres. Por lo menos para que hayan personajes ademas de uno mismo. Sería más simpatico creo.

Por cierto, muy buen trabajo. Espero saber más de tu proyecto.
Suerte en todo.
Avatar de Usuario
MrBB4
 
Mensajes: 49
Registrado: Mar Dic 14, 2010 11:39 pm
Ubicación: Purto Madryn, Chubut, Argentina.

Re: Proyecto Funes

Notapor kiketom » Mar Feb 07, 2012 4:32 pm

Me parece buenísima la implementación que estás haciendo.

Mírate este gran clásico de 1992 que tantas noches jugué (Catacomb Abyss), por si te sive de inspiración para algo.
Verás que también tenia paredes animadas cuando se quemaban ;)



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

Re: Proyecto Funes

Notapor Barajas » Mié Feb 08, 2012 3:51 am

Muchas gracias a todos. (ha sido una semana muy agitada...)

MrBB4 escribió:Y porqué no los haces con una animación infinita como todos los clasicos? o dos si quieres.


Sinceramente, no entiendo a que te refieres exactamente :oops: me gustaría mucho que me explicaras :)

kiketom escribió:Mírate este gran clásico de 1992 que tantas noches jugué (Catacomb Abyss), por si te sive de inspiración para algo.
Verás que también tenia paredes animadas cuando se quemaban ;)


Muy bueno, en un principio pensé que eran sprites hasta que me percate que tenían "volumen" XD. Ya veré si lo agrego, me párese muy bueno :)

Aquí esta el avances y como prometí, incluye gestión de ítems:
http://db.tt/SnstRC26
Como podrán ver en la imagen; Ya hay una barra de vida y existe la gestión de ítems. Entre lo mas destacable , son los ítems condicionales que solo se pueden utilizar si hay otro (no puedes disparar sin balas, y no puedes usar las balas solas).

Con las tecla "A" se recorren los items hacia la izquierda, con la tecla "S" se recorren a la derecha, y finalmente, con "X" se utiliza el ítem activo. La forma de mover sigue siendo igual :); se aceptan propuestas para las teclas...

Ahora estoy afinando la inteligencia artificial de los enemigos. (creo que puse 2, pero lo mas que hacen es rebotar...).

Eso seria todo, nuevamente gracias :)
Como siempre, criticas y sugerencias
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: Proyecto Funes

Notapor kaiser » Mié Feb 08, 2012 8:52 am

Hola Barajas! Da gusto ver como poco a poco tu proyecto va avanzando y mejorando, la verdad es que tiene una pinta muy interesante. El único fallo que he visto por ahora es que si intentas cambiar de ítem cuando no tienes ninguno el array tira un error de "índice fuera de rango" y se cierra, por suerte fácil de solucionar :wink:

Dado que la decoración de los mapas es muy repetitiva y tienen una forma muy laberíntica estaría bien que implementases un minimapa que ayude a orientarse un poco.

En cuanto a la IA creo que lo mejor sería que echases un vistazo al algoritmo A* /a star/ de pathfinding, podrías hacer que los enemigos se muevan aleatoriamente por el mapa y que te disparen cuando te vean.

Creo que tal y como tienes implementados los mapas (en forma de arrays donde cada carácter representa un tipo de casilla) debería ser bastante sencillo implementar tanto el minimapa como el A*.

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: Proyecto Funes

Notapor hechelion » Jue Feb 09, 2012 12:13 am

Se ve impresionante como va avanzando el proyecto, felicitaciones.

¿Por cierto. que se necesita para ejecutarlo?
¿Python 2.6 y Pygames?
Avatar de Usuario
hechelion
 
Mensajes: 29
Registrado: Vie Ene 13, 2012 3:06 pm
Ubicación: Houston

Re: Proyecto Funes

Notapor MrBB4 » Jue Feb 09, 2012 1:48 am

Barajas escribió:
MrBB4 escribió:Y porqué no los haces con una animación infinita como todos los clasicos? o dos si quieres.


Sinceramente, no entiendo a que te refieres exactamente :oops: me gustaría mucho que me explicaras :)


Con Mucho gusto. Me refería a que los enemigos del juego simplemente tuvieran una sola y constante animación. Da la impreción de que siempre te están mirando, pero no importa, por lo menos hay enemigos y están animados :mrgreen:

Veo que va quedando muy bien. Felicitaciones ;)
Avatar de Usuario
MrBB4
 
Mensajes: 49
Registrado: Mar Dic 14, 2010 11:39 pm
Ubicación: Purto Madryn, Chubut, Argentina.

Re: Proyecto Funes

Notapor Barajas » Jue Feb 09, 2012 4:33 pm

Muchas gracias :)

kaiser escribió:Dado que la decoración de los mapas es muy repetitiva y tienen una forma muy laberíntica estaría bien que implementases un minimapa que ayude a orientarse un poco.

En cuanto a la IA creo que lo mejor sería que echases un vistazo al algoritmo A* /a star/ de pathfinding, podrías hacer que los enemigos se muevan aleatoriamente por el mapa y que te disparen cuando te vean.

Creo que tal y como tienes implementados los mapas (en forma de arrays donde cada carácter representa un tipo de casilla) debería ser bastante sencillo implementar tanto el minimapa como el A*.


Lo del minimapa probablemente lo dejare hasta la fase de detalles :oops: ; Ya que ahora, precisamente estoy adaptando el A* y pensando en como deben de actuar los enemigos (sinceramente para mi tiene mas prioridad terminar con esto y después el minimapa, aun que por el momento puedo incluir una especie de brújula de manera relativamente fácil :) )

hechelion escribió:Se ve impresionante como va avanzando el proyecto, felicitaciones.

¿Por cierto. que se necesita para ejecutarlo?
¿Python 2.6 y Pygames?


Si, esas son las únicas dependencias :)

MrBB4 escribió: Da la impreción de que siempre te están mirando, pero no importa, por lo menos hay enemigos y están animados :mrgreen:

Veo que va quedando muy bien. Felicitaciones ;)


Gracias :)

Bueno. Tal vez para el fin de semana, nuevamente avance, ahora, las prioridades son:

:arrow: Adaptar el algoritmo A* al juego y los enemigos
:arrow: Mejorar las texturas y meter una brújula de momento

Y las que me estoy planteando seriamente:

:arrow: Crear un editor de niveles (es un martirio hacer un mapa a mano y manipular de esa forma un array de 20x20 y eso que es "pequeño")
:arrow: Mejorar las colisiones de los enemigos con los muros (si se han dado cuenta, hay ocasiones en que los enemigos parece que están con una parte dentro de las paredes....)

Terminadas estas cosas, podría comenzar a hacer el diseño de niveles 8) , lo cual, espero no me tome mas de una semana y media, dos a lo mucho :roll: ...


Eso seria todo, por el momento, gracias por su opinión :)
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: Proyecto Funes

Notapor Barajas » Dom Mar 25, 2012 12:23 am

Hola, ha pasado un largo rato desde la ultima vez que mostré algún avance, he estado implementando una larga serie de mejoras, incluyendo una mejoras de procesamiento ( se siente todo mas "fluido" :) )

El viernes de la próxima semana mostrare una versión "preliminar" del juego, no con todos los niveles, pero si jugable... :)
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: Proyecto Funes

Notapor Barajas » Mié Abr 04, 2012 9:26 am

Han sido unos diez días muy agitados jeje, aun estoy corrigiendo una serie de pequeños bugs con el pathfinder, agregando sonidos y terminando niveles.

Lo tendré mañana, pero no esperen la gran cosa :roll:, pero de que sera jugable, lo sera XD.

De momento dejo unas cuantas capturas de pantalla.
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: Proyecto Funes

Notapor hugoruscitti » Mié Abr 04, 2012 1:38 pm

ah.... se ve muy bueno!
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Re: Proyecto Funes

Notapor Barajas » Vie Abr 06, 2012 10:12 am

Aquí esta el primer fruto del proyecto Funes, les presento Laberinto ver. 0.5

Pantallazo.png

Cosas oscuras se mueven bajo las sombras
Código fuente: http://db.tt/HOtc0UxY
Requisitos:
Python 2.X
Pygame
y preferentemente 1Gb de ram (al menos es lo que tengo XD )
(también seria preferente Linux, pero de momento estoy trabajando en ejecutables independientes para Windows :) )

De momento solo tiene 3 niveles, jeje pero se pueden editar con Tiled y crear nuevos, solo con la condición de que tengan el mismo ancho y alto (sí, no tengo ni la menor idea de lo que he hecho XD XD XD )...
Pantallazo2.png


El objetivo del juego es simple, hay que recorrer el laberinto esquivando a todos los monstruos que se puedan y llegar vivo a la puerta (que no es mas que un bloque dorado).
tex_8.png


Pueden de hecho también probar "abir" otros bloques inusuales como las pinturas o las cataratas.

Sé que se puede mejorar y mucho en todos los aspectos. Si hay dudas, sugerencia u otras cosas, solo pregunten o diganlo :)

P.D. Lo hubiera subido ayer pero no pude hacerlo :roll:
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am


Volver a Videojuegos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados

cron