Skip to content

Capture_ar

رامي مناف edited this page Aug 27, 2020 · 3 revisions

الأمر التقاط

في بعض الحالات قد لا تحتاج لحفظ الصّفّ بالكامل لأنّ مهمّته الأساسيّة لا تكون تخزين البيانات, بالإضافة لكونك تحتاج لحفظ بيانات لن تتكرر كإعدادات برنامج مثلًا, ولنأخذ هذا الصّفّ كتوضيح:

public class Game {

    private int score;
    private Node world;
    private Node player;
    private String playerName;

    public void start(){
    //some code that load the world and the player character and start the game
    }

    public void killEnemy(){
        score++;
    }
}

يقوم هذا الصف عند إنشاء كائنٍ منه ثمّ تشغيله بتحميل شخصية اللاعب والعالم وبإعداد اللعبة بشكلٍ عامٍّ, ومهمة هذا الصّفّ ليست تخزين البيانات لكن سيكون من غير المنطقيّ إنشاء صفٍّ جديدٍ لنخزن فيه اسم اللاعب ونقاطه خاصّةً أننا لن نحتاج لتخزين الصّفّ أكثر من مرّةٍ, وهنا يأتي دور الأمر التقاط Capture, فمهمّته التقاط البيانات من حقولٍ معيّنةٍ في الصّفّ وحفظها في قاعدة البيانات, وعند تكرار عملية الحفظ سيقوم هذا الأمر تلقائيًّا بمسح البيانات القديمة وحفظ الجديدة, وهكذا لن يسمح لأكثر من لقطةٍ واحدةٍ للصفّ الواحد, ويكفي تحديد البيانات الّتي تريد حفظها بالعلامة Annotation المسمى Capturable, وتوجد هذه العلامة بالحزمة org.sofof.annotation, وهكذا سيكون الصف السابق بعد تحديد ما نريد حفظه هكذا:

public class Game {

   @Capturable
    private int score;
    private Node world;
    private Node player;
   @Capturable
    private String playerName;

    public void start(){
    //some code that load the world and the player character and start the game
    }

    public void killEnemy(){
        score++;
    }
}

بعدما ينتهي اللاعب من اللعبة ويضغط على زر الخروج يمكننا تنفيذ الكود التالي لالتقاط لقطةٍ للصفّ:

Capture.capture(session, gameObject);

ستعيد هذه الدّالّة واحدًا إن كان هناك لقطةٌ قديمةٌ لنفس الصّفّ وصفرًا في غير ذلك, وما يحدث بالضّبط أنّ هذه الدّالّة تبحث عن جميع الحقول المحدّدة بالعلامة Capturable سواءً بنفس الصّفّ أو بآبائه, وتقوم بتخزينها في قاعدة البيانات وتحديدًا يتمّ ربطها باسم الربط SofofCapture, ولتحميل البيانات مرّةً أخرى يجب عليك تنفيذ الدّالّة الإستاتيكيّة load والّتي تستقبل الجلسة كمعاملٍ أوّلٍ والصّفّ الّذي تريد تحميل لقطته كمعاملٍ ثانٍ, وستعيد الدّالّة ألّا قيمة Null في حالة عدم وجود لقطةٍ سابقةٍ أو كائن Capture في حال وجود لقطةٍ, ويوفّر هذا الكائن بعض البيانات عن اللقطة كزمن التقاط اللقطة بالملّي ثانية عبر الدّالّة captureTime, لكنّ الاستخدام الأساسيّ لهذا الصّفّ يتمّ من خلال استخدام الدّالّة copyTo, فبعد إنشاء الكائن Game سنحتاج لتحميل البيانات الّتي تمّ التقاطها, وذلك يتمّ بتمرير كائن الصّفّ Game للدالّة copyTo فيصبح الكود كالتّاليّ:

Game game = new Game();
Capture capture = Capture.load(session, Game.class);
capture.coptTo(game);

Clone this wiki locally