Önceki başlık :: Sonraki başlık |
Yazar |
Mesaj |
MrCha0s

Kayıt: Dec 13, 2003 Mesajlar: 71 Nereden: Istanbul
|
Tarih: Mon Jun 14, 2004 3:45 pm Mesaj konusu: DirectDraw da surface e bitmap yuklemek... |
|
|
off aslinda cok uzun bi mesaj yazmistim buraya ama silindi useniyom dermini uzun uzun anlatmaya kisaca bahsedeyim. bazen surface e basmak istedigim bitmapler tam olarak ekranin icine gelmiyor yukaridan asagidan sagdan soldan tasabiliyor iste bu tur durumlarda bitmap in x,y pozisyonlarini surface in disinda kalicak sekilde verdigimiz zaman directx exception veriyor bende bi kod yazdim verilen bitmap in surfacein disinda kalan kismi varmi onu kontrol ediyor eger kalan kismi varsada sadece bitmapin surface in icinde kalan kismini aliyor ve basiyor tabi ben bole uzun bi kod yazdim sizin bildiginiz daha iyi bir yontem varmi veya daha optimize edilmis bir kod parcasi netde arattim ama pek birsey bulamadim muhtemelen yanlis arattim
Alıntı: |
if (_PosX < 0)
{
// Yatay Pozisyon 0 dan kucuk
if ((_PosX + _bmpsurface.SurfaceDescription.Width) > 0)
{
// Tamam bitmap in bir kismi yetisiyor cizilebilinir
StartPosX = 0;
FromX = -_PosX;
EndPosX = _PosX + _bmpsurface.SurfaceDescription.Width;
BitmapView = true;
}
else
{
// Bitmap in yatay genisligi ekrana girmeye yetmedi
BitmapView = false;
}
} else
if (_PosX > (BackSurface.SurfaceDescription.Width - 1 - _bmpsurface.SurfaceDescription.Width))
{
// Yatay Pozisyon cok genis
if (_PosX < BackSurface.SurfaceDescription.Width)
{
StartPosX = _PosX;
EndPosX = BackSurface.SurfaceDescription.Width - 1 - _PosX;
BitmapView = true;
}
else
{
BitmapView = false;
}
}
else
{
// Tile Surface in icinde yer aliyor
StartPosX = _PosX;
EndPosX = _bmpsurface.SurfaceDescription.Width;
BitmapView = true;
}
if (_PosY < 0)
{
// Dikey Pozisyon 0 dan kucuk
// Yatay Pozisyon 0 dan kucuk
if ((_PosY + _bmpsurface.SurfaceDescription.Height) > 0)
{
// Tamam bitmap in bir kismi yetisiyor cizilebilinir
StartPosY = 0;
FromY = -_PosY;
EndPosY = _PosY + _bmpsurface.SurfaceDescription.Height;
BitmapView = true;
}
else
{
// Bitmap in yatay genisligi ekrana girmeye yetmedi
BitmapView = false;
}
} else
if (_PosY > (BackSurface.SurfaceDescription.Height - 1 - _bmpsurface.SurfaceDescription.Height))
{
// Dikey Pozisyon cok yuksek
if (_PosY < BackSurface.SurfaceDescription.Height)
{
StartPosY = _PosY;
EndPosY = BackSurface.SurfaceDescription.Height - 1 - _PosY;
BitmapView = true;
}
else
{
BitmapView = false;
}
}
else
{
// Tile Surfacein icinde yer aliyor
StartPosY = _PosY;
EndPosY = _bmpsurface.SurfaceDescription.Height;
}
*/
if (BitmapView == true)
{
try
{
//BackSurface.DrawFast(_posy, _posx, _bmpsurface, DrawFastFlags.DoNotWait | DrawFastFlags.SourceColorKey);
BackSurface.DrawFast(StartPosX, StartPosY,_bmpsurface, new Rectangle (FromX,FromY,EndPosX, EndPosY),DrawFastFlags.DoNotWait | DrawFastFlags.SourceColorKey);
}
catch
{
// Sebebini bilmedigim bir hata var haritayi cizerlen veriyor ScreenY degeri 592 oldugunda oluyor asagidaki hata mesajida onu gonderiyor
//MessageBox.Show("Screen X : "+ScreenX.ToString()+"\n Screen Y : "+ScreenY.ToString()+"\n StartPosX : "+StartPosX.ToString()+"\n StartPosY : "+StartPosY.ToString()+"\n FromX : "+FromX.ToString()+"\n From Y : "+FromY.ToString()+"\n EndPosX : "+EndPosX.ToString()+"\n EndPosY : "+EndPosY.ToString());
}
}
|
|
|
Başa dön |
|
 |
deniz Site Yöneticisi


Kayıt: Sep 14, 2002 Mesajlar: 838 Nereden: Ankara
|
Tarih: Mon Jun 14, 2004 4:22 pm Mesaj konusu: |
|
|
DirectDraw bilmiyorum sadece biraz tecrübe ile bişiler söylemeye çalışıcam
Şimdi sen bi bitmap i bi surface e yüklüyorsun.. burası tamam.. bide başka bir surface in var (double buffer mesela?).. neyse yapmak istediğinde bitmap surface ini diğer surface e kopyalamak... şimdi bu iş için Blit tarzı bir yordam yokmu?.. Böyle bir yordam var ise bunun "boundary checking" denen naneyi yapıp programın cortlamasını engellemesi gerekmez mi?
++ iki surface in bit derinlikleri (pixel format felan filan) aynı değilmi, sakın bunların farklı olması sorun çıkarıyor olmasın..
ben bi allegro nun directDraw gerçekleştiriminin koduna bakayımda şu blit olayına daha bi derinden gireyim..
görüşmek üzere.. |
|
Başa dön |
|
 |
Ziyaretci

Kayıt: Apr 24, 2003 Mesajlar: 287 Nereden: İstanbul
|
Tarih: Mon Jun 14, 2004 4:28 pm Mesaj konusu: |
|
|
bilmiyorum sorununla ne kadar alakalidir ama,Y değerlerini kontrol ettiğin IF bloğunu bi if le daha çevrelemen olayı hızlandırabilir:
Kod: |
if( BitmapView ) {
if (_PosY < 0)
...bla bla bla...
}
|
şeklinde bişeyler.. böylece, eğer resim X değerlerinden dolayı dışarda ise, Y değerleri yüzünden tekrar içerde muamelesi görmez..
hadi kolay gelsin!![/code] |
|
Başa dön |
|
 |
Ziyaretci

Kayıt: Apr 24, 2003 Mesajlar: 287 Nereden: İstanbul
|
Tarih: Mon Jun 14, 2004 4:31 pm Mesaj konusu: |
|
|
bir de bişey daha farkettim;
ama benim bilgi eksiğimden olması da muhtemel:
en altta function call ederken her seferinde new Rectangle (... ) şeklinde bişeyler yapmak bi memory leak olmuyor mu? yoksa bunu bi yerlerde delete ediyon mu? |
|
Başa dön |
|
 |
deniz Site Yöneticisi


Kayıt: Sep 14, 2002 Mesajlar: 838 Nereden: Ankara
|
Tarih: Mon Jun 14, 2004 4:34 pm Mesaj konusu: |
|
|
groups.google.com da "blitting surface clipper" diye arat.. allegro kodunu hızlı bi tradımda .. BltFast gibisinden komutlar gayet güzel çalışıyor gibi.. clipping olayını otomatik yapıyorlar gibi geldi bana.. |
|
Başa dön |
|
 |
MrCha0s

Kayıt: Dec 13, 2003 Mesajlar: 71 Nereden: Istanbul
|
Tarih: Mon Jun 14, 2004 4:46 pm Mesaj konusu: |
|
|
Selam cevaplar icin tesekkur ediyorum. Once denize cevap vermeye calisayim sanirim boundary checking den bahsediyoruz ben ismini bilmedigim icin kaynak bulamamistim sorun o olabilir yani sole aciklayim iki adet surface kullaniyorum back surface front surface diyelim butun cizimleri back e yapiyorum daha sonra back surfacei front surface e atiyorum ve front surface i de ekrana basiyorum flip methodu ile :p tamamdir surfaceleri yaratirken back i front a atacladigim icin bit per pixel den filan herhangi bir sorun cikmiyor sorun su oluyor bir bitmap yaratiyorum mesela 32x16 boyutlarinda sonucda elimde 32x16 pixellik bir surface oluyor adi da _bmpsurface diyelim sonra ben bunu backsurface de yatay da (X) 100 dikeyde (Y) 150 kordinatlarina basiyorum ve no problem ekrana 32x16 pixellik resmin cikiyor ben diyorumki simdi bu X kordinati 100 degilde 0 dan kucuk bir deger oldugunda yani -10 program dogal olarak cokuyo exception veriyor bende bu kodu yaziyorum ve bu kodun olayi su diyoki himmm deger 0 dan kucuk ozaman bu bitmap in hepsi ekrana basilmicak bakalim ne kadari basilcak once su bitmap surfacein boyu neymish himmm demek 32 pixel eee bunu x de -10 dan ektana basicaksak bu bitmapin sadece 22 pixellik bir kismi ekran da gozukcek hadi ben onu bi dortgenin icine alayim ve basayim olayi olyuo iste bunu hesaplayan kodu yazdim sizin bildiginiz daha kisa bir olay veya teknik varsa anlatirsaniz sevinirim hic bir kutuphane veya bilesen kullanmadan bole bodozlama kod yazmaya kalkinca bilmedigin bi konuda bole takildigin yerler olur :p simdi tahmin ettigim kadariyla boundary checking diye aratirsam bi sonuca ulasabilirim...
Ziyaretci bende C# kullanmaya bu projede basladim ondan cok iyi bilmiyorum ama aklimda kaldigini soyluyorum eger method private ise baska classlar tarafindan kullanilmadigi icin o fonksiyon icinde tanimlanan degiskenler o fonksiyon cagrildiginda yaratilir ve fonksiyon bittiginde destroy edilir yani yanlis hatirliyorda olabilirim ... |
|
Başa dön |
|
 |
Ziyaretci

Kayıt: Apr 24, 2003 Mesajlar: 287 Nereden: İstanbul
|
Tarih: Mon Jun 14, 2004 5:13 pm Mesaj konusu: |
|
|
bu c# miydi? c++ diye düşünmüştüm.. c#sa herhalde kendi garbage collectorlari vardir.. (yoksa yok mudur??)
Ayrıca, bu bitmapleri falan çizen fonksiyonlar genelde bu clipping işlerini yaparlar.. DX niye yaptırmıyokine ??
kolay gelsin.. |
|
Başa dön |
|
 |
MrCha0s

Kayıt: Dec 13, 2003 Mesajlar: 71 Nereden: Istanbul
|
Tarih: Mon Jun 14, 2004 9:56 pm Mesaj konusu: |
|
|
yok yaw fonksiyon filan kullanmiyom Direkt Direct Draw kodu kullaniyom yani bitmap icin once bi surface yaratiyom bitmap boylarinda sonra o surface e bir description orda trasparent sa iste colorkey lerini filan tanimliyom vs... yani baya bi kod ameliligi yapiyom ama zevkli bi seyler ogreniyorum en azindan.... |
|
Başa dön |
|
 |
levent

Kayıt: Mar 13, 2003 Mesajlar: 188 Nereden: İstanbul
|
Tarih: Fri Jul 02, 2004 5:19 pm Mesaj konusu: |
|
|
selam,
ihtimal 1,sanırım clipper'a ihtiyacın var:
Vb için şöyle code var:
Initialize procedure'na bunu eklemelisin.
Dim Clipper As DirectDrawClipper
Set Clipper = DDRAW.CreateClipper(0)
Clipper.SetHWnd myhWnd
Primary.SetClipper Clipper
2.Her Render'da Window rectini düzeltmediğin için çerçeve dışına kayma oluyor olabilir.Bu da exception (automation error)'a neden oluyor olabilir.
o da şöyle:
Bu da her flip ettiğinde flip'ten önce yapılacak işlem.
Dim Destrect As RECT
DX.GetWindowRect myhWnd, Destrect |
|
Başa dön |
|
 |
MrCha0s

Kayıt: Dec 13, 2003 Mesajlar: 71 Nereden: Istanbul
|
Tarih: Fri Jul 02, 2004 5:55 pm Mesaj konusu: |
|
|
levent cevap icin saol sorun cerceve disindan kalmakdan kaynaklaniyor kendim bi kod yazdim. ve bu sorunu cozdum ama senin yazdigin kod cok daha kisa :p duruyor pek anlamadim kodu bana biraz daha aciklarmisin ?
DestRect dedigin hedef dortgen olsa gore simdi bu hedef dortgen benim flip edicegim surfacein dortgenimi yoksa bitmapimin yuklu oldugu surface in mi ? sunu biraz daha aciklarsan bekli anlarim :p cevap icin saol |
|
Başa dön |
|
 |
Arda

Kayıt: Feb 25, 2003 Mesajlar: 226
|
|
Başa dön |
|
 |
Arda

Kayıt: Feb 25, 2003 Mesajlar: 226
|
Tarih: Sun Nov 21, 2004 6:49 pm Mesaj konusu: |
|
|
soru:
ddraw da, fullscreen de clipper kullanirken, lpPrimary->flip(); yapabiliyoluyuz? yoksa back_buffer i ayri tutup (attached buffer yapmadan) blit mi etmeliyiz? (bayaa yavaslatmaz mi?)
hubele |
|
Başa dön |
|
 |
Arda

Kayıt: Feb 25, 2003 Mesajlar: 226
|
Tarih: Wed Nov 24, 2004 2:29 pm Mesaj konusu: |
|
|
C++ da directdraw la clipping yapmak istiyorsaniz, ornek clipper ekleme fonksiyonu burada ki kaynak dosyasinda mevcut. Clipper'i backsurface'e linklemek gerekiyor. Dikkat edilmesi gereken nokta, resim blitlerken bltfast yerine blt fonksiyonunu kullanmak lazim, aksi halde clipper calismiyor.
Biraz monolog gibi oldu bu reply lar ama epey zaman kaybettim nasil calistigini anlayana kadar ve msdn de yeterli bilgi yok. En azindan benim gibi ddraw la ugrasmak isteyen baska 2D ciler piyasa cikarsa diye yaziyorum... |
|
Başa dön |
|
 |
levent

Kayıt: Mar 13, 2003 Mesajlar: 188 Nereden: İstanbul
|
Tarih: Fri Nov 26, 2004 2:11 pm Mesaj konusu: |
|
|
Mr Chaos:mesajıma cevap yazdığını şimdi fark ettim çok üzgünüm.
Arda:Katkıların için sağol.
BltFast'in çalışmaması flag olarak DDL_WAIT'in verilmemesi olabilir mi?
Ben de 2D kullanıyorum ama VB ile... |
|
Başa dön |
|
 |
|