Google
 

jueves, julio 13, 2006

La evolución tambíen es para los enemigos

A veces se me va la pinza y se me ocurren ideas macabras (macabras para el programador que quiera implementarla por su complejidad).


La locura de hoy estriba en implementar una inteligencia artificial que se adapte al jugador. ¿Qué cómo que se puede hacer eso? Pues ni idea (es el problema de las ideas macabras). Tal vez usando algoritmos genéticos sobre unos cuantos parámetros que decidan el comportamiento del enemigo e ir creando los enemigos
nuevos usando los parámetros de los que más tiempo han sobrevivido, que serán en teoría los mejor adaptados al sistema, es decir, los que han costado más matar.

Creo que podría dar resultados bastante interesantes en juegos tipo Quake porque los enemigos se irían adaptando a la forma de jugar del jugador, lo que le obligaría a adaptarse él también.

lunes, julio 10, 2006

Ogre: Colisiones de rayos

Con el motor 3d Ogre podemos lanzar rayos contra el escenario para averiguar con que objetos colisionan. No nos sirve para colisionar contra el entorno pues los rayos solo "chocan" con la envoltura de los objetos (bounding-box en este caso) así que sólo es una colisión aproximada. Pero es útil, por ejemplo, para poder seleccionar objetos con el ratón:
 1 Ray ray = mCamera->getCameraToViewportRay(mMousePos.x, mMousePos.y);
2
3 RaySceneQuery* rsq = mSceneMgr->createRayQuery(ray);
5 rsq->execute();
6
7 float dist = 50000.0f;
8
9 MovableObject* o = NULL;
10 RaySceneQueryResult& result = rsq->getLastResults();
11 for(RaySceneQueryResult::iterator ri = result.begin(); ri != result.end(); ri++) {
12 RaySceneQueryResultEntry* e = &(*ri);
13
14 if(e->distance <>movable) {
15 dist = e->distance;
16 o = e->movable;
17 }
18 }
19
20 if(o != NULL) {
21 // TODO objeto seleccionado
22 }
23
Esta consulta sólo funciona con mallas, si además queremos también calcular colisiones contra objetos especiales como billboards habrá que añadir:
 4 rsq->setQueryTypeMask(SceneManager::FX_TYPE_MASK);