Cub3D

C
Grafik Programlama
Sistem Programlama
Cub3D

Kullanılan Teknolojiler

C
MinilibX
Raycasting

Proje Açıklaması

Cub3D, Wolfenstein 3D tarzında, Raycasting teknolojisi kullanarak gerçek zamanlı 3D görünüm oluşturan bir oyun motoru projesidir. Proje C99 standardında ve MinilibX grafik kütüphanesi kullanılarak yazılmıştır.

Digital Differential Analysis (DDA) algoritması kullanılarak oyuncunun bakış açısından ışın takipleri yapılır ve duvarların yüksekliği hesaplanarak doku kaplamasıyla ekrana çizilir.

  • Digital Differential Analysis (DDA) ve Raycasting algoritması sıfırdan kodlanarak 3D render yapıldı.
  • Duvarlara doku kaplama (Texture Mapping) ve karakter çarpışma (collision detection) fiziği yazıldı.
  • WASD tuşlarıyla akıcı hareket ve ok tuşlarıyla 360 derece kamera rotasyonu entegre edildi.

README.md

Cub3D

Wolfenstein 3D tarzında 3D raycasting oyun motoru

Cub3D, 42 okulu müfredatının bir parçası olarak geliştirilmiş, raycasting teknolojisi kullanarak 3D görünüm oluşturan bir oyun motorudur. Proje, Wolfenstein 3D'nin kullandığı klasik raycasting algoritmasını modern C dili ile implement eder.

📋 İçindekiler

✨ Özellikler

  • 3D Görünüm: Raycasting algoritması ile gerçek zamanlı 3D render
  • Texture Mapping: Duvarlara texture uygulama
  • Smooth Hareket: WASD tuşları ile akıcı hareket sistemi
  • Kamera Rotasyonu: Ok tuşları ile 360 derece dönebilme
  • Çarpışma Tespiti: Duvarlara çarpmayı önleyen fizik sistemi
  • Özelleştirilebilir Haritalar: .cub formatında kendi haritalarınızı oluşturabilme
  • Bellek Yönetimi: Otomatik garbage collector ile bellek sızıntısı önleme

🎮 Raycasting Nedir?

Raycasting, 1990'ların başında Wolfenstein 3D ve DOOM gibi oyunlarda kullanılan bir 3D render tekniğidir. Oyuncunun bakış açısından her piksel için bir "ışın" gönderilir ve bu ışının duvara çarpma mesafesi hesaplanır. Bu mesafeye göre duvarın yüksekliği belirlenir ve ekrana çizilir.

Avantajları:

  • Çok hızlı ve verimli
  • Basit matematik ile 3D görünüm
  • Düşük sistem gereksinimleri

🛠 Kullanılan Teknolojiler

  • C Dili: Ana programlama dili (C99 standardı)
  • MinilibX: Grafik kütüphanesi (X11 tabanlı)
  • Raycasting Algoritması: 3D görünüm oluşturma
  • DDA Algoritması: Işın takibi için Digital Differential Analysis
  • Makefile: Derleme otomasyonu

📦 Kurulum

Gereksinimler

  • GCC veya Clang derleyici
  • Make
  • MinilibX kütüphanesi
  • X11 (Linux)
  • Xext kütüphanesi

Linux'ta Kurulum

# Depoyu klonlayın
git clone https://github.com/kullaniciadi/cub3d.git
cd cub3d

# MinilibX'i derleyin
make -C minilibx-linux

# Projeyi derleyin
make

# Çalıştırın
./cub3D map.cub

Derleme Komutları

make        # Projeyi derler
make clean  # Object dosyalarını siler
make fclean # Tüm derleme çıktılarını siler
make re     # Temizler ve yeniden derler

🎯 Kullanım

Oyunu başlatmak için bir .cub harita dosyası belirtmeniz gerekir:

./cub3D haritalar/map.cub

Program, harita dosyasını okur, texture'ları yükler ve 3D görünümü oluşturur.

🎮 Kontroller

Tuş Fonksiyon
W İleri git
S Geri git
A Sola kayma (strafe left)
D Sağa kayma (strafe right)
Kamerayı sola döndür
Kamerayı sağa döndür
ESC Oyundan çık

🗺 Harita Formatı

Harita dosyaları .cub uzantılı olmalı ve şu formatta olmalıdır:

NO ./textures/wall1.xpm
SO ./textures/wall2.xpm
WE ./textures/wall3.xpm
EA ./textures/wall4.xpm

F 220,100,0
C 225,30,0

1111111111111111
1000000000000001
1000000000000001
100000N000000001
1000000000000001
1111111111111111

Texture Tanımlamaları

  • NO: Kuzey duvarı texture'ı
  • SO: Güney duvarı texture'ı
  • WE: Batı duvarı texture'ı
  • EA: Doğu duvarı texture'ı

Renk Tanımlamaları

  • F: Zemin rengi (RGB formatında: R,G,B)
  • C: Tavan rengi (RGB formatında: R,G,B)

Harita Karakterleri

  • 0: Boş alan (geçilebilir)
  • 1: Duvar (geçilemez)
  • N: Oyuncu başlangıç pozisyonu (Kuzeye bakıyor)
  • S: Oyuncu başlangıç pozisyonu (Güneye bakıyor)
  • E: Oyuncu başlangıç pozisyonu (Doğuya bakıyor)
  • W: Oyuncu başlangıç pozisyonu (Batıya bakıyor)

Önemli Kurallar:

  • Harita duvarlarla (1) çevrili olmalı
  • Tam olarak bir oyuncu başlangıç pozisyonu olmalı
  • Harita içinde boş satır olmamalı
  • Texture dosyaları .xpm formatında olmalı

📁 Proje Yapısı

cub3d/
├── src/                      # Ana kaynak dosyalar
│   ├── main.c               # Program giriş noktası
│   ├── raycasting.c         # Raycasting motoru
│   ├── raycasting_dda.c     # DDA algoritması
│   ├── raycasting_draw.c    # Çizim fonksiyonları
│   ├── movement.c           # Hareket kontrolleri
│   ├── move_wasd.c          # WASD hareket fonksiyonları
│   ├── is_valid_position.c  # Çarpışma tespiti
│   └── garbage_collector.c  # Bellek yönetimi
├── parser/                   # Harita parser
│   ├── parse_config.c       # Ana parser
│   ├── parse_texture.c      # Texture parser
│   ├── parse_color.c        # Renk parser
│   ├── parse_map.c          # Harita parser
│   ├── validate_map.c       # Harita validasyonu
│   ├── check_map.c          # Harita kontrolleri
│   ├── find_player.c        # Oyuncu pozisyonu bulma
│   ├── free.c               # Bellek temizleme
│   ├── newline.c            # Satır kontrolleri
│   └── parse_utils.c        # Yardımcı fonksiyonlar
├── initialize/               # Başlatma fonksiyonları
│   ├── init.c               # Genel başlatma
│   ├── init_cub3d.c         # Oyun başlatma
│   └── init_player.c        # Oyuncu başlatma
├── LIBFT/                    # Yardımcı kütüphane
│   ├── ft_atoi.c
│   ├── ft_split.c
│   ├── ft_strlen.c
│   └── get_next_line.c
├── includes/                 # Header dosyaları
│   └── cub3d.h              # Ana header
├── textures/                 # Texture dosyaları
│   ├── wall1.xpm
│   ├── wall2.xpm
│   ├── wall3.xpm
│   └── wall4.xpm
├── minilibx-linux/          # MinilibX kütüphanesi
├── Makefile                 # Derleme dosyası
└── map.cub                  # Örnek harita

🔧 Teknik Detaylar

Raycasting Algoritması

  1. Işın Yönü Hesaplama: Her ekran sütunu için kamera düzlemine göre ışın yönü hesaplanır
  2. DDA Algoritması: Işın, harita grid'inde ilerletilir ve duvara çarpana kadar devam eder
  3. Mesafe Hesaplama: Duvara olan dik mesafe (perpendicular wall distance) hesaplanır
  4. Duvar Yüksekliği: Mesafeye göre duvar yüksekliği belirlenir
  5. Texture Mapping: Uygun texture seçilir ve duvara uygulanır
  6. Çizim: Tavan, duvar ve zemin ekrana çizilir

Bellek Yönetimi

Proje, özel bir garbage collector sistemi kullanır:

  • Tüm malloc işlemleri ft_malloc ile yapılır
  • Her ayırma işlemi bir linked list'te takip edilir
  • Program sonunda veya hata durumunda ft_mem_cleanup ile tüm bellek otomatik temizlenir
  • Bellek sızıntısı riski minimize edilir

Optimizasyonlar

  • Delta Distance: Grid hücreleri arası mesafe önceden hesaplanır
  • Texture Caching: Texture verileri bellekte tutulur
  • Integer Aritmetiği: Mümkün olduğunda integer işlemler kullanılır

👨‍💻 Geliştirici Notları

  • 42 Norm: Kod, 42 okulu norm standartlarına uygun yazılmıştır
  • Bellek Sızıntısı: Valgrind ile test edilmiş, sızıntı yoktur
  • Hata Yönetimi: Tüm hata durumları kontrol edilir ve uygun mesajlar gösterilir
  • Modüler Yapı: Kod, bakım ve genişletme kolaylığı için modüler tasarlanmıştır

📝 Lisans

Bu proje 42 okulu müfredatının bir parçasıdır ve eğitim amaçlıdır.

🙏 Teşekkürler

  • Lode Vandevenne'nin raycasting tutorial'ı
  • 42 okulu topluluğu
  • MinilibX geliştiricileri

Not: Bu proje, 3D grafik programlama ve raycasting algoritmasını öğrenmek için mükemmel bir başlangıç noktasıdır. Kod üzerinde değişiklik yaparak kendi özelliklerinizi ekleyebilirsiniz!

cub3D