Programmer's Diary

Sebuah diary mahasiswa Teknik Informatika.

Archive for the ‘XNA’ Category

MultiPoint pada XNA

Posted by Alexander Rahardjo on February 15, 2011

MultiPoint merupakan sebuah teknologi yang memungkinkan banyak tetikus (mouse) terhubung dalam sebuah komputer. Teknologi MultiPoint memungkinkan beberapa pengguna mengakses satu komputer secara bersama-sama. Microsoft sendiri telah mengembangkan teknologi ini pada Windows Presentation Foundation (WPF) melalui MultiPoint Mouse SDK. Namun pada kenyataannya MultiPoint tidak hanya dapat diterapkan pada WPF namun dapat diterapkan pada platform lain, salah satunya yaitu XNA yang tentu saja tidak menggunakan SDK dari Microsoft.

Pada kesempatan kali ini, saya akan memperkenalkan sebuah teknologi MultiPoint yang dikembangkan pada XNA dan library yang digunakan adalah MultiInput. Tentu saja dengan adanya teknologi ini memungkinkan kita untuk mengembangkan sebuah permainan yang menarik dan interaktif karena XNA merupakan sebuah teknologi untuk pengembangan permainan yang dibuat oleh Microsoft.

Namun sayangnya berdasarkan uji coba yang telah saya lakukan, library ini masih terdapat kekurangan khususnya apabila dijalankan pada Sistem Operasi Windows 7. Library ini tidak dapat mendeteksi jumlah tetikus yang terhubung dengan komputer secara tepat.

Berikut adalah langkah-langkah untuk membuat sebuah project MultiPoint pada XNA:

1. Buat sebuah project XNA

2. Unduh library MultiInput di sini

3. Kemudian masukkan kode berikut pada project anda:


using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;
using Engine.GameState;
using Engine.GameLogic;

namespace EducationGames
{
    /// <summary>
    /// This is the main type for your game
    /// </summary>
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        StateManager manager;

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            graphics.PreferredBackBufferWidth = 800;
            graphics.PreferredBackBufferHeight = 600;
            this.Window.Title = "Akademia";
            StageMultipoint.WindowHandle = this.Window;

            //fullscreen
            //graphics.ToggleFullScreen();
            Content.RootDirectory = "Content";
        }

        /// <summary>
        /// Allows the game to perform any initialization it needs to before starting to run.
        /// This is where it can query for any required services and load any non-graphic
        /// related content.  Calling base.Initialize will enumerate through any components
        /// and initialize them as well.
        /// </summary>
        protected override void Initialize()
        {
            // TODO: Add your initialization logic here

            base.Initialize();
        }

        /// <summary>
        /// LoadContent will be called once per game and is the place to load
        /// all of your content.
        /// </summary>
        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);
            
            // TODO: use this.Content to load your game content here
            manager = new StateManager(this);
        }

        /// <summary>
        /// UnloadContent will be called once per game and is the place to unload
        /// all content.
        /// </summary>
        protected override void UnloadContent()
        {
            // TODO: Unload any non ContentManager content here
        }

        /// <summary>
        /// Allows the game to run logic such as updating the world,
        /// checking for collisions, gathering input, and playing audio.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Update(GameTime gameTime)
        {
            // Allows the game to exit
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();

            // TODO: Add your update logic here

            manager.Update(gameTime);

            //hidden mouse for temporary
            Mouse.SetPosition(graphics.GraphicsDevice.Viewport.Width / 2, graphics.GraphicsDevice.Viewport.Height / 2);

            base.Update(gameTime);
        }

        /// <summary>
        /// This is called when the game should draw itself.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Draw(GameTime gameTime)
        {
            //GraphicsDevice.Clear(Color.CornflowerBlue);
            GraphicsDevice.Clear(Color.WhiteSmoke);

            // TODO: Add your drawing code here
            manager.Draw(gameTime);

            base.Draw(gameTime);
        }
    }
}


4. Hasil run dari project ini adalah sebagai berikut:

image

Selamat mencoba dan semoga bermanfaat Smile

Advertisements

Posted in Microsoft, Tutorial, XNA | Tagged: , , , , , , | Leave a Comment »

Akademia–Game Edukasi Petualangan Matematika dan Fisika

Posted by Alexander Rahardjo on December 6, 2010

home1

