İlk commit: Stepstead Godot istemci (4.6 Mobile)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
commit
6a1706051d
346 changed files with 14415 additions and 0 deletions
75
native/pedometer-ios/README.md
Normal file
75
native/pedometer-ios/README.md
Normal 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ı.
|
||||
15
native/pedometer-ios/pedometer.gdip
Normal file
15
native/pedometer-ios/pedometer.gdip
Normal 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."
|
||||
35
native/pedometer-ios/pedometer.h
Normal file
35
native/pedometer-ios/pedometer.h
Normal 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
|
||||
85
native/pedometer-ios/pedometer.mm
Normal file
85
native/pedometer-ios/pedometer.mm
Normal 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;
|
||||
}
|
||||
8
native/pedometer-ios/pedometer_module.h
Normal file
8
native/pedometer-ios/pedometer_module.h
Normal 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
|
||||
20
native/pedometer-ios/pedometer_module.mm
Normal file
20
native/pedometer-ios/pedometer_module.mm
Normal 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;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue