Anfidya'nın arka bahçesi..

There is dark web in the deep web..

Archive for the ‘Genel’ Category

[Delphi] Çarpışmayı Yakalama | Collision

leave a comment

Selam olsun size Ötüken’in onurlu gençleri,

Blogu kuralı tamı tamına iki sene olmuş fakat içerisinde dişe dokunur bir sayıda gönderi maalesef yok. Fakat artık günlük bir post atma kararı aldım.

Eveeetttt… Bugün amatör olarak yapmaya çalıştığım oyun motorumdan(game engine) ufak bir pascal dosyasını sizinle paylaşacağım dostlar. Büyük ihtimal içerisinde ki kodları bir yerlerden direk veya dolaylı olarak aldım çünkü hatırlamıyorum nereden geldi. Sahibi hakkını helal etsin lütfen.

unit Engine.Core.Collision;

interface

uses
  System.Classes, System.Types, FMX.Graphics, FMX.Objects;

function CheckBoundryCollision( R1, R2 : TRect; pR : PRect = nil; OffSetY : LongInt = 0; OffSetX : LongInt = 0): boolean; {overload;}
function CheckImageCollision( R1, R2 : TImage; pR : PRect = nil; OffSetY : LongInt = 0; OffSetX : LongInt = 0): boolean; {overload;}

implementation

uses
  IdHttp, IdTCPClient;
  
function CheckBoundryCollision( R1, R2 : TRect; pR : PRect = nil; OffSetY : LongInt = 0; OffSetX : LongInt = 0): boolean; {overload;}
begin
  if( pR <> nil ) then
   begin
    with( R1 ) do
     R1:=Rect( Left+OffSetX, Top+OffSetY, Right-(OffSetX * 2), Bottom-(OffSetY * 2));
    with( R2 ) do
     R2:=Rect( Left+OffSetX, Top+OffSetY, Right-(OffSetX * 2), Bottom-(OffSetY * 2));

    Result:=IntersectRect( pR^, R1, R2 );
   end
  else begin
        Result:=( NOT ((R1.Bottom - (OffSetY * 2) < R2.Top + OffSetY)
          or(R1.Top + OffSetY > R2.Bottom - (OffSetY * 2))
           or( R1.Right - (OffSetX * 2) < R2.Left + OffSetX)
            or( R1.Left + OffSetX > R2.Right - (OffSetX * 2))));
       end;
end;

function CheckImageCollision( R1, R2 : TImage; pR : PRect = nil; OffSetY : LongInt = 0; OffSetX : LongInt = 0): boolean; {overload;}
Var
 B1,B2 : TRect;
begin
 B1 :=  R1.BoundsRect.Round;
 B2 :=  R2.BoundsRect.Round;
  if( pR <> nil ) then
   begin
    with( B1 ) do
     B1:=Rect( Left+OffSetX, Top+OffSetY, Right-(OffSetX * 2), Bottom-(OffSetY * 2));
    with( B2 ) do
     B2:=Rect( Left+OffSetX, Top+OffSetY, Right-(OffSetX * 2), Bottom-(OffSetY * 2));

    Result:=IntersectRect( pR^, B1, B2 );
   end
  else begin
        Result:=( NOT ((B1.Bottom - (OffSetY * 2) < B2.Top + OffSetY)
          or(B1.Top + OffSetY > B2.Bottom - (OffSetY * 2))
           or( B1.Right - (OffSetX * 2) < B2.Left + OffSetX)
            or( B1.Left + OffSetX > B2.Right - (OffSetX * 2))));
       end;
end;



end.

Kullanımını;

If CheckImageCollision(ImageOyuncu,ImageDusman) Then
 ShowMessage('Çarpıştık loo');

Şeklinde kullanabilirsiniz.

Temel mantığı objelerin üst üste çıkıp çıkmadıklarını kontrol ediyor. Bu yüzden gerekli kontrolleri sağlamazsanız obje üst üste gelince uyarıyı verecektir. Peki o kontrolleri nasıl sağlarız;
Diyelim ki bir ana karakterimiz(ImageAnaKarakter) bir de duvarımız(ImageDuvar) ve son olarak bir adet butonumuz(Button1). Butonun onclick olayına;

 

procedure TForm1.Button1Click(Sender: TObject);
var
  eskiX,eskiY : Integer;
begin
  eskiX := ImageAnaKarakter.Position.X;  //Ana karakterimizin hareket etmeden önceki x pozisyonu
  eskiY := ImageAnaKarakter.Position.Y;  //Ana karakterimizin hareket etmeden önceki y pozisyonu
  ImageAnaKarakter.Position.X := ImageAnaKarakter.Position.X + 10;  //Ana karakterimizi sağa(+x) doğru 10 koordinat ilerletiyoruz
  If CheckImageCollision(ImageAnaKarakter,ImageDuvar) Then  // Çarpışma var mı? Eğer varsa;
  Begin
    ImageAnaKarakter.Position.X := eskiX;  //Ana karakterimizi geri x pozisyonuna çektik
    ImageAnaKarakter.Position.Y := eskiY;  //Ana karakterimizi geri x pozisyonuna çektik
  End;
