Mini Space Shooter Yapımı (Adım Adım)
Bu bölümde C++ ile oyun geliştirme sürecini pratik bir projeyle öğreneceğiz. SFML kullanarak basit ama genişletilebilir bir 2D uzay oyunu yapacağız.
Amaç:
Oyuncu gemiyi kontrol eder, düşmanlardan kaçar, ateş eder ve skor toplar.
1) Oyun Fikri: Mini Space Shooter
Basit bir mekanik:
-
Oyuncu aşağıda sabit başlar.
-
Düşmanlar yukarıdan aşağı iner.
-
Oyuncu ateş eder.
-
Çarpışma olursa skor artar.
-
Amaç mümkün olduğunca uzun süre hayatta kalmak.
Küçük fikirler prototipleme için en doğru başlangıçtır.
2) Kullanacağımız Kütüphane
Projede SFML kullanacağız.
Resmi site:
https://www.sfml-dev.org
SFML şunları sağlar:
-
Grafik
-
Input
-
Ses
-
Pencere yönetimi
C++ ile oyun geliştirme için 2D tarafında oldukça uygundur.
3) Proje Yapısı
├─ main.cpp
├─ Game.h
├─ Game.cpp
├─ Player.h
├─ Player.cpp
├─ Enemy.h
├─ Enemy.cpp
├─ Bullet.h
├─ Bullet.cpp
├─ assets/
└─ saves/
Her sistem ayrı dosyada olmalı.
main.cpp sadece başlatma yapmalı.
4) Oyun Döngüsü (Game Loop)
Ana döngü her oyunun temelidir.
while (window.isOpen()) {
processEvents();
update();
render();
}
</code></pre>
Bu yapı:
-
Input alır
-
Oyun durumunu günceller
-
Ekrana çizer
5) Player Sınıfı
#pragma once
#include <SFML/Graphics.hpp>class Player {
public:
sf::Sprite sprite;
sf::Texture texture;
float speed = 300.f;
Player() {
texture.loadFromFile(“assets/player.png”);
sprite.setTexture(texture);
sprite.setPosition(400, 500);
}
void update(float dt) {
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
sprite.move(-speed * dt, 0);
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
sprite.move(speed * dt, 0);
}
};
</code></pre>
6) Bullet Sistemi
#pragma once
#include <SFML/Graphics.hpp>class Bullet {
public:
sf::CircleShape shape;
float speed = 500.f;
Bullet(float x, float y) {
shape.setRadius(5.f);
shape.setFillColor(sf::Color::Cyan);
shape.setPosition(x, y);
}
void update(float dt) {
shape.move(0, -speed * dt);
}
};
</code></pre>
7) Enemy Sistemi
#pragma once
#include <SFML/Graphics.hpp>class Enemy {
public:
sf::RectangleShape shape;
float speed = 200.f;
Enemy(float x, float y) {
shape.setSize({40.f, 40.f});
shape.setFillColor(sf::Color::Red);
shape.setPosition(x, y);
}
void update(float dt) {
shape.move(0, speed * dt);
}
};
</code></pre>
8) Çarpışma Kontrolü
if (bullet.shape.getGlobalBounds().intersects(
enemy.shape.getGlobalBounds())) {score += 10;
}
</code></pre>
Bu yapı basit ama etkilidir.
9) Skor Sistemi
sf::Font font;
sf::Text scoreText;font.loadFromFile(“assets/font.ttf”);
scoreText.setFont(font);
scoreText.setCharacterSize(24);
scoreText.setFillColor(sf::Color::White);
</code></pre>
update içinde:
scoreText.setString(“Score: ” + std::to_string(score));
</code></pre>
10) Save / Load Sistemi
Kaydetme
#include <fstream>void saveHighScore(int highScore) {
std::ofstream save(“saves/highscore.txt”);
if (save.is_open()) {
save << highScore;
save.close();
}
}
</code></pre>
Yükleme
#include <fstream>int loadHighScore() {
int highScore = 0;
std::ifstream load(“saves/highscore.txt”);
if (load.is_open()) {
load >> highScore;
load.close();
}
return highScore;
}
</code></pre>
11) FPS Limit
window.setFramerateLimit(60);
</code></pre>
Stabil 60 FPS yeterlidir.
Bir Cevap Yaz
E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir.