Merhaba, Ziyaretçi. Lütfen giriş yapın veya üye olun.

Kullanıcı adınızı, parolanızı ve aktif kalma süresini giriniz

  Gelişmiş Arama
insanın içinde varsa, commodore.gen.tr açığa çıkarır bunu.. bir nevi retro olaylarının dolunayıyız.(Arda)
commodore.gen.trCommodoreCommodore YazılımC64 assembler ve oyun yazma hikayesi
Sayfa: [1] 2 3   Aşağı git
Yazdır
Gönderen Konu: C64 assembler ve oyun yazma hikayesi  (Okunma Sayısı 12149 defa)
0 Üye ve 1 Ziyaretçi konuyu incelemekte.
metaone
Üye
****
Mesaj Sayısı: 269



Üyelik Bilgileri
« : Mart 31, 2023, 01:30:58 ÖÖ »

Herkese merhaba…Son dönemlerde donanım ve diğer hususlar çokça tartışıldı forumda ama yazılım tarafı sanki unutulduı gibi. O yüzden bugün biraz yazılım kısmına bakalım istedim. Aslında yazılım derken de Commodore 64, assembly dili ve oyundan bahsetmek istiyorum. Bu post uzun hikaye gibi gelebilir, sıkabilir, şimdiden uyarayım Vakit varken dönen dönsün

Aslında hikaye şöyle başladı: Dave’s Garage kanalını izlerken bir bölümde pong makinası (devresi) yaptı
https://www.youtube.com/watch?v=BKkNiic4tzY
Benim de o sıra aklıma geldi, çocukken bir arkadaşımın evinde ilk kez görmüş ve çok hoşuma gitmişti, sonra nedense kısmet olmadı oynamak, bu nedenle canım çekti. Elimin altında da Commodore 64 var (emülatörleri saymıyorum, kusura bakmayın), e dedim herhalde vardır bir pong, oynarım. İndirdim 3-5 tane, bir kısmı fazlasıyla değiştirmiş, Arkanoid tarzı olanı var, BASIC’te yazılmış olanı derken hiçbiri hoşuma gitmedi. E dedim yahu 2 çubuk bir top, ne kadar zor olabilir ki kendimce bir pong yazmak (büyük lokma yemeden büyük konuşma demek lazım). Tabi bu oyunu oynamanın en iyi yolu da paddle tabii ki. Ona da baktım, yapması oldukça kolaymış. Hepi topu 470KOhm’luk potansiyometre (SID analog sinyallari dijitale çeviriyor), ben de Yazıcıoğlu’ndan aldım malzemeleri ve yaptım. Gel gör ki 5 TL’lik potansiyometre kendi içinde dalgalı bir seyir izliyor, örnek olarak durduğu yerde 100 göstermesi gerekirken 95-105 arası gidip geliyor. Gitarda kullandığım 350 TL’lik CTS marka kullanmamak için Aliexpress’ten getirttim orta halli birşey çünkü başka bulamadım burda. Bu da memleketimin düştüğü haller işte.

Orjinal Commodore paddle :


Aldığım malzemeler:


Bitmiş hali:


Sonradan Aliexpress’ten getirttiğim potansiyometleri kullandım:


Daha önceden alışkın olduğum C64 Prg Studio’yu açtım, standart başlangıçları yaptım, ekranı temizle, çubukları ve topu sprite olarak çiz (3 öbje olduğu için çarpışma testi falan da kolay olur diye), ekrana koy falan. Bunları hızlıca yaptım, sonra dedim oynatalım, oda tamam. Şimdi geldi sıra topun hareketine. Top her halükarda çarparak gideceği için (yani dümdüz gitmeyecek bir senaryo) 4 çapraz yöne birer rakam verdim. Başladıktan sonra alt ve üst koordinat kontrolü yaparak yön değiştirttim, keza çubuklara çarpınca da. Şöyle bir kontrol rutini aslında:

Kod:
LDA BALLDIRECTION       ; TOPUN YÖNÜNÜ BİR DEĞİŞKENDE TUTTUM
CMP #$01                         ; 1 İSE YUKARI SOL
BEQ BALL_UP_LEFT
CMP #$02                         ; 2 İSE AŞAĞI SOL
BEQ BALL_DOWN_LEFT
CMP #$03                         ; 3 İSE YUKARI SAĞ
BEQ BALL_UP_RIGHT
CMP #$04                          ; 4 İSE AŞAĞI SAĞ
BEQ BALL_DOWN_RIGHT
 RTS

