Subscribe RSS Join our Facebook Group Follow us on Twitter!
in Search

Samsu's passion (.NET)

Blog mengenai kegiatan sebagai MSP, MIC, dan juga penyuka teknologi Microsoft

XNA dan Kinect

XNA seperti yang telah dibahas pada post sebelumnya, merupakan framework yang disediakan Microsoft untuk mempermudah proses pembuatan game. Nah, pada kesempatan ini saya mencoba membuat suatu game sederhana menggunakan XNA dan Kinect yang saya berinama StartDance yang terinspirasi dari DDR. Program ini dapat mendeteksi posisi manusia dan gesture seperti melambaikan tangan.

Keunggulan dari game ini tentunya karena tidak diperlukan dance-pad seperti pada gambar di bawah ini, karena dengan Kinect kita dapat mengetahui posisi pemain secara akurat dalam sistem koordinat nyata. Seperti yang dijelaskan pada post sebelumnya, kali ini pun akan digunakan library OpenNI.  Namun kita akan menggunakan versi managed library dari openNI, yaitu library yang telah membungkus fungsi-fungsi yang aslinya dalam bahasa C/C++ ke dalam interface yang dapat diakses dengan managed language seperti C#.

Untuk setting awal project XNA dapat melihat penjelasan dari post saya sebelumnya. Pada project ini kita akan memiliki struktur program sebagai berikut :

image

tt

 

 

 

 

 

 

Untuk mempermudah pengembangan, maka program dikembangkan dengan pendekatan OOP sehingga terdapat beberapa kelas :

  • MusicManager : mengatur segala hal yang berhubungan dengan musik
  • Player : instansiasi dari kelas Player, terdapat posisi dan skor
  • PlayerManager: mengelola player-player yang ada (karena program dibuat agar jumlah pemain dapat flexible, sekalipun hanya 1-2 pemain), sekaligus menangani hubungan dengan Kinect
  • StepManager: kelas yang mengatur pengacakan melodi dan pengaturan gerakan yang akan dimainkan
  • StartDance : kelas utama yang menjadi “main” program yang akan diinstansiasi pertama-tama oleh program.cs

Pembahasan utama berada pada kelas PlayerManager yang menjelaskan cara mengambil data dari Kinect dan menggunakan library openNI.net. Namun, pada kode program yang dapat diunduh secara cuma-cuma di bagian akhir program, teman-teman dapat mempelajari cara meload dan memutar lagu pada XNA atau penggunaan thread untuk mengintegrasikan not-not yang terus bergerak turun dengan thread UI dan thread player. Jika ada kesulitan silakan PM tentunya bing-ing atau googling dulu yah!

Berikut adalah kode PlayerManager.cs :

   1: using System;
   2: using System.Collections.Generic;
   3: using Microsoft.Xna.Framework;
   4: using Microsoft.Xna.Framework.Graphics;
   5: using xn;
   6:  
   7: namespace StartDance
   8: {
   9:     /// <summary>
  10:     /// This is a game component that implements IUpdateable.
  11:     /// </summary>
  12:     public class PlayerManager : Microsoft.Xna.Framework.GameComponent
  13:     {
  14:         Game thisgame;
  15:         Context context;
  16:         UserGenerator userGenerator;
  17:         GestureGenerator gestureGenerator;
  18:         Delegate gestureHandler;
  19:         public List<Player> playerList;
  20:  
  21:         public PlayerManager(Game game, Delegate _gestureHandler)
  22:             : base(game)
  23:         {
  24:             thisgame = game;
  25:             gestureHandler = _gestureHandler;
  26:             try
  27:             {
  28:                 context = new Context("openni.xml");
  29:                 userGenerator = new UserGenerator(context);
  30:                 userGenerator.NewUser += new UserGenerator.NewUserHandler(userGenerator_NewUser);
  31:                 userGenerator.LostUser += new UserGenerator.LostUserHandler(userGenerator_LostUser);
  32:                 gestureGenerator = new GestureGenerator(context);
  33:                 gestureGenerator.AddGesture("Wave");
  34:                 gestureGenerator.GestureRecognized += new GestureGenerator.GestureRecognizedHandler(
  35:                         gestureGenerator_GestureRecognized);
  36:                 context.StartGeneratingAll();
  37:                 
  38:                 playerList = new List<Player>();
  39:                 Initialize();
  40:             }
  41:             catch (Exception ex)
  42:             {
  43:                 game.Dispose();
  44:                 game.Exit();
  45:             }
  46:         }
  47:  
  48:         void gestureGenerator_GestureRecognized(ProductionNode node, string strGesture, 
  49:             ref Point3D idPosition, ref Point3D endPosition)
  50:         {
  51:             if (strGesture == "Wave")
  52:             {
  53:                 gestureHandler.DynamicInvoke();
  54:             }
  55:         }
  56:  
  57:         void userGenerator_NewUser(ProductionNode node, uint id)
  58:         {
  59:             Player player = new Player(id);
  60:             playerList.Add(player);
  61:             Console.WriteLine("New User : " + id);
  62:             //throw new NotImplementedException();
  63:         }
  64:  
  65:         void userGenerator_LostUser(ProductionNode node, uint id)
  66:         {
  67:             Player player = playerList.Find(a=>a.uid==id);
  68:             playerList.Remove(player);
  69:             Console.WriteLine("Lost User : " + id);
  70:             //throw new NotImplementedException();
  71:         }
  72:  
  73:         public override void Initialize()
  74:         {
  75:             base.Initialize();
  76:         }
  77:  
  78:         public override void Update(GameTime gameTime)
  79:         {
  80:             // TODO: Add your update code here
  81:             if (context != null)
  82:             {
  83:                 context.WaitNoneUpdateAll();
  84:                 foreach (Player player in playerList)
  85:                 {
  86:                     player.position = userGenerator.GetCoM(player.uid);
  87:                 }
  88:             }
  89:             base.Update(gameTime);
  90:         }
  91:     }
  92: }

Beberapa bagian yang menarik yaitu :

  1. Penggunaan delegate (System.Delegate) untuk menginvoke event handler di kelas lain. (baris 18)
    Pada game ini digunakan untuk menginvoke event ketika terdeteksi gesture wave yang digunakan untuk memulai game. (baris 48-55)
  2. Mengetahui posisi user dengan mengupdate center of mass dari user terkait dan mengupdate context yaitu objek yang menjembatani hubungan ke Kinect (baris 78-92)

Berikut screenshot aplikasi :

tt

Projek ini dapat dicheckout dari svn berikut http://startdance.googlecode.com/svn/trunk/
Prerequisite : Microsoft Kinect

877 Views, 2 Comment(s), Published on: 05-30-2011 0:39 by samsu.sempena to Samsu's passion (.NET)
| More
Filed under: , ,

Comments

 

putraugust said:

Bang, saya jalanan program nya error bang...

katanya "The font family "Forte" could not be found. Please ensure the requested font is installed, and is a TrueType or OpenType font"

May 9, 2013 4:11 AM
 

putraugust said:

StartDAnce_TemporaryKey.pfx juga tanfda seru bang, itu masalahnya kenapa ya bang?

saya mohon banget bimbingannya bang

May 9, 2013 4:18 AM

About samsu.sempena

2007-now Faculty of Informatics, Institute Teknologi Bandung