Ade sedang berjalan mengelilingi taman di hari Senin pagi. Tidak ingin terlambat mengikuti upacara, Ade bergegas menuju ke area sekolah. Jam hampir menunjukkan pukul 07.00 dan akhirnya Ade tiba di halaman sekolah tepat pada waktunya. Selama kurang lebih 1 jam, Ade mengikuti upacara bendera dengan khidmat dan tibalah waktunya masuk ke gedung sekolah. Ade berjalan menyusuri koridor sekolah dan akhirnya masuk ke kelas Bahasa Inggris. Guru Bahasa Inggris telah siap di depan papan tulis dan memberikan ujian mengenai vocabulary kepada Ade . Itulah sekilas ilustrasi pada game AKADEMIA ini.

 

AKADEMIA merupakan sebuah eduGame bertema petualangan dengan matematika dan fisika yang ditujukan bagi anak-anak seusia tamanNightminimal SMP atau yang sederajat. AKADEMIA dimainkan oleh seorang pemain dimana pemain tersebut dapat memilih karakter laki-laki atau perempuan pada awal permainan. Permainan ini bertujuan untuk membuat pemain agar dapat belajar matematika dan fisika secara tidak langsung melalui misi-misi yang ada pada permainan ini. Setiap menyelesaikan sebuah misi maka pemain akan mendapatkan sebuah medali sesuai dengan nilai yang mereka capai. Konten pembelajaran dalam permainan AKADEMIA ini sangat atraktif dan aplikatif karena dengan menyelesaikan misi-misi tersebut secara tidak langsung pemain dapat belajar matematika dan fisika dan hal ini merupakan bentuk pembelajaran yang inovatif dan lain dari biasanya. Permainan AKADEMIA didukung dengan tampilan yang sangat menarik karena menggunakan tampilan secaraisometric dan dilengkapi pula dengan desain yang intuitif dan cocok bagi anak-anak seusia minimal SMP atau yang sederajat. Selain membantu dalam meningkatkan keefektifan belajar matematika dan fisika dengan konten yang menarik, permainan AKADEMIA juga mendukung adanya proses belajar secara kolaboratif. Dalam beberapa misi pada AKADEMIA, pemain dapat mengajak 1 hingga 5 orang temannya untuk bermain bersama menyelesaikan misi tersebut dalam sebuah komputer cukup hanya dengan menambahkan sebuah tetikus(mouse) untuk setiap pemainnya. Fitur ini akan menuntut pemain untuk saling berkolaborasi dengan teman-temannya dan tentunya permainan akan semakin terasa menyenangkan dan bermanfaat.

Permainan AKADEMIA sangat menghibur dan mengandung unsur-unsur pendidikan yang lengkap mulai dari ilmu yang terkandung dalam permainan yaitu matematika dan fisika secara utama, dilengkapi pula dengan pembelajaran bahasa inggris mengenai istilah fisika serta matematika yang aplikatif, pelajaran peta buta juga terdapat dalam permainan ini. sekolahNamun tidak hanya itu, terdapat pula unsur-unsur pendidikan lainnya yang juga merupakan aspek penting bagi perkembangan anak-anak khususnya seusia siswa SLTP atau yang sederajat, yaitu: unsur kompetitif dan kolaboratif yang hingga kini masih jarang ditanamkan di bangku sekolah yang cenderung mengusung semangat kompetitif. Secara keseluruhan, AKADEMIA memiliki 8 misi yang menantang.mathShooting

Spesifikasi Game

Judul : AKADEMIA
Genre : Role Playing Game
Tema : Education, Simulation

akademia

Tim Pengembang

Programmer : Alexander Rahardjo – Jeffrey Hermanto Halimsetiawan
Desainer : Royce Suryo Prabowo
Contact : enlight[dot]games[at]gmail[dot]com, akademia@facebook

enlightgamestudiologosmall

Artikel lain yang memuat tentang Akademia bisa dilihat pada gameedukasi.com

Posted in Competition, Project, XNA | Tagged: , , , , , , , , , | Leave a Comment »

Tutorial XNA Project Menggunakan Farseer Physic Engine

Posted by Alexander Rahardjo on April 21, 2010

Farseer Physic Engine merupakan engine fisika yang open source untuk .NET.
Pada tutorial kali ini kita akan mencoba membuat contoh implementasi dari sebuah kotak dan lingkaran. Kotak dan lingkaran tersebut dapat digerakkan dan bertabrakan satu sama lain.

Program yang diperlukan (yang digunakan dalam tutorial ini) :

–          Microsoft Visual Studio 2008 SP 1

