Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Firebase Iot Game

GDG SPb
September 30, 2017

Firebase Iot Game

Наш проект — уникальная настольная игра с “умными” компонентами. Собрана она из Firebase, Android, NFC меток, ESP 8266, RFID-RC522. Мы не только расскажем про особенности работы с Firebase с разных устройств и Firebase-функции, но и покажем, как эта игра работает.

GDG SPb

September 30, 2017
Tweet

More Decks by GDG SPb

Other Decks in Programming

Transcript

  1. Что мешает погружению в игру? • необходимость запоминать правила •

    подсчет значений “в уме” • время на разбирательства в системе, записи, рисование... • невозможность создать достаточно полную и реалистичную модель • наличие у игроков мета-информации о системе и правилах
  2. effects - эффекты, наложенные на игрока на настоящий момент 0,

    1 - игроки hp, mana - статы на настоящий момент
  3. NodeMcu v3 • Базируется на ESP, что позволяет напрямую подключаться

    к Firebase по Wi-Fi • Содержит прошивальщик - можно заливать прошивки через USB • Arduino совместимая - можно использовать библиотеки для Arduino • Можно подключить модуль чтения RFID/NFC через SPI Node D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 Arduino 16 5 4 0 2 14 12 13 15 3 1
  4. RFID-RC522 • Решение для чтения RFID и NFC карт •

    5 пинов для взаимодействия • Количество пинов подходит для реализации прототипа RC522 SDA SCK MOSI MISO IRQ GND RST 3.3v Node D0 D5 D6 D7 - G D1 3V
  5. Работа с RC522 /* Инициализация */ rc522 = new MFRC522(D3,

    D4); // Устанавливаем пины SPI.begin(); // Включаем шину rc522->PCD_Init(); // Включаем модуль rc522->PCD_SetAntennaGain(rc522->RxGain_max); // Максимум мощности /* Ждем карточку */ if(rc522->PICC_IsNewCardPresent() && rc522->PICC_ReadCardSerial()) { // в rc522->uid будет ID нашей карточки. }
  6. Работа с Firebase • ESP8266WiFi - подключение к сети •

    FirebaseArduino - работа с базой данных Arduino WiFi.begin(WIFI_SSID, WIFI_PASSWORD); while (WiFi.status() != WL_CONNECTED) { delay(500); } Firebase.begin(FIREBASE_HOST);
  7. FirebaseArduino: CRUD /* Create, update */ Firebase.setInt("battles/" + battleId +

    "/states/" + player + "/hp", 50); /* Read */ turnNumber = Firebase.getInt("battles/" + battleId + "/last_turn"); /* Delete */ Firebase.remove("battles/" + battleId + "/turns");
  8. FirebaseArduino: запись JSON StaticJsonBuffer<200> jsonBuffer; JsonObject& turn = jsonBuffer.createObject(); turn["card"]

    = cardUid; turn["target"] = player; Firebase.set("battles/" + battleId + "/turns/" + turnNumber, turn);
  9. RX + Kotlin Extentions fun <T> DatabaseReference.getValueObservable(clazz: GenericTypeIndicator<T>, defaultValue: T)

    = Observable.create<T> { subscriber -> this.addValueEventListener(object : ValueEventListener { override fun onDataChange(dataSnapshot: DataSnapshot?) { Log.v("getValueObservable", "data = ${dataSnapshot.toString()}") if (dataSnapshot != null) subscriber.onNext(dataSnapshot.getValue(clazz)) else subscriber.onNext(defaultValue) } override fun onCancelled(error: DatabaseError) { subscriber.onError(error.toException()) } }) }!!
  10. RX + Kotlin Extentions fun <T> DatabaseReference.getValueSingle(clazz: GenericTypeIndicator<T>, defaultValue: T)

    = {} fun DatabaseReference.getKeysListObservable() = {} fun <T> Query.getLastValueObservable(clazz: GenericTypeIndicator<T>, defaultValue: T) = {}
  11. FirebaseDatabase .getInstance() .reference .child("battles") .getKeysListObservable() .subscribe({ if (it.isEmpty()) { //

    ... } else { // ... battlesList.adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, it) battlesList.onItemClickListener = { _, _, i, _ -> PlayerActivity.start(this, it[i]) } } }, { // Failed to read value Log.w(TAG, "Failed to read value.", it) })
  12. Firebase functions - обработка нового хода (мана, присваивание эффектов) exports.newTurn

    = functions .database .ref('/battles/{battleId}/turns/{turnId}') .onWrite(event => { ... }); - применение эффектов function playEffects(player) { ... } - удаление тех эффектов, которые закончились exports.effectFinished = functions .database .ref('/battles/{battleId}/states/{playerId}/effects/{effectIndex}') .onWrite(event => { ... });