Forum: SDL RSS
Allegro D ilintileri
erdem (Moderatör) #1
Üye Tem 2009 tarihinden beri · 901 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Allegro D ilintileri
Eski mesajlardan bir tanesinde Salih SDL'in programcıya çok fazla hamallık yüklediğinden bahsetmişti. Bu bağlantıyı daha önce paylaşmıştım ama şimdi ayrıntılı inceleme fırsatı buldum.

https://github.com/SiegeLord/DAllegro5

Bu arada birazdan Salih'in oturduğu koltuktan hop diye havaya sıçrayacağını tahmin ediyorum  ;-)

Aslında bu oyunu daha önce Game Maker kullanarak yapmıştım. Ve çok beğenmiştim.

http://sandbox.yoyogames.com/downloads/tutorials/shooter.zip

İşte aynı oyunun Allegro versiyonu! :)

[Resim: http://ehobi.org/resim/resim/warbird.png]

Allegro dersleri

http://www.emunix.emich.edu/~evett/GameProgramming/allegro…

O derslerde bahsedilen kitabı sipariş ettim bile :)

http://amzn.com/1598632892

Bir de Ali beyin tavsiyesiyle C kültürümü arttırmaya karar verdim ;)

http://amzn.com/0672326965
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4396 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
O C kitabı beğeniliyormuş:

  http://accu.org/index.php?module=bookreviews&func=sear…

Ali
erdem (Moderatör) #3
Üye Tem 2009 tarihinden beri · 901 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ama nedense C kitaplarının hiç birisini "Highly Recommended" olarak seçmemişler  :-)

Ya da ben bulamadım.

Sadece bu kitaba vermişler. Ama o da sanırım ileri düzey.

http://accu.org/index.php?module=bookreviews&func=sear…
Avatar
Salih Dinçer #4
Üye Ock 2012 tarihinden beri · 1881 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
D ilintilerinin bu kadar çok olması sevindirici. İnsan, her köşe başında C'ye has kütüphaneleri görünce yanlız hissediyor bir an. Bu bağlama olayını kim icat ettiyse Allah razı olsun. Tabi bir gün D'nin kütüphanelerini gözde (popularity) olursa onlar için ilintiler hazırlandığını görmekde sevindirici olurdu...:)

Allegro'yu denemek için kurmaya çalıştım ama cmake'de takıldım; bir de Linux'da denemeliyim!

-- Performing Test ALLEGRO_HAVE_PROCFS_ARGCV
-- Performing Test ALLEGRO_HAVE_PROCFS_ARGCV - Failed
-- Performing Test ALLEGRO_HAVE_SV_PROCFS_H
-- Performing Test ALLEGRO_HAVE_SV_PROCFS_H - Failed
-- Performing Test ALLEGRO_HAVE_VA_COPY
-- Performing Test ALLEGRO_HAVE_VA_COPY - Failed
-- Check if constructors are supported - no
-- Found OpenGL: opengl32
-- Could NOT find DINPUT (missing:  DINPUT_INCLUDE_DIR DINPUT_LIBRARY)
CMake Error at CMakeLists.txt:641 (message):
  Windows port requires DirectInput (not found).


-- Configuring incomplete, errors occurred!

Bu hataları üstesinden gelebilirsem deneyip tekrar bir yorum yapmak istiyorum...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
erdem (Moderatör) #5
Üye Tem 2009 tarihinden beri · 901 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Sanırım DirectX SDK kurulu olması gerekiyormuş. dinput8.lib 'in derleyicinin LIB dizininde ve tüm başlık dosyalarının da INCLUDE dizininde belirtilmesi gerekiyormuş.
Avatar
Salih Dinçer #6
Üye Ock 2012 tarihinden beri · 1881 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Bu konuda şurada Türkçe Allegro Dersleri var...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
erdem (Moderatör) #7
Üye Tem 2009 tarihinden beri · 901 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bu arada Allegro örneklerini github'a taşıdım :)

https://github.com/erdemoncel/allegro

Henüz C ile yazılmış olsa da kütüphane kullanımının oldukça kolay olduğunu görebilirsiniz.

Örnekleri çalıştırabilmek için ilkönce Allegro kütüphanesini kurmanız

$ sudo apt-get install liballegro4.2-dev

Ve basitçe make demeniz yeterli.
Bu mesaj erdem tarafından değiştirildi; zaman: 2012-08-13, 17:13.
Değişiklik nedeni: gerekli kütüphaneleri ekledim
erdem (Moderatör) #8
Üye Tem 2009 tarihinden beri · 901 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bu arada ufak ufak DAllegro ile denemeler yapıyorum.

[Resim: http://ehobi.org/resim/resim/cizgi.png]

Kaynak kod da bu şekilde:
import std.stdio;
import std.random;
 
import allegro5.allegro;
import allegro5.allegro_primitives;
import allegro5.allegro_color;
 
int main()
{
 
    int genislik = 640;
    int yükseklik = 480;
    bool cikis = false;
 
    // Allegro'yu ilklendir
    al_init();
 
    // ekran kipini ayarla
    ALLEGRO_DISPLAY* ekran = al_create_display(genislik, yükseklik);
 
    // olay dizisini oluştur
    ALLEGRO_EVENT_QUEUE * olaylar = al_create_event_queue();
 
    al_init_primitives_addon();
    al_install_keyboard();
 
    al_register_event_source(olaylar, al_get_keyboard_event_source());
 
 
    while(!cikis)
    {
        ALLEGRO_EVENT olay;
 
        while(al_get_next_event(olaylar, &olay)) {
            if (olay.type == ALLEGRO_EVENT_KEY_DOWN) {
                if (olay.keyboard.keycode == ALLEGRO_KEY_ESCAPE) {
                    cikis = true;
                }
            }
        }
 
        int x1 = uniform(40, genislik - 40);
        int y1 = uniform(40, yükseklik - 40);
        int x2 = uniform(40, genislik - 40);
        int y2 = uniform(40, yükseklik - 40);
 
        ubyte kırmızı = cast(ubyte) uniform(0, 255);
        ubyte yeşil = cast (ubyte) uniform(0, 255);
        ubyte mavi = cast (ubyte) uniform(0, 255);
 
        al_draw_line(x1, y1, x2, y2, al_map_rgb(kırmızı, yeşil, mavi), 1);
        al_flip_display();
    }
 
    al_destroy_event_queue(olaylar);
    al_destroy_display(ekran);
 
    return 0;
}
Eğer denemek isterseniz DAllegro'yu indirdikten sonra example.d'nin olduğu klasörde dmd test.d allegro5/*.d şeklinde derleyebilirsiniz.
Bu mesaj erdem tarafından değiştirildi; zaman: 2012-08-17, 18:14.
Değişiklik nedeni: kaynak kodu değiştirdim
Avatar
Salih Dinçer #9
Üye Ock 2012 tarihinden beri · 1881 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Eline sağlık, peki geçen beni yaptığım örneği deneyebilir misin?

Hani ekranın ortasında bir top (yuvarlak) vardı ve bunu yön tuşları ile kontrol edebiliyorduk. Ancak ekran sınırına gelince aksi yöne çarpıyordu. Bir de ne kadar çok tuşa basarsak o kadar hızlanma mevzusu var ki bunun kodlarını paylaşmıştım. Meğer çocuk oyuncağı imiş ama Allegro'da nasıl olur merak ettim doğrusu...:)

Güzel bir karşılaştırma olabilir...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
erdem (Moderatör) #10
Üye Tem 2009 tarihinden beri · 901 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ben sadece bu örneği hatırlıyorum. Orada bir top vardı. Ama sağa sola gittiğinden emin değilim :-O

http://ddili.org/forum/post/7341

Allegro sadece circle işlevi ile çember çizebiliyor.

https://github.com/erdemoncel/allegro/blob/master/cember.c
Avatar
Salih Dinçer #11
Üye Ock 2012 tarihinden beri · 1881 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Haklısın, o kodu MVC deseni üzerinde geliştirmiştim. Senin circleFill() işlevine ihtiyacın olmayacağına göre, elimden geldiğince sadeleştirip başındaki esprikleri çıkarayım...

Evet, aşağıda Allegro'ya çevrilmek üzere sana emanet ediyorum...:)
import sdl, std.math;
 
int main(){
    immutable genişliği        = 640;
    immutable yüksekliği       = 480;
    immutable çerçeveKalınlığı = 40;
    immutable yuvarlakÇapı     = 21;
 
   // Sahneyi Kur
   SDL_Surface* ekran = SDL_SetVideoMode(genişliği,
                                         yüksekliği, 0, SDL_HWSURFACE)
   SDL_Rect çerçeve;
            çerçeve.w = cast(ushort)(genişliği - çerçeveKalınlığı);
            çerçeve.h = cast(ushort)(yüksekliği - çerçeveKalınlığı);
            çerçeve.x = cast(short)(ekran.w - çerçeve.w)/2;
            çerçeve.y = cast(short)(ekran.h - çerçeve.h)/2;
   int beyaz = SDL_MapRGB(ekran.format, 0xff, 0xff, 0xff);
   SDL_FillRect(ekran, &çerçeve, beyaz);
   SDL_UpdateRect(ekran, 0, 0, ekran.w, ekran.h); 
 
   // OLAYLAR BAŞLIYOR...
      double HIZLAN   = 0.0123456789;
      double YAVAŞLA  = 0.998754321;
      double nXkonumu = genişliği /2;
      double nYkonumu = yüksekliği/2;
      double nXivmesi = 0;
      double nYivmesi = 0;
      bool sol, sağ, üst, alt;
      SDL_Event event;
        
        while (true) {
          if(sol) nXivmesi -= HIZLAN;
          if(sağ) nXivmesi += HIZLAN;
          if(üst) nYivmesi -= HIZLAN;
          if(alt) nYivmesi += HIZLAN;
            
          nXivmesi *= YAVAŞLA;
          nYivmesi *= YAVAŞLA;
            
          if(nXkonumu > cast(double)(genişliği - çerçeveKalınlığı) ||
              (nXkonumu < cast(double)çerçeveKalınlığı)) {
               nXkonumu -= nXivmesi;
               nXivmesi = -nXivmesi * YAVAŞLA;
          }
          if(nYkonumu > cast(double)(yüksekliği - çerçeveKalınlığı) ||
              (nYkonumu < cast(double)çerçeveKalınlığı)) {
               nYkonumu -= nYivmesi;
               nYivmesi = -nYivmesi * YAVAŞLA;
          }
          nXkonumu += nXivmesi;
          nYkonumu += nYivmesi;
 
          // Çerçeve Çiz
          SDL_FillRect(ekran, &çerçeve, SDL_MapRGB(ekran.format, 0xff, 0xff, 0xff));
 
          // Yuvarlak Çiz
          circleFill(ekran, cast(int)nXkonumu, cast(int)nYkonumu, yuvarlakÇapı, 0);
 
          // Ekrana Yansıt 
          SDL_Flip(ekran);
 
          while (SDL_PollEvent(&event)) {
            if(event.type == SDL_KEYDOWN) {
                switch(event.key.keysym.sym) {
                   case SDLK_LEFT   : sol = true; break;
                   case SDLK_RIGHT  : sağ = true; break;
                   case SDLK_UP     : üst = true; break;
                   case SDLK_DOWN   : alt = true; break;
                   default          : break;
                }
            } else if(event.type == SDL_KEYUP) {                    
                switch(event.key.keysym.sym) {
                   case SDLK_ESCAPE : return true; // çıkış
                   case SDLK_LEFT   : sol = false; break;
                   case SDLK_RIGHT  : sağ = false; break;
                   case SDLK_UP     : üst = false; break;
                   case SDLK_DOWN   : alt = false; break;
                   default          : break;
                }
             } else if(event.type == SDL_QUIT) {
                return true; // çıkış
             }
          } // tuş döngüsü
     } // sonsuz döngü
 
     SDL_Quit();
     return true;
} // program sonu 
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
erdem (Moderatör) #12
Üye Tem 2009 tarihinden beri · 901 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Evet güzel! :) Şimdi sonraki aşama tuğla kırma oyunu gibi kullanıcının topa vurabilmesi. Sonra tuğlalar vs..

Dikkat ettim de ivme eklemişsin. Aslında  ben de bu örneğin bir benzerini yapmıştım ama silinmiş olabilir. Orada da vector2d sınıfı çok yararlı oluyordu. Benim yaptığım örnekte duvara her çarpışında farklı bir ivme ve yön kazanıyordu.
Avatar
Salih Dinçer #13
Üye Ock 2012 tarihinden beri · 1881 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Biraz daha düşününce, gerçekten çok olay var!

Mouse ile tutup çekmek, tuş kombinasyonları ile farklı hareketler (örneğin Street Fighter), üzerine (oyuncuya) aynı anda gelen farklı cisimler (silahlar, engeller ve düşmanlar) ve daha sayamayacağım nice ayrıntı...:)

Oyun yazmak apayrı bir dünya ama ucundan acık da olsa bu dünyaya girmek büyük tecrübe kazandırabilir...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
erdem (Moderatör) #14
Üye Tem 2009 tarihinden beri · 901 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Allegro uygulamaları artık Windows altında da çalışıyor. Windows XP altında denedim.

Tek yapmanız gereken MinGW kurulum programını buradan indirmek. Kurulum programında C Compiler ve MSYS Basic System seçenekleriyle MinGW'yi kurun. Bilgisayarım'a sağ tıklayarak Özellikler Gelişmiş Ortam Değişkenleri seçerek Path değişkenini seçin Düzenle'yi tıklayın ve alttaki kutucuğa MinGW'nin çalıştırılabilir dosyalarının olduğu dizini örneğin ;C:\MinGW\bin şeklinde ekleyin.

Oturumu kapatıp açın. Allegro uygulamalarını indirdikten sonra sıkıştırılmış dosyayı açın. Derlemek için ana dizinde mingw32-make demeniz yeterli. Eğer her şey yolunda gittiyse programın çalıştırılabilir dosyaları uygulama dizininde oluşacak.
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Forum: SDL RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-05-27, 12:24:47 (UTC -07:00)