سؤال

أنا كاتب في XNA و أنا أحاول جعل بونغ-لعبة.
لقد كنت قادرا على جعل لعبة كرة الطاولة ، ولكن كل رمز في فئة واحدة.لذا كنت أرغب في محاولة لإضافة قليلا من OOP و لقد جعلت فئة من أجل الكرة و واحد على لوحة المفاتيح.

الكرة تتحرك تماما, ولكن لا يبدو قادرا على جعل الكرة ترتد من منصات.

هذه هي رموز تستخدم:
لتحريك منصات
Game1.cs

#region left
    if (_KBS.IsKeyDown(Keys.W) || _KBS.IsKeyDown(Keys.Z))
        Left.MoveUp();
    else if (_KBS.IsKeyDown(Keys.S))
        Left.MoveDown();
#endregion

#region right
    if (_KBS.IsKeyDown(Keys.Up))
        Right.MoveUp();
    else if (_KBS.IsKeyDown(Keys.Down))
        Right.MoveDown();
#endregion

وسادة.cs

public void MoveUp() {
    if (!paused)
        RecPad.Offset(0, -speed);

    CheckBorders();
}

public void MoveDown() {
    if (!paused)
        RecPad.Offset(0, speed);

    CheckBorders();
}

private void CheckBorders() {
    MathHelper.Clamp(recPad.Y, borders.Top, borders.Bottom - recPad.Height);
}

للتحقق إذا كانت الكرة مستبعد
الكرة.cs

public void CheckBounce() {
    if ((myBounds.Intersects(left) && movement.X < 0) || (myBounds.Intersects(right) && movement.X > 0))
            movement.X *= -1;
}

public void Draw(SpriteBatch sBatch, Texture2D texture, Color color, Rectangle left, Rectangle right) {
    this.left = left;
    this.right = right;

    Move();

    sBatch.Begin();
    sBatch.Draw(texture, myBounds, color);
    sBatch.End();
}

وسادة.cs

public Rectangle RecPad {
    get { return recPad; }
    private set { recPad = value; }
}

Game1.cs

Ball.Draw(spriteBatch, ball, Color.White, Left.RecPad, Right.RecPad);

يبدو أن أحصل على منصات العودة إلى العمل
يبدو أن المشكلة يمكن حلها باستخدام originel recPad بدلا من منشئ RecPad
الآن أنا فقط بحاجة إلى الحصول على boundries العامل ، لأن MathHelper.المشبك لا يبدو للعمل
انظر قانون بلدي للحصول على مزيد من المعلومات

هذا قانون ثابت الآن بلدي الحدود المشكلة

private void CheckBorders() {
        if (recPad.Top < borders.Top)
            recPad.Location = new Point(recPad.X, borders.Top);
        if (recPad.Bottom > borders.Bottom)
            recPad.Location = new Point(recPad.X, borders.Bottom - recPad.Height);
    }
هل كانت مفيدة؟

المحلول

هذا على الفور تبرز لي (من CheckBounce):

    movement.X *= 1;

يمكن أن يكون خطأ نسخ أو أنك نسيت أن تضع '-'.

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

تحرير:بشأن تلك 'أدوات مفيدة':

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

public void CheckBounce()
{
    if (myBounds.Intersects(LeftPaddle.Bounds) || myBounds.Intersects(RightPaddle.Bounds))
        movement.X *= -1;
}

بسيطة إلى حد ما, ولكن ليس تماما آمنة-إذا كانت الكرة تمكن من التحرك بعيدا بما فيه الكفاية إلى مجداف أن إطار واحد من الحركة لن مجانا من أن مجداف و حدود ، ستكون على الدوام عكس X سرعة إنتاج 'تمسك الكرة المفعول.حتى نتمكن من إضافة أكثر قليلا فقط التحقق من التعليمات البرمجية لتجنب ذلك:

public void CheckBounce()
{
    if ((myBounds.Intersects(LeftPaddle.Bounds) && movement.X < 0) ||
     (myBounds.Intersects(RightPaddle.Bounds) && movement.X > 0))
        movement.X *= -1;
}

أعتذر إذا كانت مضمنة الشرطية قليلا كثيفة جدا.ما يعنيه هذا هو, إذا كانت الكرة تتحرك من اليسار ويضرب الحق مجداف ، عكس X.وبالمثل ، إذا كان يتحرك يمين و يضرب اليسار مجداف ، عكس X.هذا يزيل 'العالقة'.

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

private void CheckBorders()
{
    //clamps a       value  to a   min  and a           max
    MathHelper.Clamp(recPad.Y, borders.Top, borders.Bottom - recPad.Height);
}

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

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