Neyse ilk hareketleri tamamladım. Sonra sağ ve solda çubukları ötesine geçince ekrana skor yazdırdım. İyi de oyun ne zaman bitmeli? İki seçenek var: 1- İlk 10 (ya da her ne ise) sayıya ulaşınca  2- Belli bir süre geçince. Hadi dedim her seferinde farklı skorla bitirme imkanı olsun, o zaman bir geri sayım yapayım. Onu da interrupt’larla yapsam ne güzel olur, bu konuda pratik yaparım. Ama gel gör ki raster interrupt’lar yapmayı düşündüğüm başka işlerle çakıştı (ben çözmedim, ustası yapar illa ki). Biraz araştırınca CIA çipinden NMI interrupt’ının zaten saati olduğunu gördüm. Çok detaya girmeden, bu interrupt’ı kullanarak ekrana arka önde yapılan işten bağımsız arka planda saati basmasını sağladım. Gerçi durduramadım sonra ama Lemon64’de sorunca cevabı aldım.

(Devamı alta geliyor)
« Son Düzenleme: Mart 31, 2023, 01:36:44 ÖÖ Gönderen: metaone » Logged

metaone
Üye
****
Mesaj Sayısı: 269



Üyelik Bilgileri
« Yanıtla #1 : Mart 31, 2023, 01:32:23 ÖÖ »

Bu da tamamlanınca biraz oynamak için bilgisayar mühendisi arkadaşımı davet ettim, sağolsun test ve debugging’de üstüne tanımam. Ufak şeyleri hallettik, sonra sıra geldi açılara. Dedim ya yukarda 4 yöne çarparak gidiyor diye, tabi x ve y koordinatlarını birer azaltıp arttırarak gittiği için top hep 45 derecelik açıyla hareket ediyor. E bu da kısa sürede sıkacak ve tahmin edilebilir bir oyun demek. E beğenmediğim diğer pong’lar farklı açılarla hareket ettiriyor, hadi bakalım. Arkadaşımın önerisiyle antialiasing ve çizgi çizme için Bresenham algoritmasını kullanalım dedik. Ama bunun hesabını C64’e gerçek zamanlı yaptıracak halimiz yok. ChatGPT’ye bir kod hazırlattık, Python’da yazdı, Visual Studio’da çalıştırıp çizilen farklı açıdaki çizgilerin delta’larını alarak tablo haline getirdik. Sonra da topun çubuklara vurduğu yere bağlı olarak açı belirledim. Üst tarafına vurunca 45, ortada 15, altta 30 derece gibi. Daha rahat oynanabilir hale geldi sayılır. Son olarak da paddle yanı sıra joystick ile de oynama özelliği ekledim, ne de olsa herkes de paddle yok.



Şimdi oyun yazmak sırf kod değil tabii. Bunun giriş ekranı, basit ses efekti yanısıra girişte bir müzik olsa derken mecbur uğraşmaya başladım. Bitmap multicolor ekran için bulduğum bir resmi Timanthes ile Koala formatına çevirdim, daha doğrusu basit bir emojiden ekran yaptım ve bunu bitmap olarak yüklettim. Müziği de basit olsa bile kendim yapmak istedim. Goat Tracker aslında kullanabilen için çok güzel bir program ama uğraşıp öğrenmek lazım. Ben biraz basite kaçtım, C64 üzerinde çalışan SidWizard’la bir şarkı yaptım, bunu da player’ı ile kaydedip sonra IRQ ile her cycle’da çağırıp çaldırabiliyorsunuz. İşte herşeyin en basitini ihtiva eden bir oyun haline geldi. Ama yazarken kafa patlattığım, yazdıktan sonra neden çalışmadığını keşfettiğim bir süreç oldu, akşamları uğraşarak 1 ayda getirebildim bu hale. Bu süreçte kullandığım programları ve yayınları sıralarsam:

- C64 Prg Studio : Assembler yazma, ekran ve sprite tasarımı, ses efekti konusunda güzel bir paket sunuyor.
- VICE: number 1 emülatör
- C64 Debugger: Çok faydalı, anlık durumu görmek, hafızayı incelemek, değişik hızlarda (%10,%20,%50) çalıştırıp detayları görmek için ideal.
- Timanthes: Bitmap grafikleri Koala formatına çevirip yüklemek için kullandım.
- SidWizard : C64’te çalışan bir tracker, müzik yapmak için kullandım.
- “C64 Programmer’s Reference Guide”, “Compute’s Mapping the Commodore 64” ve “Compute’s Programming the Commodore 64 the Definitive Guide”. Bu 3 kitap ihtiyaç duyulabilecek her şeyi verebiliyor. Zaten Türkçe kaynak yok gibi, olanlar da yabancı kaynaklardan yalandan çevirme (bu forumda açıklama yazan kişileri tenzih ederim).

C64 Debugger:



Oyun haliyle 2 kişilik, henüz bilgisayarı nasıl oynatırım fikrim yok. Yani aslında var ama aklımdakini yazarsam oyun fazlasıyla zor olur, o yüzden 2 kişilik olarak bıraktım. Kodlarda olabildiğince açıklama yazmaya çalıştım, ama İngilizce. Maalesef araştırmalarım sırasında yabancı site gezmekten, İngilizce okumaktan ve yabancı forumlarda tartışmaktan Türkçe yazmak anlamsız gelmeye başlıyor, ukalalık olarak görmezseniz sevinirim. Dediğim gibi, bu konudaki Türkçe kaynaklar az, olanları da okuduğum zaman ben anlayamıyorum.

Bir de kısaca bu oyun sonrasına değineyim. C64 Prg Studio gayet güzel ama yeni yazılan oyunların kodlarına bakarken sık sık Kick Assembler’a rastlıyordum, biraz ona bakayım dedim. Gerçekten de o ayrı bir dünyaymış zira kodu Java kullanarak derlediği için high level dil özelliklerini kullanabiliyorsunuz. Oturdum biraz onu çalıştım, yeni kod yazma ortamımı da şöyle geliştirdim:

- Sublime Text: Kod yazma (Visual Studio da denedim ama bana kolay gelmedi)
- Kick Assembler: Kurması ve ayarlaması da gayet kolay
- C64 Debugger: Olmazsa olmaz
- Charpad/Spritepad: Ekran ve sprite tasarımı için güzel bir paket. Pro versiyonunu aldım.
- SidFx: Ses efekti üretmek, dosyasını kaydetmek ve sonra IRQ ile çağırmak için kullandım. Birden çok ses üretebilirsiniz, sonra parametrelerle yaptığınız efektleri istediğiniz kanaldan (ki hepi topu 3 kanal) çaldırabilirsiniz.

Charpad’i ve onunla gelen ekran örneklerini incelerken karakter setini yeniden tanımlayarak yapılmış örnekleri inceledim. Buradan esinlenip önce bir karakter yaratıp ona koşma/zıplama hareketleri yaptırdım. Arkadaşımın yine debugging ve ince ayar desteği ile ufak bir adam oynatma motoru oluştu. Şimdilik birkaç ekran tasarlayarak, içine de biraz Impossible Missionvari robot ekleyerek bir şeyler yapmaya çalışıyorum. Burdan bir oyun çıkar mı, yani çıkar tabi, onca güzel ve profesyonelce yazılmış platform oyunları adına atılmış adımlar içinde küçük bir adım olur, ama bana epey birşey katmış olur. Yayınlanabilir hale gelirse onu da paylaşırım isteyen olursa, onun da hikayesi başka.



Son olarak konuyu kapatmadan şunu söylemek isterim. Bu işe 2-3 sene önce başladığımda gözümde büyüyordu, geçmişte yap(a)madığım kodu şimdi mi öğrenecem derken bu noktalara geldim. Gerçi yazdığım kodun kesinlikle daha iyi yazılma ihtimali var, optimize edilebilir, daha efektif olabilir ama o da ayrı bir başlığın konusu... Niyeti olan, içinde ukde kalan varsa geç kalmadan girişsin. Yukarıda development ortamı için gerekenleri belirttim, indirip kurun, ufaktan başlayın. Biraz hareketlensin ortalık bu konuda da.

Kaynak kodlarıyla ilgilenen için Github, indirmek isteyenler için de itch.io adresleri imzamda görülebilir. Soru olursa da bunlarla ilgili elimden geldiğince cevaplarım. Buraya kadar okuyana zaten ödül vermek lazım bir şekilde