end;

 

Şimdiiiii….

Bu işlemi yaptığımızda ImageAnaKarakter nesnemiz duvarın üzerine gelir gelmez; geri eski pozisyonuna dönecektir. Belki iyi bir işlemcide bu görünmeyecektir bile şip şak ekran geçişi sağlanacaktır fakat çok çirkin ve amatör bir görüntü ortaya çıkabilir. Bunu gidermek ve bir adım ileriye gitmemiz için tabi ki kod değil mantık vereceğim (KötüAdamGülüşü.png);

Dinamik olarak bir image objesi oluşturup ImageAnaKarakter’in değerlerini ona aktarıyoruz. Sonra dinamik image objesine +x düzleminde 10 koordinat ekliyoruz. Ve çarpışma kontrolünü yapan fonksiyonumuza dinamik image objemizin adını vererek kontrol ettiriyoruz. Örneğin;

 If not CheckImageCollision(ImageDinamikGoruntu,ImageDuvar) Then

Daha sonra bu if şart döngümüze ImageAnaKarakter.Position.X := ImageAnaKarakter.Position.X + 10; şeklinde ekleme yapıyoruz.

Peki bunu yaptık ne oldu? Bunun sonucunda karakter görüntümüz duvarın üzerine çıkmadan sanki +10 değer sağ taraftaymış gibi çarpışmayı kontrol etti ve, eğer çarpışma varsa olduğu yerde kaldı, eğer yoksa da 10 birim sağa gitti.

Her şey çok güzel; Peki bir sonra ki adam?

Eğer ImageAnaKarakter, ImageDuvar objesine 7 birim uzaklıktaysa ne olacak? Görüntü 7 birim geriden donup kalacak yani ilerleyemeyecek. İşte bunun için arada ki mesafe farkını hesaplayıp ImageAnaKarakter objemizi o kadar ilerletmemiz lazım. Peki bunun mantığını verecek miyim? Tabi ki HAYIR 😀

Çünkü ben de daha üzerinde durmadım şimdi yazarken aklıma geldi. Saat geç olduğu için ileri ki yazılarımızın birinde ara not olarak geçerim. Yazım hataları için özür dilerim normalde baştan sona okur düzeltirdim fakat saat geç oldu.

Allah’a emanet olsun mucx

Written by anfidya

Mayıs 1st, 2016 at 2:43 am

Delphi İle İlgili Aklınızda ki Sorular ve Cevapları

one comment

Selam köylüler,

Beş&altı yıl önce Delphi-Pascal dilini öğrenmeye başlarken aklımda bir sürü soru vardı ve soracak kimsem yoktu :/ Daha sonra kendimi geliştirirken bir çok kaynak araştırmak zorunda kaldım haliyle ve bir sürü benim gibi eziğin sorusuyla karşılaştım. Üzüldünüz değil mi? Üzülün bence de..

Neyse neyse artık sevinebilirsiniz çünkü bu soruların hepsini birazdan soru cevap yapacağım ^_^ hadi iyisiniz gene (:

1) Delphi mi C++ mı VB mi?

Cevap net olarak yok! Kime göre neye göre bu ayrımı yapacağımız belli değil çünkü. Ama basitçe hepsinin +/- yönlerinden bahsetmek gerekir;
Delphi: XE8 sürümü şuan son sürüm konumunda. Android, iOS, MacOS, WinOS ve nice platformlar için çıktı alabiliyoruz. Yazması kolay, okuması kolay. Kaynak olarak biraz sıkıntılı. Bağımsızlığı %99 konumunda.
C++: Kardeş vallaha işin zor. Yığınla derleyicisi ve birinde yazdığın kodu diğeri okumuyor bazen. Hafıza yönetimi sana ait yani profesyonelleşene kadar performans sıkıntıları olacaktır. Platform bağımsızlığı var ama yok. Kaynak olarak imkanları süper süper süper!
VB: Ya geç diğer soruya Allah aşkına VB nedir yahu!!!

2) Delphi ile işletim sistemi yazılır mı?

Yazdın da tutan mı oldu güzel kardeşim! Yazılır tabi fakat seni beni aşar o işler hadi sen dön kendi projelerine.. Şaka maka harbi harbi yazılır. Hatta var olan bir işletim sistemine kat bile çıkabilirsiniz.

3) Delphi bilen birinin iş bulma olasılığı nedir?

Sen kendini geliştirip, adam gibi kodlama yapar, standartlara uyar, sürekli bir araştırma ve öğrenme içinde olursan kardeşim bildiğin dilin hiç bir önemi yok. Hangi dille yazarsan yaz sonuç olarak hepsi ASM ye dönüştüğü için tüm olay sende bitiyor. Hea birde bazı “denyolar” var, yok efendim Delphi ile iş bulamazsın, yok efendim Delphi eskide kaldı falan filan.. Yavrucum Delphi ile yürü sen işin nasipse Allah verir zaten 😉

4) Delphi öldü mü?

Sence ölmüş mü? Eğer biri size Delphi ölmüş derse FireMonkey kütüphanesini kafasına fırlatabilirsiniz (: Ben ölmeden Delphi’de ölmez, hala kullanan biri olur.

5) Delphi neden popüler değil?

