İlk commit: Stepstead Godot istemci (4.6 Mobile)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
jts 2026-07-11 11:31:35 +03:00
commit 6a1706051d
346 changed files with 14415 additions and 0 deletions

View file

@ -0,0 +1,75 @@
# Stepstead — iOS Pedometer Plugin (CMPedometer)
Godot 4 iOS plugin. `Pedometer` singleton'ı, `autoload/pedometer.gd` ile aynı
sözleşmeyi sağlar: `is_available / start / stop / get_step_count`.
**Kaynak dosyalar:**
- `pedometer.h`, `pedometer.mm` — singleton + CMPedometer mantığı
- `pedometer_module.h`, `pedometer_module.mm` — init/deinit (singleton kaydı)
- `pedometer.gdip` — plugin config (CoreMotion.framework + NSMotionUsageDescription)
> ⚠️ CMPedometer **iOS Simulator'da çalışmaz** (`is_available()` = false).
> Gerçek cihaz gerekir → **iPhone 13 ile test.**
---
## Derleme — godot-ios-plugins harness (Mac, önerilen)
**Gereksinim:** Mac + Xcode + command line tools + SCons (`brew install scons`).
```bash
# 1. Resmi iOS plugin harness'ını klonla
git clone https://github.com/godotengine/godot-ios-plugins.git
cd godot-ios-plugins
# 2. Godot 4.6 başlık dosyalarını üret (godot kaynağını çeker)
./scripts/generate_headers.sh 4.6.0.stable # repo README'sindeki sürüm formatı
# 3. Bu plugin'i plugins/ altına kopyala
cp -r /path/Stepstead/native/pedometer-ios plugins/pedometer
# 4. Derle (arm64, release) — çıktı bin/pedometer.*.a
scons target=template_release arch=arm64 plugin=pedometer version=4.6
scons target=template_debug arch=arm64 plugin=pedometer version=4.6
```
> SCons komutunun tam imzası harness sürümüne göre değişebilir; repo
> README'sini esas al. Çatı `plugins/pedometer/` altındaki tüm `.mm`
> dosyalarını otomatik derler.
---
## Godot projesine ekleme
1. Çıktıları projeye koy:
```
res://ios/plugins/pedometer/pedometer.a
res://ios/plugins/pedometer/pedometer.gdip
```
(`.gdip` zaten bu klasörde — `.a` ile birlikte kopyala.)
2. Godot: **Project > Export > iOS** preset'inde **Plugins** sekmesinde
`Pedometer` işaretli olmalı.
3. `.gdip` `NSMotionUsageDescription`'ı otomatik Info.plist'e ekler.
(Apple izni: ilk `start()` çağrısında sistem motion izni sorar.)
---
## iPhone 13'e yükleme (gerçek test)
1. Godot'ta iOS export → Xcode projesi üretir.
2. Xcode'da aç → **Signing & Capabilities**'da Apple ID (ücretsiz hesap olur,
7 günlük provisioning) ile imzala.
3. iPhone 13'ü kabloyla bağla → Xcode'da hedef cihaz seç → **Run**.
4. Oyunda login → `Pedometer.start()` (world.gd otomatik çağırır) →
sistem "Motion & Fitness" izni sorar → izin ver.
5. Telefonu cebe at, yürü → adım bakiyesi 30 sn'de bir `/world/sync-steps`
ile artar (sunucu anti-cheat tavanı 250/dk uygular).
---
## İleride (enhancement)
`startPedometerUpdatesFromDate:` uygulama açıkken sayar. Arka planda/kapalıyken
atılan adımları toparlamak için `queryPedometerDataFromDate:toDate:withHandler:`
ile son sync zamanından şu ana kadarki geçmişi çekmek gerekir (iOS 7 günlük
adım geçmişi tutar). MVP'de yok — `get_step_count` sadece oturum sayımı.

View file

@ -0,0 +1,15 @@
[config]
name="Pedometer"
binary="pedometer.a"
initialization="pedometer_init_module"
deinitialization="pedometer_deinit_module"
[dependencies]
linked=[]
embedded=[]
system=["CoreMotion.framework"]
capabilities=[]
files=[]
[plist]
NSMotionUsageDescription:string="Yürüyüş adımlarınızı sayarak oyunda ilerlemenizi sağlar."

View file

@ -0,0 +1,35 @@
// Stepstead — iOS Pedometer plugin (CMPedometer)
// Godot 4 iOS plugin. Singleton adı: "Pedometer"
//
// GDScript sözleşmesi (autoload/pedometer.gd ile eşleşir):
// bool is_available()
// void start()
// void stop()
// int get_step_count() -> oturum başından beri kümülatif adım
#ifndef STEPSTEAD_PEDOMETER_H
#define STEPSTEAD_PEDOMETER_H
#include "core/object/class_db.h"
#include "core/object/object.h"
class Pedometer : public Object {
GDCLASS(Pedometer, Object);
static Pedometer *instance;
protected:
static void _bind_methods();
public:
bool is_available();
void start();
void stop();
int get_step_count();
static Pedometer *get_singleton();
Pedometer();
~Pedometer();
};
#endif // STEPSTEAD_PEDOMETER_H

View file

@ -0,0 +1,85 @@
// Stepstead — iOS Pedometer plugin (CMPedometer) implementasyonu.
#import "pedometer.h"
#import <CoreMotion/CoreMotion.h>
#import <Foundation/Foundation.h>
// Objective-C tarafı: CMPedometer'ı tutar, adım sayısını günceller.
@interface StepsteadPedometer : NSObject
@property(nonatomic, strong) CMPedometer *pedometer;
@property(nonatomic, assign) int stepCount;
@property(nonatomic, strong) NSDate *sessionStart;
@property(nonatomic, assign) BOOL running;
@end
@implementation StepsteadPedometer
@end
static StepsteadPedometer *_ped = nil;
Pedometer *Pedometer::instance = nullptr;
void Pedometer::_bind_methods() {
ClassDB::bind_method(D_METHOD("is_available"), &Pedometer::is_available);
ClassDB::bind_method(D_METHOD("start"), &Pedometer::start);
ClassDB::bind_method(D_METHOD("stop"), &Pedometer::stop);
ClassDB::bind_method(D_METHOD("get_step_count"), &Pedometer::get_step_count);
}
bool Pedometer::is_available() {
// Not: iOS Simulator'da daima false döner — gerçek cihaz gerekir.
return [CMPedometer isStepCountingAvailable] ? true : false;
}
void Pedometer::start() {
if (![CMPedometer isStepCountingAvailable]) {
return;
}
if (_ped == nil) {
_ped = [[StepsteadPedometer alloc] init];
_ped.pedometer = [[CMPedometer alloc] init];
_ped.stepCount = 0;
}
if (_ped.running) {
return;
}
_ped.running = YES;
_ped.sessionStart = [NSDate date];
_ped.stepCount = 0;
// Uygulama açıkken canlı güncelleme. numberOfSteps = sessionStart'tan beri.
[_ped.pedometer startPedometerUpdatesFromDate:_ped.sessionStart
withHandler:^(CMPedometerData *_Nullable data, NSError *_Nullable error) {
if (data != nil && error == nil) {
_ped.stepCount = [data.numberOfSteps intValue];
}
}];
}
void Pedometer::stop() {
if (_ped != nil && _ped.running) {
[_ped.pedometer stopPedometerUpdates];
_ped.running = NO;
}
}
int Pedometer::get_step_count() {
return _ped != nil ? _ped.stepCount : 0;
}
Pedometer *Pedometer::get_singleton() {
return instance;
}
Pedometer::Pedometer() {
ERR_FAIL_COND(instance != nullptr);
instance = this;
}
Pedometer::~Pedometer() {
if (_ped != nil) {
[_ped.pedometer stopPedometerUpdates];
_ped = nil;
}
instance = nullptr;
}

View file

@ -0,0 +1,8 @@
// Plugin init/deinit — godot-ios-plugins çatısı bu fonksiyonları çağırır.
#ifndef STEPSTEAD_PEDOMETER_MODULE_H
#define STEPSTEAD_PEDOMETER_MODULE_H
void pedometer_init_module();
void pedometer_deinit_module();
#endif // STEPSTEAD_PEDOMETER_MODULE_H

View file

@ -0,0 +1,20 @@
#import "pedometer_module.h"
#import "pedometer.h"
#import "core/config/engine.h"
#import "core/object/class_db.h"
Pedometer *pedometer_singleton = nullptr;
void pedometer_init_module() {
ClassDB::register_class<Pedometer>();
pedometer_singleton = memnew(Pedometer);
Engine::get_singleton()->add_singleton(Engine::Singleton("Pedometer", pedometer_singleton));
}
void pedometer_deinit_module() {
if (pedometer_singleton) {
memdelete(pedometer_singleton);
pedometer_singleton = nullptr;
}
}