Sağlacakla kalın.
« Son Düzenleme: Mart 31, 2023, 01:38:10 ÖÖ Gönderen: metaone » Logged

Cengiz Demir
Uzman
*****
Mesaj Sayısı: 3.825



Üyelik Bilgileri
« Yanıtla #2 : Mart 31, 2023, 08:27:00 ÖÖ »

Elinize emeğinize sağlık.
Bir solukta olmasa bile iki solukta okudum Kahkaha

Hem Pongy hemde A Space Game i indirip denedim.

İkisi de hoş güzel olmuş.
Logged

witchdoktor
Uzman
*****
Mesaj Sayısı: 6.238



Üyelik Bilgileri
« Yanıtla #3 : Mart 31, 2023, 08:54:57 ÖÖ »

Baştan sona güzel bir çalışma olmuş, elinize sağlık, tebrikler. Detaylar ve tasarımdaki profesyonellik dikkat çekiyor.
« Son Düzenleme: Mart 31, 2023, 10:10:44 ÖÖ Gönderen: witchdoktor » Logged
Simon (Özay Turay)
Yönetici
*****
Mesaj Sayısı: 7.751


Commodore Forever


Üyelik Bilgileri WWW
« Yanıtla #4 : Mart 31, 2023, 09:49:14 ÖÖ »

Uzun zamandır forumda böyle tehlikeli düşünceler olmuyordu. Şimdi yine gaza getirdin bizi. Kahkaha

Şaka bir yana bu sıralar Unity öğrenmeye çalışıyorum ben de. Güzel uğraşlar bunlar. Tebrik ederim.
Logged

https://retrodergi.com - https://e-turay.com - https://karizmawow.e-turay.com

Retro: Commodore 64, Amiga 500, Amiga 1200
Retromsu: Wii, XBox360, XBox, PS3 Slim, PS2 FAT, PS1, PS Vita, Nintendo 3DS, Nintendo 2DS
wizofwor
Genel Yönetici
*****
Mesaj Sayısı: 4.782


Gosub ile gidilen yerden goto ile dönen adam


Üyelik Bilgileri WWW
« Yanıtla #5 : Mart 31, 2023, 10:10:31 ÖÖ »

Eline sağlık. Çok güzel görünüyor.

Pong YZ için topun nereye gittiğini hesaplayıp raketi aynı yönde ilerletmen yeterli. Tabi bilgisayarın yenilebilir olması için tepki süresi ve hesaplama hatası eklemek gerekiyor.

Şurada güzel bir örnek var:
https://codeincomplete.com/articles/javascript-pong/part5/
Logged

Aykiri1
Uzman
*****
Mesaj Sayısı: 1.138



Üyelik Bilgileri
« Yanıtla #6 : Mart 31, 2023, 11:26:21 ÖÖ »

tebrikler başarılarınızın devamını dilerim emeğinize sağlık
Logged
metaone
Üye
****
Mesaj Sayısı: 269



Üyelik Bilgileri
« Yanıtla #7 : Mart 31, 2023, 11:37:35 ÖÖ »

Çok teşekkür ederim hepinize. Bahsetmeye çalıştığım üzere bir şeyler öğrenmek üzere çıktığım yoldaki iddiasız çalışmalar diyorum ben... Ama bu yolda yalnız yürümemek için de biraz gaz vermeye çalışıyorum Umarım alan olur Kahkaha

Pong YZ için topun nereye gittiğini hesaplayıp raketi aynı yönde ilerletmen yeterli. Tabi bilgisayarın yenilebilir olması için tepki süresi ve hesaplama hatası eklemek gerekiyor.

Şurada güzel bir örnek var:
https://codeincomplete.com/articles/javascript-pong/part5/
Buraya bakıp çalışmam lazım... Açıkçası bir deneme yapmıştım ama üzerine fazla düşemediğim için bilgisayar oyuncusu, diğer oyuncu vurduktan sonra  standart olarak bulunduğu yerden topa hamle yapıyor ve kaçırmıyordu. Biraz delay verdiğimde de bariz şekilde (delay süresince) bekleyip hamle yapıyordu ama gözüme güzel görünmedi, yani karşıda bir "human player" var gibi olmadığı için vazgeçtim. Daha akıllı bir algoritma lazım, o yüzden çalışmam lazım
Logged

