Desde tempranito, la nueva edición de Gameplay ya está directamente en iTunes y phyne.net.
En esta ocasión hablamos sobre GTA IV: The Lost & Damned, The Dishwasher: Dead Samurai, EGS 2009, comentarios acertados de Cliffy B y desvariamos sobre la incorporación de tecnología 3D en videojuegos.
Por cierto el twitter de James Silva(creador de The Dishwasher: Dead Samurai): @jamezilla
Esparamos sus comentarios y no olviden pasar la voz!!!!
Muchas gracias a todos los que escucharon el primer episodio de Gameplay!!!!
¿Hay algún tema que quieran que tratemos? ¿Alguna tecnología, libro, consola o juego? Déjenos sus comentarios con sus sugerencias dudas o recomendaciones y les prometo que las vamos a tomar en cuenta TODAS.
Lo que me faltó decir es que el podcast será quincenal; cada lunes tendran directamente en la comodidad de sus ordenadores, un nuevo episodio del podcast de videojuegos para jugadores y desarrolladores.
Programar un videojuego es algo muy gratificante. Simplemente con ver una imagen moviéndose y rebotando en la pantalla es emocionante. Ahora, agregárle animación, física e interacción con el usuario(mediante mouse, teclado o control) nos hace sentir muy orgullosos de nuestro trabajo.
El problema es que si algo no sale a la primera o a la segunda o a la tercera, la desesperación llega. Yo me encuentro en esas situaciones muchas veces al día.
Puede ser que las cosas no salgan porque ya estás cansado, porque tu atención está en otro lado, porque la lógica del código esté mal o simplemente porque no conoces todas(o al menos la mayoría) de las capacidades del lenguaje o librerías que estás utilizando.
Por eso, antes de querer empezar a programar un juego(aunque sencillo) en XNA, te recomiendo que revises algún tutorial del lenguaje en el sobre el cual existe XNA, me refiero a C#.
En esta ocasión, quiero recomendarles un tutorial muy completo, el sitio es C# Station
El autor es un MVP de Microsoft, Joe Mayo. El también es autor de libros sobre C# y otras tecnologías. El tutorial comprende 23 capítulos, que si bien no te harán un experto en C#, te darán un overview muy bueno del lenguaje.
El tutorial supone que al menos tienes los fundamentos básicos sobre programación, y específicamente la orientada a objetos.
Una vez terminado el tutorial, puede que estés listo, o con más confianza para entrar de lleno a algún tutorial de XNA.
Hola amiguitos. Pues como lo leen, el podcast número uno de phyne ya está a punto de salir.
Ya tenemos los invitados, los temas, el editor de audio y las secciones…sólo faltan algunos detalles finales. El primer episodio lo grabaremos en el transcurso de la siguiente semana, así que espérenlo muy pronto.
Si tienen alguna sugerencia acerca de algo que les gustaría tratar o saber, déjenla en los comentarios.
Supongo que todos hemos jugado el juego de piedra, papel o tijeras. Bueno por si alguien pasó su infancia en un búnker, puede checarlo aquí: Piedra, papel o tijeras
En este post, vamos a recrear el juego, pero además le agregaremos una interfaz gráfica con botones de radio, un botón normal y una caja de texto.
#Scissors, paper, rock game
#Importamos todo el modulo Tkinter para la interfaz grafica
from Tkinter import *
#importamos el modulo random para generar la eleccion del contrincante del cpu
import random
#Lista que contiene las opciones que tiene el cpu para jugar
WEAPONS = ["scissors", "paper", "rock"]
#Definimos la clase Application donde guardaremos todos los widgets como botones, texto y radiobuttons
#Application hereda de Frame
class Application(Frame):
#Metodo constructor de application
def __init__(self, master):
#Invocamos el consructor de Frame
Frame.__init__(self, master)
#Digamos que muestra el objeto Application en pantalla
self.grid()
#Invocamos el metodo createWidgets(), definido mas abajo
self.createWidgets()
#Metodo que crea los elementos que se colocarán en la ventana raiz
def createWidgets(self):
#Label es un widget que muestra texto, no tiene interacción alguna
Label(self, text = "Pick scissors, paper or rock and then press the fight button"
).grid(row = 0, column = 0, sticky = W)
#Variable que contendra la eleccion del jugador
self.election = StringVar()
#Los botones de radio que presentan las opciones a elegir para el jugador
Radiobutton(self, text = "Scissors", variable = self.election, value = "scissors"
).grid(row = 1, column = 0, sticky = W)
Radiobutton(self, text = "Paper", variable = self.election, value = "paper"
).grid(row = 2, column = 0, sticky = W)
Radiobutton(self, text = "Rock", variable = self.election, value = "rock"
).grid(row = 3, column = 0, sticky = W)
#El boton que activa el inicio del juego, manda a llamar el metodo fight()
Button(self, text = "Fight", bg = "Red", command = self.fight).grid(row = 4, column = 0)
#Creamos la caja de texto en donde se mostrara el resultado del juego, por el momento esta vacio
self.result = Text(self, width = 40, height = 5, wrap = WORD)
self.result.grid(row = 5, column = 0, columnspan = 3)
#Metodo que calcula una eleccion de arma para el cpu y compara para ver quien gana
def fight(self):
#Elige pseudoaleatoriamente un arma para el cpu
self.cpuWeapon = random.choice(WEAPONS)
self.message = ""
if self.election.get() == "rock" and self.cpuWeapon == "scissors":
self.message = "You Win!!!"
elif self.election.get() == "paper" and self.cpuWeapon == "rock":
self.message = "You Win!!!"
elif self.election.get() == "scissors" and self.cpuWeapon == "paper":
self.message = "You Win!!!"
elif self.cpuWeapon == "scissors" and self.election.get() == "paper":
self.message = "You Lose!!!"
elif self.cpuWeapon == "rock" and self.election.get() == "scissors":
self.message = "You Lose!!!"
elif self.cpuWeapon == "paper" and self.election.get() == "rock":
self.message = "You Lose!!!"
else:
self.message = "TIE!!!!"
#Concatenamos el mensaje con las armas de cada uno (cpu/user)
self.message += "\nYour weapon: " + self.election.get() + "\nCPU Weapon: " + self.cpuWeapon
#Borramos lo que hay en el cuadro de texto
self.result.delete(0.0, END)
#Mostramos el mensaje en el cuadro de texto
self.result.insert(0.0, self.message)
#main
#Instanciamos un objeto Tk() en donde se colocaran los demas widgets
root = Tk()
#Le damos el nombre a nuestra GUI
root.title("Scissors, paper, rock")
#Se le asigna un tamaño como string en formato anchoxalto
root.geometry("350x250")
#instanciamos un objeto Application y le mandamos como maestro al objeto root
app = Application(root)
#el ciclo principal de la aplicacion
root.mainloop()
La idea del programa, viene de un proyecto del libro Guide to Programming with Python, de Michael Dawson. Próximamente haré un post sobre el libro.
Existe un algoritmo que se utiliza para encontrar el número máximo y el mínimo dentro de un arreglo de números (o de otros objetos, dependiendo del programa), es el algoritmo MAXMIN.
El algoritmo sirve para un número n(en potencia de dos) de elementos. Después de encontrar el máximo y el mínimo en el arreglo, guarda el valor máximo en la posición [0] y el mínimo en la posición[1] de un arreglo[2].
El algoritmo es recursivo, en el caso base(cuando n es dos) solamente compara los valores y los coloca en en las casillas correspondientes del arreglo[2].
En el caso recursivo, el arreglo se va partiendo en mitades, de 0 a (n/2)-1 y otro de n/2 a n-1. Así hasta llegar al caso base.
Aquí se presenta el código en lenguaje C.
/*
* Author: Arturo Nereu Nunez Martinez 1163145
*
* Version: Febrero 2008
*
* Programa que ejecuta el algoritmo MAXMIN, con una entrada de maximo 32 numeros.
* La entrada debe ser potencia de dos.
*/
#include <stdio.h>
void maxMin(int *arr, int *arrMaxMin, int n){
if(n == 2){
if(arr[0] > arr[1]){
arrMaxMin[0] = arr[0];
arrMaxMin[1] = arr[1];
} else{
arrMaxMin[0] = arr[1];
arrMaxMin[1] = arr[0];
}
}
if(n >= 4){
int i = 0;
int lim = n/2;
int maxMinA[2];
int maxMinB[2];
int arrTempA[lim];
for(i; i<lim; i++){
arrTempA[i] = arr[i];
}
int arrTempB[lim];
i = 0;
for(i; i< lim; i++){
arrTempB[i] = arr[lim+i];
}
maxMin(arrTempA, maxMinA, lim);
maxMin(arrTempB, maxMinB, lim);
if(maxMinA[0] >= maxMinB[0]){
arrMaxMin[0] = maxMinA[0];
} else{
arrMaxMin[0] = maxMinB[0];
}
if(maxMinA[1] <= maxMinB[1]){
arrMaxMin[1] = maxMinA[1];
} else{
arrMaxMin[1] = maxMinB[1];
}
}
}
void pideDatos(int *X, int n){
int *x, i=0;
x = X+n;
for(; X<x; ++X) {
printf("Dame el dato [%i]:",i++);
scanf("%i",X);
}
}
int main (void){
int tamArr = 0;
int arrMaxMin[2];
int *ptrArrMaxMin = &arrMaxMin[0];
printf("Dame el numero en potencias de dos, para el tamaño del arreglo: ");
scanf("%i", &tamArr);
int arrGeneral[tamArr];
pideDatos(arrGeneral, tamArr);
maxMin(arrGeneral, ptrArrMaxMin, tamArr);
printf("El max: %i, y el min: %i \n", arrMaxMin[0], arrMaxMin[1]);
return 0;
}
Probablemente no esté bien refactorizado, pero el ejemplo del algoritmo es funcional.
En este tutorial, vamos a instalar el entorno de desarrollo de python para comenzar a programar juegos con ayuda del conjunto de módulos para gráficos y juegos; pygame.
Al igual que todo lo que se hace en python, la instalación es muy sencilla. Primero debes de ir al sitio oficial de python para obtener el entorno de desarrollo y la versión más estable y con mayor compatibilidad que hasta ahora es la 2.6.2. Te recomiendo que bajes esa versión para tu sistema operativo.
Windows: Ya que tienes ambos ejecutables, sólo debes de hacer doble click en el instalador de python. Después de que termine la instalación, dále doble click al instalador de pygame.
Cuando ambos archivos estén instalados, abre el programa llamado ‘IDLE (Python GUI)’. Esto abre el entorno de desarrollo de python en modo interactivo.
Para probar que tu instalación fue correcta, escribe dentro de la ventana: print “Hola python”
print "Hola python"
Deberá de salir una linea después el mensaje; Hola python. Si es así, la instalación de python fue correcta. Ahora para probar la instalación correcta de pygame, escribe: import pygame
import pygame
Si te sale el mensaje:
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
import pygame
ImportError: No module named pygame
Algo salió mal y será necesaria la reinstalación de pygame, en caso contrario: ¡Has instalado lo necesario para poder crear tu propio videojuego en python!
En la actual generación de consolas, el Nintendo Wii fue el primero en implementar contrapartes virtuales para sus usuarios. Después Xbox 360 mediante una actualización al dashboard de la consola, trajo los Avatares, los cuales son la respuesta directa los Miis de Nintendo.
El original o el copión, ¿cuál de ambas compañías logró hacer de su aplicación la mejor?
Los Miis son extremadamente configurables, de hecho hay Miis generados por usuarios que van desde Yoda hasta el presidente Calderón. Por parte de Xbox 360, los personajes son menos personalizables y puede que alguien por más que lo intente no logré que su contraparte virtual quede parecida.
En cuanto a su utilidad, parece que ninguno tiene gran relevancia, en Xbox, sirven como un elemento del perfil del jugador, en el Wii, son indepedientes del jugador. En ambos casos se pueden utilizar los personajes en algunos juegos, pero en realidad su aportación es muy poca. De hecho los Miis en juegos como Mario Kart Wii desentonan. En ambos casos hay juegos que los utilizan al 100%, Wii Sports para los Miis y 1 vs. 100 para los Avatars.
En el Wii hay un canal exclusivo para los Miis, donde puedes manipular y configurar tus personajes, así como conectarte a la red wi-fi de Nintendo y descargar las obras de otros miembros de la comunidad. También, se organizan concursos donde se les da un tema o personaje y los usuarios deben de crear un Mii que encaje con la descripción, luego otros miembros de la comunidad votan para elegir un ganador.
Yo tengo un favorito y no por la utilidad del juego sino por cómo me veo de manera virtual.
Yo no sabía de la existencia de Dead Space, pero en recientes fechas me enteré de su existencia. Me dediqué a buscar información del juego y me decidí a probarlo. Honestamente el juego es malo, pero no lo reseñaré, sino que quiero prestar atención en un punto que probablemente hubiera cambiado la mecánica del juego.
La física, dentro del mundo del juego, parece formar una parte primordial (de hecho hay un poder para manipular objetos, kinesis) en el gameplay, pero la verdad es que se siente vacía. Mover cajas, cuerpos, y algunas estructuras no se siente gratificante, el sonido y la vibración del control no ayudan.
El problema es que en juegos como Half Life 2 o Star Wars the Force Unleashed, la manipulación de objetos mediante un aparato o poder se siente muy bien, incluso uno puede pasar horas moviendo objetos, aventándolos y viendo cómo colisionan con otras cosas.
En Dead Space usar la kinesis se siente acartonado, uno no siente en verdad que está moviendo algo, más bien se siente como una animación prefabricada.
Yo creo que se debe a tres partes:
1) Los valores del motor del juego(Godfather engine): probablemente no estén bien ajustados y por eso se siente así.
2) El sonido: Al momento de manipular objetos, el sonido no reacciona con lo que pasa en pantalla, no es tan estruendoso.
3) La vibración del control: En el caso del Xbox 360, los motores del control no parecen ajustados como para hacer sentir al jugador que en verdad está manipulando un objeto mediante la gravedad.
Probablemente no hagamos juegos AAA todavía, pero es importante como desarrolladores de juegos el analizar lo que juguemos para saber qué tipo de videojuegos no queremos hacer o mejor aún; no meter la pata en un elemento tan importante como la física de un juego.