–          XNAGS 31

Packages atau project yang dibutuhkan :

–          Farseer Physics 2.1.3 XNA

–          DemoBaseXNA

Langkah-langkah :

Buat project baru XNA Game Studio 3.1 -> Windows Game 3.1

Add Packages Farseer Physics 2.1.3 XNA & DemoBaseXNA

Add Reference Farseer Physics 2.1.3 XNA & DemoBaseXNA

Buat Class yang diturunkan dari class DemoBaseXNA.ScreenSystem.GameScreen

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DemoBaseXNA;
using DemoBaseXNA.DrawingSystem;
using DemoBaseXNA.ScreenSystem;
using FarseerGames.FarseerPhysics;
using FarseerGames.FarseerPhysics.Dynamics;
using FarseerGames.FarseerPhysics.Factories;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;

namespace WindowsGame2.Contoh1
{
    class contoh1:GameScreen
    {
        //inisialisasi awal gamescreen
        public override void Initialize()
        {
        }

        //load object, digunakan untuk load lingkaran dan kotak
        public override void LoadContent()
        {
        }

        //digunakan untuk menggambar objek ke layar
        public override void Draw(GameTime gameTime)
        {
        }

        //handle input state dari gamescreen
        public override void HandleInput(InputState input)
        {
        }

        //handle input dari keyboard
        private void HandleKeyboardInput(InputState input)
        {
        }
        //text detail saat dilayar pause
        private static string GetDetails()
        {
        }
    }
}

Inisialisasi Class GameScreen

public override void Initialize()
        {
            //inisialisasi physic simulator
            PhysicsSimulator = new PhysicsSimulator(new Vector2(0, 0));
            //add physic simulator ke view
            PhysicsSimulatorView = new hysicsSimulatorView(PhysicsSimulator);

            base.Initialize();
        }

Load objek gambar geometry yang akan diload

public override void LoadContent()
        {
            //membuat brush untuk draw lingkaran
            //radius, fill color, border color
            _circleBrush = new CircleBrush(64, Color.White, Color.Black);
            _circleBrush.Load(ScreenManager.GraphicsDevice);

            //membuat body dari lingkaran untuk simulasi gaya dan impuls
            //radius, masa
            _circleBody = BodyFactory.Instance.CreateCircleBody(PhysicsSimulator, 64, 1);
            _circleBody.Position = new Vector2(500, 384);

            //mmebuat geometri untuk deteksi tabrakan dari lingkaran
            //body, radius, jumlah edge/garis
            GeomFactory.Instance.CreateCircleGeom(PhysicsSimulator, _circleBody, 64, 20);

            //membuat body kotak untuk simulasi gaya dan impuls
            //width, height, mass
            _rectangleBody = BodyFactory.Instance.CreateRectangleBody(PhysicsSimulator, 128, 128, 1);
            _rectangleBody.Position = new Vector2(256, 384);

            //membuat geometri untuk deteksi tabrakan dari kotak
            //width, height
            GeomFactory.Instance.CreateRectangleGeom(PhysicsSimulator, _rectangleBody, 128, 128);

            //membuat brush untuk draw kotak
            //width, height, fill color, border color
            _rectangleBrush = new RectangleBrush(128, 128, Color.Gold, Color.Black);
            _rectangleBrush.Load(ScreenManager.GraphicsDevice);

            base.LoadContent();
        }

Draw brush model sesuai dengan bodynya

public override void Draw(GameTime gameTime)
        {
            //memulai proses drawing pada SpriteBatch
            ScreenManager.SpriteBatch.Begin(SpriteBlendMode.AlphaBlend);

            //menggambar brush lingkaran sesuai dengan body lingkaran
            _circleBrush.Draw(ScreenManager.SpriteBatch, _circleBody.Position);

            //menggambar brush kotak sesuai dengan body kotak
            _rectangleBrush.Draw(ScreenManager.SpriteBatch, _rectangleBody.Position, _rectangleBody.Rotation);

            //menutup SpriteBatch
            ScreenManager.SpriteBatch.End();

            base.Draw(gameTime);
        }

Mengatur handle input

public override void HandleInput(InputState input)
        {
            //jika gamescreen pertama kali dijalankan
            if (firstRun)
            {
                //tambah pause screen ke screen manager
                ScreenManager.AddScreen(new PauseScreen(GetTitle(), GetDetails()));
                firstRun = false;
            }

            //jika screen dalam keadaan pause/ berhentei sejenak
            if (input.PauseGame)
            {
                ScreenManager.AddScreen(new PauseScreen(GetTitle(), GetDetails()));
            }

            //handle input keyboard
            HandleKeyboardInput(input);
            base.HandleInput(input);
        }

        private void HandleKeyboardInput(InputState input)
        {
            //set besarnya penambahan gaya jika user menekan A/S/D/W
            const float forceAmount = 50;

            //set gaya awal sebesar 0/ diam
            Vector2 force = Vector2.Zero;

            //set Y negatif/ ke bawah
            force.Y = -force.Y;

            //user menekan tombol A
            if (input.CurrentKeyboardState.IsKeyDown(Keys.A)) { force += new Vector2(-forceAmount, 0); }
            //user menekan tombol S
            if (input.CurrentKeyboardState.IsKeyDown(Keys.S)) { force += new Vector2(0, forceAmount); }
            //user menekan tombol D
            if (input.CurrentKeyboardState.IsKeyDown(Keys.D)) { force += new Vector2(forceAmount, 0); }
            //user menekan tombol W
            if (input.CurrentKeyboardState.IsKeyDown(Keys.W)) { force += new Vector2(0, -forceAmount); }

            //berikan gaya pada body kotak
            _rectangleBody.ApplyForce(force);

            //set besarnya pertambahan torsi pada kotak
            const float torqueAmount = 1000;

            //set torsi awal menjadi 0/ tidak berputar
            float torque = 0;

            //user menekan tombol left
            if (input.CurrentKeyboardState.IsKeyDown(Keys.Left)) { torque -= torqueAmount; }
            //user menekan tombol right
            if (input.CurrentKeyboardState.IsKeyDown(Keys.Right)) { torque += torqueAmount; }
            //berikan torsi pada kotak
            _rectangleBody.ApplyTorque(torque);
        }

Set atribut lain dalam GameSreen

//judul dari GameScreen
        public static string GetTitle()
        {
            return "Contoh 1 : kotak dan lingkaran";
        }

        //Deskripsi dari GameScreen (akan dipasang di pause screen)
        private static string GetDetails()
        {
            StringBuilder sb = new StringBuilder();
            sb.AppendLine("Contoh isi dari layar pause/menu");
            sb.AppendLine("object attached.");
            sb.AppendLine(string.Empty);
            sb.AppendLine("Keyboard:");
            sb.AppendLine("  -Rotasi : panah kanan atau kiri");
            sb.AppendLine("  -Gerak: A,S,D,W");
            sb.AppendLine(string.Empty);
            sb.AppendLine("Mouse");
            sb.AppendLine("  -Tahan mouse kiri lalu drag mouse");
            return sb.ToString();
        }

Set constructor Game, add GameScreen ke Game

public Game1()
        {
            graphics = new GraphicsDeviceManager(this);

            //set judul game
            Window.Title = "Contoh Farseer Physics Engine XNA";

            graphics.SynchronizeWithVerticalRetrace = false;

            TargetElapsedTime = new TimeSpan(0, 0, 0, 0, 10);
            IsFixedTimeStep = true;

            //set ukuran jendela game
            graphics.PreferredBackBufferWidth = 800;
            graphics.PreferredBackBufferHeight = 600;
            graphics.IsFullScreen = false;

            //set apakah mouse di draw atau tidak
            IsMouseVisible = true;

            //Set window defaults. Parent game can override in constructor
            Window.AllowUserResizing = false;

            //new-up components and add to Game.Components
            ScreenManager screenmanager= new ScreenManager(this);
            Components.Add(screenmanager);

            //set frame counter
            FrameRateCounter frameRateCounter = new FrameRateCounter(screenmanager);
            frameRateCounter.DrawOrder = 101;
            Components.Add(frameRateCounter);

            //tambah GameScreen yang sudah Anda buat(contoh1)
            screenmanager.MainMenuScreen.AddMainMenuItem(contoh1.GetTitle(), new contoh1());
            screenmanager.MainMenuScreen.AddMainMenuItem("Keluar", null, true);

            //arahkan game ke main menu
            screenmanager.GoToMainMenu();
        }

Selesai

 

Dan berikut adalah hasil akhir dari tutorial di atas 🙂

Anda dapat men-download tutorial di atas di sini

Posted in Microsoft, Tutorial, Virtual Reality, XNA | Tagged: , , | Leave a Comment »

 
%d bloggers like this: