2 Eylül 2008 Salı

Visual C++ 2008 ve Allegro Kurulumu

Bilgisayarınızda visual studio yoksa bu yeni sürümleri öneririm. Kotasına güvenen indirsin :)

Önce "Visual c++ 2008 Express ve Allegro kütüphane" download linklerini vereyim:

     *Net Framework 3.5 gerekli
http://www.microsoft.com/downloads/details.aspx?FamilyId=AB99342F-5D1A-413D-8319-81DA479AB0D7&displaylang=en

     *Ve de Windows SDK (Burada altta PSDK-x86.exe i seçbilirsiniz (32bit için))
http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en#top

     *Visual C++ Express Edition 2008
http://www.microsoft.com/express/download/#webInstall

     *Allegro Kütüphanesi
http://wiki.allegro.cc/Visual_C%2B%2B_Express_2008

Bunları kurduktan sonra isterseniz kendimiz için şablon bir allegro programı yazalım.

Masaüstüne "GameProject" isimli bir klasör açın ve indirdiğiniz allegro (.zip) dosyasını "GameProject" klasörüne çıkartın. Daha sonra;

Visual c++ i açın "Yeni Proje->Empty Project" i seçin. "Project->Options" bölümünden "C++->General" sekmesinden  şu ayarları yapın: 

(değerleri verirken tırnak işaretlerini mutlaka yazın!)

*Additional Include Directory Files = "$(ProjectDir)\include"

"Linker->General" Bölümüne de:

*Additional Library Directories = "$(ProjectDir)\lib"

"Linker->Input" kısmına da:

*Additional Dependencies = alleg.lib

Ayarları yaptık şimdi kodlara geçelim.

Solda Bulunan Solution Explorer a sağ tıkayın Header Files e New Item diyerek
Dialog'tan .h (Header) filesi seçin adını "Game" verin, aşağıdaki kodları ekleyin


#ifndef GAME_H
#define GAME_H

#include 

/* --------------------------- TEMPLATE --------------------------- */
#define $START_MAIN_PROGRAM int main(){
#define $END_MAIN_PROGRAM   return 0;}END_OF_MAIN();
/* --------------------------- TEMPLATE --------------------------- */

class Game
{
public:
 virtual void Initialize(void);
 virtual void DestroyGame(void);
 virtual void Update(void);

 void run(void);

private:
 BITMAP *buffer;
};

#endif


Daha sonra Source Files e tıklayıp (.c Source Files) "Game" seçin ve oluşturulan Game.cpp dosyasına şu kodları ekelyin


#include "Game.h"

void Game::Initialize(void)
{
 allegro_init();
 install_keyboard();
 install_mouse();

 set_window_title("Game");

 set_color_depth(desktop_color_depth());
 set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);

 buffer = create_bitmap(640, 480);
}

void Game::DestroyGame(void)
{
 destroy_bitmap(buffer);
 allegro_exit();
}

void Game::Update(void)
{
 draw_sprite(screen, buffer, 0, 0);
 /* UPDATE GAME CODE */
}

void Game::run(void)
{
 while(!key[KEY_ESC])
 {
  Update();
 }
}


ve birde main.cpp ekliyoruz. Bunlarda son kodlarımız. Projeyi kaydetmeyi unutmayın. Artık masaüstüne açtığınız "GameProject" isimli klasörü zipleyip her zaman kullanmak için saklayabilirsiniz.

main.cpp:


#include "Game.h"

$START_MAIN_PROGRAM

 Game game;

 game.Initialize();

 game.run();

 game.DestroyGame();

$END_MAIN_PROGRAM

18 Ağustos 2008 Pazartesi

Allegro'da Sprite oluşturalım !

Önce masaüstünde bir klasör açın ve adını "Allegro Sprite Denemsi" olarak değiştirin.
Sonra DEV C++ editörünü açın, "Yeni Proje" diyerek "Multimedia" bölümünden "Allegro"
yu seçin, masaüstüne açtığınız klasörün içine kaydedin. Son olarak aşığdaki kodları ekleyerek programınızı "Run" komutu ile çalıştırın.

sprite.h dosyası
------------------------------------------------------------------------------------
#ifndef sprite_H_INCLUDED
#define sprite_H_INCLUDED

#include <allegro.h>

enum Yon { _LEFT = 0, _RIGHT = 1, _DOWN = 2, _UP = 3 };

class Sprite
{
      public:
             BITMAP *_image;
             int _x;
             int _y;
             Sprite();
             ~Sprite();
             void Draw(BITMAP*);
             void Move(int,int);
};

#endif

sprite.c dosyası
------------------------------------------------------------------------------------
#include "sprite.h"

Sprite::Sprite()
{
                _image = NULL;
                _x = 0;
                _y = 0;
}

Sprite::~Sprite()
{
                 if(_image != NULL)
                 {
                           destroy_bitmap(_image);
                 }
}

void Sprite::Draw(BITMAP *__buffer)
{
     if(_image != NULL)
     {
         acquire_screen();
         clear_bitmap(__buffer);
         draw_sprite(__buffer, _image, _x, _y);
         release_screen();
     }
}

void Sprite::Move(int yon, int speed)
{
    switch(yon)
    {
        case (int)_LEFT: _x-=speed; break;           
        case (int)_RIGHT: _x+=speed; break;
        case (int)_UP: _y-=speed; break;
        case (int)_DOWN: _y+=speed; break;
    }     
}

main.cpp dosyası
------------------------------------------------------------------------------------
#include <allegro.h>
#include "sprite.h"

BITMAP *buffer;
BITMAP *scr;

void init();
void deinit();

int main() {
 init();

    Sprite *spr;
    spr->_image = scr;
    spr->_x = 100;
    spr->_y = 100;
    
 while (!key[KEY_ESC]) {
  /* put your code here */
  draw_sprite(screen, buffer, 0, 0);
        
  spr->Draw(buffer);
  
  if(key[KEY_LEFT]) spr->Move(0, 2);
  if(key[KEY_RIGHT]) spr->Move(1, 2);
  if(key[KEY_DOWN]) spr->Move(2, 2);
  if(key[KEY_UP]) spr->Move(3, 2);  
 }

 deinit();
 return 0;
}
END_OF_MAIN()

void init() {
 int depth, res;
 allegro_init();
 depth = desktop_color_depth();
 if (depth == 0) depth = 32;
 set_color_depth(depth);
 res = set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
 if (res != 0) {
  allegro_message(allegro_error);
  exit(-1);
 }

 install_timer();
 install_keyboard();
 install_mouse();
 /* add other initializations here */
 buffer = create_bitmap(640,480);
 scr = load_bitmap("picture.bmp", 0);
}

void deinit() {
 clear_keybuf();
 /* add other deinitializations here */
}

16 Ağustos 2008 Cumartesi

C++ ile yeni bir Allegro denemesi

Allegro ve c++ ikilisi oyun programlama da ne kadar yeterli bilemem fakat bana çok zevkli gelmeye başladı. İşte size yeni bir örnek daha:


14 Ağustos 2008 Perşembe

Allegroyu biraz kolaylaştıralım !

C++ ile Allegro programlarken, programa giriş noktası yani main() fonksiyonunun hemen başında, ilk satırlarında basit ama uğraştıran, birtakım kodlar yazmak zorundayız. Gerçi gerek yok ama sadece kolaylık olması için bu işleri yapan bir sınıf oluşturabilirz. Hem c++ için pratik yapmış oluruz. 

Kodlara gelince:

//İşimizi görecek olan sınıf
settings.h dosyası :

/* Allegro yardımcı sınıf (beta) */
#include <allegro.h>

enum __DEPTH { x8, x15, x16, x24, x32 };
enum __GFX { WINDOWED = 0, FULLSCREEN = 1, ISNULL = 2 };

/* interface */
class Settings
{
    BITMAP *buffer;
    public:
        enum __GFX gfx_mode;  
        enum __DEPTH color_depth;
        bool _install_keyboard;
        bool _install_mouse;
        bool _show_mouse;
        bool buffer_install;
        int buffer_w, buffer_h;
        BITMAP *__mouse;
        const char* window_title;
              
        Settings();
        ~Settings();         
        void install();               
};

Settings::Settings()
{
    gfx_mode = WINDOWED;
    color_depth = x16;
    _install_keyboard = true;
    _install_mouse = true;
    buffer_install = true;
    __mouse = NULL;
    _show_mouse = true;
    buffer_w = 800;
    buffer_h = 600;
    window_title = "Allegro Game";
}

Settings::~Settings()
{
    /* dispose */                    
}

void Settings::install()
{
    allegro_init();  
    
    if(buffer_install == true)
    {
         buffer = create_bitmap(buffer_w, buffer_h);
    }
    
    switch(color_depth)
    {
        case x8: set_color_depth(8); break;
        case x15: set_color_depth(15); break;
        case x16: set_color_depth(16); break;
        case x24: set_color_depth(24); break;
        case x32: set_color_depth(32); break;
    }
    
    switch(gfx_mode)
    {
         case WINDOWED: set_gfx_mode(GFX_AUTODETECT_WINDOWED, buffer_w, buffer_h, 0, 0); break;               
         case FULLSCREEN: set_gfx_mode(GFX_AUTODETECT_FULLSCREEN, buffer_w, buffer_h, 0, 0); break;
         case ISNULL: set_gfx_mode(GFX_AUTODETECT, buffer_w, buffer_h, 0, 0); break;
    }
    
        if(_install_keyboard == true)
        {
            install_keyboard();
        }  
            if(_install_mouse == true)
            {
                install_mouse();
            }
                if(_show_mouse == true)
                {
                    show_mouse(__mouse);
                }
        
        set_window_title(window_title);
}

//Ana program kodlarımız
ve main.cs:

#include <stdlib.h>
#include <allegro.h>
#include "settings.h"

Settings gSettings;

void InstallAllegro() {
    gSettings.color_depth = x32;
    gSettings.window_title = "Allegro Denemesi";
    gSettings._show_mouse = false;
    gSettings.buffer_w = 320;
    gSettings.buffer_h = 240;
    gSettings.install();
}

int main()
{
    //Ne kadar kısa demi :)
    InstallAllegro();
    
    while(!key[KEY_ESC]);
    
    allegro_exit();
    return 0;
} END_OF_MAIN();

12 Ağustos 2008 Salı

C++ ve Allegro İle Oyun Programlama

Şimdilik allegro ile pencere oluşturup beyaz renkte bir çizgi çizmeyi göstereceğim.
Ben öğrendikçe de sizlerle paylaşacağım ...

#include <stdlib.h>
#include <allegro.h> //Allegro kütüphanesi

int main(void)
{    
    allegro_init();        //Allegro Hazırlanıyor ...
    install_keyboard();    //Klavye Yükleniyor ...
    install_mouse();       //Fare Yükleniyor ...
    show_mouse(NULL);      //Fare Aktif Hale getiriliyor ...
    
    //Grafik modeu Ayarlanıyor ...
    //FULLSCREEN yazan kısımı WINDOWED olarak değiştiriseniz
    //program pencerede çalışır.
    int ret = set_gfx_mode(GFX_AUTODETECT_FULLSCREEN, 800, 600, 0, 0); 
    
    //Grafik modu uygulanamıyorsa hata mesajı göster ...
    if(ret != 0)
    {
           allegro_message(allegro_error);
           return 1;
    }
    
    //ESC tuşuna basılmadığı sürece yapılacak işlemler
    while(!key[KEY_ESC])
    {
        //Çizgi çiziliyor x1=0, x2=0, y1=0, y2=0
        //makecol(r, g, b) -> bu kod renk üretir.
        line(screen, 0, 0, 150, 150, makecol(255, 255, 255));
    }
    
    //ESC ye basıldıktan sonra döngü sona erdiğinde allegro dan çık ...
    allegro_exit();
    return 0;
} END_OF_MAIN();

22 Temmuz 2008 Salı

Örnek Flash Oyunum

Sonunda basit de olsa 2D bir oyun yaptık... Flash sayesinde :)

Flash Çalışmasını indirmek için tıklayın (.fla)



Ne kadar basit bir oyun olsa da geliştirlmeye açık. Mesela siz tahmine göre "yukarı"-
"aşağı" şeklinde animasyonlarla sayıyı buldurmaya çalışabilirsiniz ...

13 Temmuz 2008 Pazar

Flash'ta preloading yapımı

Flash'ta geliştirdiğiniz oyunlarda çok işinize yarayacak bir uygulama yapacağız.
Oyun yüklenmeden önce kullanıcıya ön yükleme ekranı göstermelisiniz ki sıkılıp kapatmasın ve bilgilensin.

1. Şimdi Flash'ta bir proje açın, adını "preloading uygulaması" olarak değiştirin.
2. Sonra "Insert - New Symbol - Movie Clip" yapın ve bir dikdörtgen çizin, kenarlıkları kalın ve iç dolgu rengi olmasın.
3. Sonra "Insert - New Symbol - Graphics" yapın ve oluşturduğunuz movie clip in içine atın. Uzunluğunu sıfırlayın (W:0) ve "Instance Name" ini "lbarPos" olarak değiştirin.
4. Movie clipin içine bir de "Dynamic Text" olarak "LOADING 0%" yazın.
Instance Name ini "loadingText" olarak değiştirin.

Son olarak görüntü aşağıdaki gibi olmalı.



Şimdi Movie Clibi ana sahneye taşıyın ve adını(Instance Name) "loadingBar" olarak değiştirin. Bu birinci kare idi. İkinci kareye de bir kaç resim import ederek yerleştirin.

Sonra birinci kareye tıklayıp Actions kısmına şu kodları ekleyin.

5. Kodlar :

stop(); //Animasyonu durduruyoruz.

onEnterFrame = function()
{
 yuklenen = _root.getBytesLoaded(); //swf dosyamızın yüklenmiş byte miktarı
 toplam = _root.getBytesTotal(); //swf dosyamızın toplam byte miktarı
 max = 226; //önyükleme movie clibimizin içindeki lbarPos isimli graphics
                   //nesnesinin maksimum uzunluğu
 
 oran = yuklenen / toplam * 100; //Yükleme oranı % cinsinden
 oran2 = max * oran / 100; //Yükleme oranının maximum uzunlukla oranı
 
        //ana sahnedeki loadingBar nesnemizin içindeki loadingText isimli dynamic
        //text nesnesine yükleme oranını yazdırıyoruz.
 loadingBar.loadingText.text = "LOADING "+ Math.round(oran)+"%";
        //ve uzunluğu artırarak loading efektini veriyoruz
 loadingBar.lbarPos._width = Math.round(oran2);
 
        //Eğer yükleme tamamlandıysa ikinci kareye (resimlerin bulunduğu yere) geç.
 if(yuklenen == toplam) gotoAndStop(2);
}


Ve son olarak CTRL+Enter yapıp animasyonu test edin ve bu penceredeki menuden simulate download seçin böylece animasyonu internette yükleniyormuş gibi görürsünüz.
preloading, flash loading screen, flash loading scene, flash oyun programlama, flash ön yükleme ekranı, flash progressbar

25 Haziran 2008 Çarşamba

Flash'ta Oyun programlama - Pdf Dökümanları



Sanırım 2D Oyunların en iyileri flash'ta geliştiriliyor. Animasyonları ve grafikleri siz hazırlıyorsunuz. Gerisini Action Script tamamlıyor. Tabi bu kadar da kolay değil,
fizik hesaplamaları buradada canımızı sıkabiliyor ...

İşte sizin için internetten araştırıp bulduğum 2 süper pdf dökümanı:

1.Dosya (.pdf)
2.Dosya (.pdf)

5 Haziran 2008 Perşembe

XNA ile Healt Bar yapımı



Genelde aksiyon oyunlarında gördüğümüz bu healt(can,sağlık nyse..) bar yine iki parçalı bir resmin belirli kısımlarının gösterilmesi ile yapılıyor. Bu da source(kaynak) rectangle ile sağlanıyor. Şimdi kodları görelim...

//İlk önce işimizi kolaylaştırmak için bir Sprite sınıfı yazıyoruz.



Şimdi Oyun kodlarına geçelim.





buradan resmi kopyalayın ve XNA Game Studio'da yeni bir Proje açın Content Manager ile resmi yükleyin ve kodları deneyin. Bu küçük bir uygulama fakat yararlı da...
"KOŞMADAN ÖNCE YÜRÜMEYİ ÖĞRENMEK GEREK" :: (:Tom millerin oyun prog. kitabından:)

yazar: CANER DEMİRCİ ((gerisi de var inşallah...))

2 Haziran 2008 Pazartesi

XNA'da Texture Yüklemek ve Render Etmek

Visual Studio açın ve bir XNA Game Studio projesi yaratın. Solution Sekmesindeki
ağaç yapıda "Content" e sağ tıklayıp projenize bir resim dosyası ekleyin.
(Benim tercihim .png formatı) ve daha sonra "Properties" sekmesinde bu dosyanın özelliklerinden "Asset Name" i "deneme" olarak değiştirin. Böylece Xna Game Studio bu 
resim dosyasını .XNB formatına dönüştürecek.

ve sıra kodlarda :

//İlk olarak yükleyeceğimiz resmi ekranda göstermek için
//bir SpriteBatch tanımlıyoruz ...
private SpriteBatch spriteBatch;

//Sonra Texture2D sınıfından texturemizi tanımlıyoruz
private Texture2D myTexture;

//Texturemizin ekrandaki Pozisyonu (Vector2 sınıfı ile)
private Vector2 Position;

//Texturemizin ne kadar Scale edileceği (yani büyültüp küçültme oranı)
// 1 verildiğinde eni ile boyunu 1 ile çarpar yani uzunluğu ve genişliğinde
// bir değişme olmaz
private float Scale; 

//Origin değeri yani merkez noktası
private Vector2 Origin;

//Şimdide Rotation yani döndürme açısı (orjine e göre)
private float Rotation;

//Texturemizin ekstra rengi yani White = Beyaz verilirse renk değişmez
private Color color;

//Texturemizin SourceRectangle değeri yani resmin tam olarak texturenin ne kadar
//bir kısmının gösterileceğini belirle
//Source Rectangle => X, Y, Width, Height değerlerini alır.
//X, Y den başlayark Width ve Height değerleri boyunca devam eder
private Rectangle Source;

//Yüklediğimiz resmin asset name i
private string AssetName = "deneme";


Nesnelerimizi tanımladık şimdi yapacağımız işlemler:
1-Initialize() -> Oyun hazırlanırken ilk değerlerimizi veriyoruz
2-LoadContent() -> bu metod ile texture nesnemizi yükleyeceğiz
3-Draw() -> bu metod ile texture nesnemizi yani resmimizi ekranda göstereceğiz

protected override void Initialize()
{
  this.Scale = 1.0f;
  this.Position = new Vector2(100, 100);
  this.Origin = Vector2.Zero;
  this.color = Color.White;
  this.Rotation = 0f;  

  base.Initialize();
}

protected override void LoadContent()
{
  spriteBatch = new SpriteBatch(GraphicsDevice);
  myTexture = Content.Load(AssetName);
  
  //Bu değeri Initialize metodunda veremedik çünkü texture uzunluk ve yükseklik
  //değerini yüklenen resim den alacağımız için ve resim LoadContent() metodunda
  //yüklendiği için şimdi veriyoruz.
  this.Source = new Rectangle(0, 0, this.myTexture.Width, this.myTexture.Height);
}

protected override void Draw()
{
  graphics.GraphicsDevice.Clear(Color.CornflowerBlue);

  //SpriteBatch nesnemizin render işlemine start veriyoruz
  spriteBatch.Begin();

  //Ve Texture render ediliyor.
  spriteBatch.Draw(myTexture, this.Position, this.Source, this.Color, this.Rotation,
    this.Origin, this.Scale, SpriteEffects.None, 0);

  //SpriteBatch nesnemizin render işlemine son veriyoruz
  spriteBatch.End();
}



kodların hepsini vermedim sadece gerekli blokları yazdım. Çünkü böylesi sizin için daha iyi XNA Game Studio'u açtığınızda karşınıza hazır kodlar gelecektir. Bütün kodu yümüyle kopyalayıp yazmak öğrenme açısından iyi değildir. Kodları yerine kendiniz ilk önceleri bakarak yazın ve "RUn" komutunu verip çalıştırın. Böylece kodu deneyip ne yapabildiğinizi görürsünüz. Zaten sonraları da değiştirmek ve geliştirmek isteyeceksiniz bu arada da belki yüzlerce hata mesajı alacaksınız ama sonunda anlayarak, deneyerek, görerek öğrenmiş olacaksınız.

yazar: Caner DEMİRCİ  (( devamı gelecek ... ))