MC_Skywalker
Üye
***
Mesaj Sayısı: 60



Üyelik Bilgileri
« Yanıtla #8 : Mart 31, 2023, 13:26:18 ÖS »

Tebrikler. Ellerinize sağlık.
Logged
hüseyinc64
Üye
**
Mesaj Sayısı: 44



Üyelik Bilgileri
« Yanıtla #9 : Nisan 02, 2023, 02:21:11 ÖÖ »

 hocam tebrikler elinize sağlık yazıyı baştan sona büyük bir keyifle okudum c64 de assemblyde oyun yaz kod,grafik,müzik birde uğraş kendi imkanlarınla 2023 yılında paddle yap kesinlikle commodore 64  üstün hizmet madalyası takılacak birisin  Kahkaha
Logged
mavi yıldırım
Üye
***
Mesaj Sayısı: 74


Üyelik Bilgileri
« Yanıtla #10 : Nisan 02, 2023, 17:35:26 ÖS »

tebrik ederim gerçekten güzel bir çalışma olmuş
Logged
Oğuzhan
Genel Yönetici
*****
Mesaj Sayısı: 5.126


There's no place like 127.0.0.1


Üyelik Bilgileri
« Yanıtla #11 : Nisan 02, 2023, 19:38:40 ÖS »

Bir solukta okudum. Oyunları deneyince mutlaka deneyimlerimi ve yorumlarımı paylaşacağım. Tebrik ederim.
Logged

Amiga 500/500+/1200/4000
Commodore 64
Atari 1040STe/Falcon 030/Jaguar/2600
Roland MT-32 Rev.A&B/SC-88
Sony PS 1-2-3-4-5/PSP/PVM 9"/TV 9"/TV 11"
Sega SMS2FR/MD1FR/MD1JP/MD2/Saturn/Dreamcast/GG
Nintendo NES/SNES/DMG/GBC/GBP/GBA/GBASP
alidereli
Üye
***
Mesaj Sayısı: 128



Üyelik Bilgileri
« Yanıtla #12 : Nisan 02, 2023, 20:40:40 ÖS »

@metaone bu güzel çalışmanızı tebrik ediyorum ve başarılarınızın devamını diliyorum teşekkürler.
Logged
Theoden (CYON4D)
Deneyimli
*****
Mesaj Sayısı: 1.867



Üyelik Bilgileri WWW
« Yanıtla #13 : Nisan 03, 2023, 11:29:29 ÖÖ »

Elinize sağlık çok güzel ve keyifli bir çalışma olmuş.

Bresenham algoritmasını C64'de "lookup table" metodu ile kullanmanız çok güzel. Bu tip lookup table'lar eski bilgisayarlar ve konsollarda çok yaygın kullanılıyordu.

Başlangıç olarak, tek kişilik oyun modu için yenildikçe daha az hata yapan ve daha hızlı tepki vermeye başlayan basit bir AI rutini yazabilirsiniz.
AI için "finite state machine" başlığını araştırmanızı tavsiye ederim.

Kendi geliştirdiğim oyunlar için tasarladığım AI oyunu kusursuz bir şekilde oynamasın diye bir "error margin" algoritması yazmıştım. Kısaca AI'ın tepki verme süresine random olarak ufak gecikmeler ve hatalar ekliyorum, bu da kusursuz bir makineye karşı değil de arada hata yapabilen bir oyuncuya karşı oynuyorsunuz hissi veriyor.
« Son Düzenleme: Nisan 04, 2023, 11:23:39 ÖÖ Gönderen: Theoden (CYON4D) » Logged

metaone
Üye
****
Mesaj Sayısı: 269



Üyelik Bilgileri
« Yanıtla #14 : Nisan 03, 2023, 16:51:21 ÖS »

Değerli yorum ve katkılarınız için teşekkür ederim... Bu AI işine ayrıca bakacağım. Şu anda platform oyunu üzerinde çalışıyorum biraz, toparlanıyor gibi görünüyor (yani kendi çapımda yine, amatörce) ama goattracker'ı anlayıp da hem müzik hem ses efektlerini tek dosyada toparlamak için imanım gevredi. Çözdüm sonunda neyse, bakalım ne çıkacak Kahkaha
Logged

Sayfa: [1] 2 3   Yukarı git
Yazdır
Gitmek istediğiniz yer: