سؤال

أنا أعمل على لعبة بونغ لنينتندو دي إس. أنا أستخدم librnds لتعيين الأمور واجهت سلوكا غريبا للغاية. لقد جربت ذلك حتى الآن في محاكاة المحاطات، لكنني أستخدم ثلاثة أشخاص مختلفين وأنهم جميعا يعرضون هذا السلوك لذلك أظن أنني أفعل شيئا سيئا.

المشكلة الفعلية هي أنه عند استخدام طبقة الخلفية 1 أو أعلى رسومات مبلطة، أحصل على خطوط غريبة في جميع أنحاء هذه الطبقة. إذا كنت تستخدم طبقة الخلفية 0 المشكلة تختفي، ولكن نظرا لأن ذلك يتم تقديمه أخيرا، لا أستطيع أن أرسم عليه في طبقة أخرى، والتي أريدها.

رمز الإعداد الخاص بي:

void pong::setup_engine()
{
    // Setup DS graphics engine.
    // -------------------------
    videoSetMode(MODE_5_2D | DISPLAY_BG0_ACTIVE | DISPLAY_BG1_ACTIVE | DISPLAY_BG2_ACTIVE);
    vramSetBankA(VRAM_A_MAIN_BG_0x06000000);
    vramSetBankB(VRAM_B_MAIN_BG_0x06020000);

    u8 *tileMemory = reinterpret_cast<u8 *>(BG_TILE_RAM(1));
    u16 *mapMemory = reinterpret_cast<u16 *>(BG_MAP_RAM(0));

    int bg0 = bgInit(1, BgType_Text8bpp, BgSize_T_256x256, 0, 1);
    int bg1 = bgInit(2, BgType_Bmp16, BgSize_B16_256x256, 0, 0);
    //bgScroll(bg0, 256, 256);

    u16 *ptr = bgGetGfxPtr(bg1);
    for (int y = 10; y < 128*60; y++)
    {
        ptr[y] = 0xFFFF;
    }

    BG_PALETTE[1] = grey0;
    BG_PALETTE[2] = grey1;
    BG_PALETTE[3] = grey2;
    BG_PALETTE[4] = grey3;
    BG_PALETTE[5] = grey4;
    BG_PALETTE[6] = grey5;
    BG_PALETTE[7] = grey6;

    // 32 here is not 32 bytes but 32 half-words, which is 64 bytes.
    swiCopy(CORNER_TILE, tileMemory, 32);
    swiCopy(TOP_TILE, tileMemory + 64, 32);
    swiCopy(SIDE_TILE, tileMemory + (64 * 2), 32);
    swiCopy(MAIN_TILE, tileMemory + (64 * 3), 32);

    swiCopy(MAP, mapMemory, 32*24);
}

في الرمز أعلاه، استخدم الطبقة 1 ل BG0، وهي طبقة رسومات مبلطة. هذا يجعل المشارب الغريبة تظهر. إذا كنت لتغييره إلى 0 مثل هذا، فسيظهر كما هو متوقع:

int bg0 = bgInit(0, BgType_Text8bpp, BgSize_T_256x256, 0, 1);

أي أفكار ما الذي يسبب المشكلة، وما هو الحل؟

Image of weird stripes

هل كانت مفيدة؟

المحلول

نظرة BREIF على الخلفية. يجعلها تبدو وكأنها تستخدم BG1 و BG2. لوضع 5، وفقا ل:

http://nocash.emubase.de/gbatek.htm.

الطبقة 0 و 1 طبيعية وتمديد 2 و 3. أنا لا أعرف ما يعني الوسائل الممتدة. إذا كنت تريد فقط أن تفعل أشياء البلاط العادية، فمن المحتمل أنك تريد BGINIT 0 و 1 ليس 1 و 2.

يمكنك تغيير الأولويات في الإرادة، الطبقة 0 ليست بالضرورة أعلى 1، إلخ. إلقاء نظرة على سجلات BGXCNT (BG0CNT، BG1CNT، ...) وتتسابق الأولوية. الآن إذا كانت الأولوية عبارة عن تعادل ثم نعم رقم الطبقة يحدد من يفوز.

نصائح أخرى

شيئان. لأحد، من المرجح أن الشريط هو صراع VRAM، على الرغم من أنه كان بعض الوقت لأنني فعلت DS Dev آخر. تحقق مرة أخرى حيث تقوم بنسخ الرسومات الخاصة بك وبيانات البلاط الخاصة بك. يستخدم الوضع 5 خلفين نصين، والتي يجب أن تتصرف بنفس الشيء تماما إذا تمت تهيئتها بطريقة معينة، لذلك لست متأكدا من ما يحدث هناك.

في أي حال، نظرا لأن لديك خلفيتين يعملان، فلماذا لا تحدد أولوياتها في سجلاتهم لتغيير ترتيب Z الخاص بهم؟ يتم سحب الخلفية فقط في ترتيب معين إفتراضي, ، يمكنك ضبط أولويتهم للحصول على نظام سحبهم بأي ترتيب تريده.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top