Böyle bir kod yazdığımızı düşünelim.Örneğin oyunun bir yerinde ben bu resmin değiştirilmesini istedim.Şöylemi yapacağım o yerde:
Kod:
resim=SDL_LoadBMP("resim2.bmp");
Yoksa bunu yapmak için ayrı bir fonksiyon ya da teknik mi var?
İkinci sorum ise animated gifleri yükletmek için bir fonksiyon, teknik ya da kütüphane var mı?
Üçüncü sorumsa çizdiğim bir resmi nasıl silebilirim?(SDL'de tabi paint'de değil )
Kayıt: Feb 26, 2003 Mesajlar: 1258 Nereden: Dünya.Türkiye(54)
Tarih: Sun Jul 24, 2005 12:56 pm Mesaj konusu:
Boşver SDL'i ben sana GL anlatayım:
Sanırım amacın bir sprite olayı yapmak yani texture animation, bunun için animasyonu yapacak tüm resimleri yüklersin ve doku yaparsın, daha sonra tanımladığın bir zaman sistemine göre uygun zamanda glBindTexture(GL_TEXTURE_2D, Anime[i].ID); ile dokuyu değiştirirsin... İşte sana anime...
Kayıt: Feb 26, 2003 Mesajlar: 1258 Nereden: Dünya.Türkiye(54)
Tarih: Sun Jul 24, 2005 1:04 pm Mesaj konusu:
Yada animasyon resimleri tek dokuda ise, yine uygun zamanda, gösterilmesi istenen resimleri konumlandırırsın:
glBegin(GL_QUDS);
glTexCoord2f(Anime[i].PosX, Anime[i].PosY).... // Sol üst köşe
glTexCoord2f(Anime[i].Geni, Anime[i].PosY).... // Sağ üst köşe
glTexCoord2f(Anime[i].Geni, Anime[i].Yuks).... // Sağ alt köşe
glTexCoord2f(Anime[i].PosX, Anime[i].Yuks).... // Sol alt köşe
glEnd();
Kayıt: Feb 26, 2003 Mesajlar: 1258 Nereden: Dünya.Türkiye(54)
Tarih: Sun Jul 24, 2005 1:12 pm Mesaj konusu:
SDL'de kullanmak istediğin olay, Belleği öldürür, ekran kartı belleği varken, sistemde tutmak saçma olur vede dinamik yapılacaksa eğer yani olay anında yüklenecekse hız kaybına neden olur. Bu yüzden hepsini Initialize kısmında yükle ve doku yap, daha sonra bellekteki resimler sil... He bunu nasıl yaparsın bilmem SDL bilen birine sormak gerek!
Cevabın için teşekkürler MD-C fakat ben 2d bir oyun yapacağım için OpenGl kullanamıyorum o yüzden SDL kullanmam gerekiyor.Bir de Ragnor'a sorayım.Teşekkürler...
@MD-C: SDL'de ekran kartı belleğini kullanmak istersen yapman gereken SDL'i çalıştırırken SDL_HWSURFACE bayrağı ile başlatman. Bu sayede ekran kartı belleğini kullanacaktır. Ya da çok büyük bir yanılgı içerisindeyim .
@coolprogrammer: Şimdi sorularını cevaplayayım. Sondan başlayacağım.
3- Şimdi ekrandaki görüntü her elemanı ekrandaki bir pixel'i temsil eden ve içerisinde o pixel'in renk değerini saklayan bir dizidir aslında. Böyle olunca ekrana çizdirdiğin her şey çizildiği koordinatlardaki rengi değiştirir. Silmek içinse o pixel'e siyah ya da arkaplan ne ise o rengi çizdirebilirsin.
2- Animated gifler ile animasyon yapmayı aklından bile geçirme. Gifleri yüklemek için SDL_Image kütüphanesini kullanabilirsin. Bu kütüphane yardımı ile png, jpg,gif vs. birçok resim formatını yükleyebilirsin. Animasyon için ne yapman gerektiği ise bir sonraki cevapta.
1- Şimdi basitçe soruna evet diye cevap verebilirim. Ama ele alınması gereken birçok konu var burada. Nasıl başlasak? Hmm...
Şimdi ilk olarak bu kodda önce değişken tanımlamalarını yapıyor, sonra değişkenlere veri yüklüyor ardından da ekrana çizim yapıyorsun. Sorun şu ki animasyon istiyorsan yapman gereken şey ayrı bir çizim fonksiyonu yapmak ve program döngüsü boyunca bu çizim fonksiyonunu çağırman. Aşağıdaki kodları çizim fonksiyonu içerisinde kullanman pek yararlı değil çünkü bu yüzden ekrana her çizim yapıldığında resim yüzeyine dosyadan veri okunarak resim bilgisi atanır. Bu hem programı yavaşlatır hem de hafızayı doldurur. Düşün durmadan aynı resmi hafızaya yüklüyorsun. Bundan kurtulmak için programda, oyunda kullanacağın bütün değişkenleri önceden tanımla ve dışarıdan dosyadan alacağın verilerin hepsini yine bu program döngüsüne girmeden yükle. Sonrada çizim fonksiyonunda bu önceden yüklenmiş verileri kullan. Mesela
Kod:
//SDL_Surface *resim; 'i önceden tanımla!
resim=yaratik[1]; /* yaratik dizisi burda yaratıkların resimlerinin saklandığı dizidir. dizi indeksini değiştirerek istediğin resmi yükleyebilirsin. Bu demektir ki 1 yerine bir başka değişken kullanman daha iyi olur.*/
SDL_Rect hedef;
hedef.x = x;
hedef.y = y;
SDL_BlitSurface(resim, NULL, screen, &resimpozisyon);
Animasyon, yani sprite animasyonu için yapman gereken şey bir diziye önceden sprite'ın animasyonunun her karesini yüklemek ve ekrana çizdirirkende bu animasyonun hep bir sonraki karesini çizdirmek.
Yukarıda basitçe açıklamaya çalıştım. Umarım işine yaramıştır. Kafanda hala sorular varsa arkadaşımla yaptığımız ufak bir animasyon çalışması var. Basitçe bir adamı 8 yönde yürütebiliyorsun. Onu sana yollarım ve kodlarını incelersin.
Bu forumda yeni konular açamazsınız Bu forumdaki mesajlara cevap veremezsiniz Bu forumdaki mesajlarınızı değiştiremezsiniz Bu forumdaki mesajlarınızı silemezsiniz Bu forumdaki anketlerde oy kullanamazsınız