كيفية تمثيل نافذة 400x400 كخريطة في لعبة جافا؟

StackOverflow https://stackoverflow.com/questions/622517

  •  05-07-2019
  •  | 
  •  

سؤال

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

وكيف يمكن بناء هذه الخريطة، وخاصة منذ اعتماد شاشة س، ص الإحداثيات، فكيف يمكنني تمثيلهم بشكل صحيح في البلاط / على هذه الخريطة؟

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

المحلول

وأنا أعلم أنه من المغري لبدء التفكير في الأشياء واجهات ولكن هل فكرت في مجموعة 2-الأبعاد مع كل عنصر يمثلون 40 بكسل أو شيء من هذا؟ أنا لا أتذكر بكمن يجري بكسل دقيقة عندما جاء إلى الاصطدام، أكثر سؤال للاتجاه كل قطعة كانت تتحرك في.

نصائح أخرى

وعموما كان لديك التمثيل المجرد التي لا تشير بكسل على هذا النحو (على سبيل المثال، ربما متاهة باك مان هو مجرد وحدات ث واسعة)، ثم لديك التحول الخطي (تعلمون، ص = م × + ب ) لحمل التمثيل المجرد إلى بكسل الفعلية.

لجعلها ملموسة، دعنا نقول أنك تريد التمثيل المجرد الخاص بك لتكون 100 وحدة واسعة، وتريد لجعله إلى 400 بكسل. ثم تحول هو مجرد scrn_x = 4 * س.

ونوع من الصعب التوصل إلى هذا دون كتابة ذلك بنفسي ولكن.

أولا ستحتاج إلى إنشاء تعريفات الجهة التي تنفذ ICollidable. وتشمل الكيانات أشباح، بكمن، النقاط وشكا من السلطة. أن كل عنصر في خريطة تحتوي، جنبا إلى جنب مع غيرها من المعلومات، وقائمة من جميع الكيانات الحالية مع نوع من قيمة "موقف" من أجل الدقة المضافة. وتشمل واجهة ICollidable المنطق ليس فقط لتحديد الكيانات التي تصطدم مع بعضها البعض (أشباح لا تتصادم مع نقاط على سبيل المثال.) ولكن تحديد ما إذا كانوا في موقف لتصطدم مع بعضها البعض. IE إذا بكمن يدخل الفضاء من اليمين وشبح هو ترك تلك المساحة من الجهة اليسرى وليس هناك تصادم. وسوف يساعد أيضا في تحديد متى بالضبط بكمن قد أكل نقطة بحيث بيانيا يبدو الصحيح. IE إذا كنت تدمير نقطة الحق كما بكمن يدخل حيز انها سوف تختفي حتى قبل أن يمس ذلك بوضوح.

وتتمثل

والعفاريت لديك مثل بكمن والأشباح التي كتبها وظائف (س، ص). لتحديد ما إذا كانت تصطدم مع بعضها البعض، واستخدام هذه psuedocode:

sprites = [ ... list of sprites ... ]
for i1=0 to len(sprites):
    sprite1 = sprites[i1]
    for i2 = i1+1 to len(sprites):
        sprite2 = sprites[i2]
        if (sprite1.x-sprite2.x)^2+(sprite1.y-sprite2.y)^2 < radius_of_sprites^2:
            collide(sprite1, sprite2)

لاحظ أن هذا لا تنطوي الخريطة على الإطلاق. نحن يمكن التحقق من التصادم بين بكمن وخريطة على حدة. الخدعة الأساسية هنا هي قمت بتقسيم بكسل تنسيق من كل من الجانبين بكمن في (أعلى، أسفل، يسار، يمين) والتحقق من الاصطدامات. على سبيل المثال، إذا بكمن هو الذهاب الى الحق، ونحن بحاجة للتحقق من الحافة اليمنى للاصطدام:

pacman_tile_x = (pacman.x+tilesize/2)/tilesize    # added tilesize/2 to check the middle of pacman
pacman_tile_y = pacman.y/tilesize + 1   # +1 because right edge is 1 tile to the right of the sprite's coordinate
if tile[pacman_tile_x][pacman_tile_y].is_a_wall:
    ... wall collide code ...

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

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