Heh işte şimdi diğer dört sorunun neden sorulduğuna dair psikolojik yönlere daha derinlere, çocukluğunuza dönüyoruz gençler..

Bir dilin popüler olması için onu kullanan amelenin yani aceminin çok olması yeterli. Şimdi ne demek bu? Bir dili işlevsel kılan; o dil için eklenti üretendir. Yani işi bilen yazılımcıdır. Peki popülerleştiren kimdir? Cevap verdik ya kardeşim!!! Örneğin C# neden ülkemizde bu kadar ünlü oldu? Çünkü okullarda öğretilmeye başlandı çünkü Microsoft destekli bir dil çünkü Unity oyun motorları gibi programlar script dili olarak kullanıyor. Yani kullanıcısı adam gibi geliştirmiyor, sürekli üretim yapıyor. Ülkemizde C#’ın adını bilen sayısı Unity oyun motoru sayesinde arttı (: Dikkat edin dili bilen değil adını bilen! çünkü insanlar öğrenmiyorlar. Tüm olay copy/paste. Hea bu dil C# değil de Delphi olsaydı, durum aynı olacaktı. Okullarda yazılım eğitimi veren hocalar bir “s.kten” anlamadıkları için kendi çünkü ufak dünyalarında ki bilgilerle ekmek kazanmaya çalışıyorlar. Peki Delphi öğreten bir okul yok mu? Var tabi. Ama orada ki hocalarda çakmıyor yazılımdan (: Bakın, araştırın hepsini, göreceksiniz ki 3-5 kişi anca çıkar akademik olarak hayvani bir projenin içerisinde olan…

5) Delphi geleceğin dili olabilir mi?

Olamaz kardeşim. Bir kere Delphi editörünü ve dilini geliştiren firmalarda hiç bir zaman kalite olmadı. Hepsi çıkarını düşündü ve vizyonsuz hareket etti. Hala +500 dolar gibi başlangıç fiyatlarından editörü kakalamaya çalışıyorlar. Bu demektir ki; Sadece firmalar alsın kullansın bu yazılımı, tekil geliştiriciler de avuçlarını yalasınlar.

6) Delphi nasıl öğrenebilirim?

Bence; Bir kitap alarak başlayabilirsiniz. Eğer bütçe yoksa internette yığınla pdf formatında Delphi kitabı var. Ben rahmetli Fatih KÜÇÜKKELEPÇE’nin kitabı ile başlamıştım. Allah rahmet eylesin ve razı olsun ondan. Sayesinde lise ve üniversite yıllarım cebimde para dolu geçti..

Genel olarak; Video, blog ve kitap üzerinden öğrenebilirsiniz. Nereden başlama konusunda zorluklar olacaktır. Önce Delphi 7 yi indirin derim. Delphi 7 editörü efsanedir. İnternette en çok Delphi 7 ile uyumlu örnek kodlar vardır. Win 95 ten Win10 a kadar derleme yaparsınız native olarak. Editörü iyice inceleyin. Ne nedir internetten öğrenin. Bu kullanacağınız arabayı incelemeye benzer. Sinyan kolu nerede bilmiyorsanız, şerit değiştirirken o kolun size.. neyse işte öyle öğrenin her yerini. Daha sonra ufak ufak kodlar çalıp çırpın oradan buradan. Döngüleri öğrenmekle başlayın. Tüm olay döngülerde. Mesela for to do olayı var. Bu bir sayıdan başlayıp kendinden büyük başka bir sayıya kadar belirlediğiniz kodları çalıştırır, yani on defa aynı kodu çalıştırmanızı sağlar gibi gibi. Ben bu olayı Timer(zamanlayıcı) ile yapıyordum bilmeden önce (: Ne kadar salakça değil mi? Zamanlayıcı on defa çalışırdı ve ben onuncu döngüde zamanlayıcıyı durdururdum. İki satırlık kod olurdu bana on yirmi satır (:

7) Delphi ile mobil programlama nasıl?

Gayet BASİT!!! Vallaha basit arkadaşlar. Adamlar yapmış.

8) Delphi’nin yeni sürümüne para vermeli miyim?

Şimdi cebinde paran bolsa, bence ver arkadaş. Adamlar öyle yada böyle uğraşmışlar. Ama benim gibi fakirseniz; cevap çok basit, CRACK! Geliştirici firma adam gibi tekil geliştirici fiyatı belirlemezse böylece devam edeceğim.

9) Delphi bilmek bana hayatta ne kazandıracak?

Para.

10) Delphi öğrenmesi çok zor ne yapabilirim?

Altıncı sorunun cevabını tekrar okumanızda fayda görüyorum kuzum.

Allah’ın rahmeti ve bereketi üzerinize olsun (:

Written by anfidya

Eylül 7th, 2015 at 2:02 am

Posted in Genel

Selam gardaş..

leave a comment

Gerçekleri zorlamaya, basit şeylerden para kırmaya ve bol bol iman etmeye geldik..

Written by anfidya

Mayıs 6th, 2014 at 10:19 pm

Posted in Genel