لماذا أحصل على خطأ عندما أحاول الوصول إلى وظيفة عمومية من فئة؟ (أكشن 3)

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

سؤال

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

1061: Call to a possibly undefined method hurtCollision through a reference with static type Class.

وهنا هي فئتين:

والطبقة الاصطدام (يمكنك فقط السيطرة و لhurtCollision):

package

{

import flash.display.MovieClip;

public class Collision extends MovieClip
{
    private var e:*;
    static public var _playerX:*;
    static public var _playerY:*;
    private var HIT_BOTTOM_1X:Number;
    private var HIT_BOTTOM_2X:Number;
    private var HIT_BOTTOM_3X:Number;
    private var HIT_TOP_1X:Number;
    private var HIT_TOP_2X:Number;
    private var HIT_TOP_3X:Number;
    private var HIT_R_1X:Number;
    private var HIT_R_2X:Number;
    private var HIT_R_3X:Number;
    private var HIT_L_1X:Number;
    private var HIT_L_2X:Number;
    private var HIT_L_3X:Number;
    private var HIT_BOTTOM_1Y:Number;
    private var HIT_BOTTOM_2Y:Number;
    private var HIT_BOTTOM_3Y:Number;
    private var HIT_TOP_1Y:Number;
    private var HIT_TOP_2Y:Number;
    private var HIT_TOP_3Y:Number;
    private var HIT_R_1Y:Number;
    private var HIT_R_2Y:Number;
    private var HIT_R_3Y:Number;
    private var HIT_L_1Y:Number;
    private var HIT_L_2Y:Number;
    private var HIT_L_3Y:Number;

    public function Collision(enginePass:*)
    {       
    e = enginePass;
    }
    public function detectCollisions(object:*):void
    {
        _playerX = e._player.x;
        _playerY = e._player.y;
        HIT_BOTTOM_1X = object.x - object.width/2;
        HIT_BOTTOM_2X = object.x;
        HIT_BOTTOM_3X = object.x + object.width/2;
        HIT_TOP_1X = object.x - object.width/2;
        HIT_TOP_2X = object.x;
        HIT_TOP_3X = object.x + object.width/2;
        HIT_R_1X = object.x + object.width/2;
        HIT_R_2X = object.x + object.width/2;
        HIT_R_3X = object.x + object.width/2;
        HIT_L_1X = object.x - object.width/2;
        HIT_L_2X = object.x - object.width/2;
        HIT_L_3X = object.x - object.width/2;

        HIT_BOTTOM_1Y = object.y + object.height/2;
        HIT_BOTTOM_2Y = object.y + object.height/2;
        HIT_BOTTOM_3Y = object.y + object.height/2;
        HIT_TOP_1Y = object.y - object.height/2;
        HIT_TOP_2Y = object.y - object.height/2;
        HIT_TOP_3Y = object.y - object.height/2;
        HIT_R_1Y = object.y + object.height/2 - object.height/4;
        HIT_R_2Y = object.y;
        HIT_R_3Y = object.y - object.height/2 + object.height/4;
        HIT_L_1Y = object.y + object.height/2 - object.height/4;
        HIT_L_2Y = object.y;
        HIT_L_3Y = object.y - object.height/2 - object.height/4;

        if(e._ground.hitTestPoint(HIT_BOTTOM_1X,HIT_BOTTOM_1Y,true) || e._ground.hitTestPoint(HIT_BOTTOM_2X,HIT_BOTTOM_2Y,true) 
        || e._ground.hitTestPoint(HIT_BOTTOM_3X,HIT_BOTTOM_3Y,true))
        {
            e._touchGround = true;
            if(e._vy < 0)
            {
                e._vy = 0;
            }
        }
        if(e._ground.hitTestPoint(HIT_TOP_1X,HIT_TOP_1Y,true) || e._ground.hitTestPoint(HIT_TOP_2X,HIT_TOP_2Y,true) 
        || e._ground.hitTestPoint(HIT_TOP_3X,HIT_TOP_3Y,true))
        {
            e._jump = false;
            e._vy = -(e._vy) - 5;
        }

         if(e._ground.hitTestPoint(HIT_R_1X,HIT_R_1Y,true) || e._ground.hitTestPoint(HIT_R_2X,HIT_R_2Y,true) 
        || e._ground.hitTestPoint(HIT_R_3X,HIT_R_3Y,true))
        {
            if(e._vx > 0)
            {
                e._vy += e._vx;
            }
            if(e._ground.hitTestPoint(HIT_TOP_3X, HIT_TOP_3Y, true))
            {
                if(e._vx > 0)
                {
                e._vx = -(e._vx) *2;
                }
            }
        }
        if(e._ground.hitTestPoint(HIT_L_1X,HIT_L_1Y,true) || e._ground.hitTestPoint(HIT_L_2X,HIT_L_2Y,true) 
        || e._ground.hitTestPoint(HIT_L_3X,HIT_L_3Y,true))
        {
            if(e._vx < 0)
            {
                e._vy += Math.abs(e._vx);
            }
            if(e._ground.hitTestPoint(HIT_TOP_1X, HIT_TOP_1Y, true))
            {
                if(e._vx < 0)
                {
                e._vx = -(e._vx) *2;
                }
            }
        }
        if(e._ground.hitTestPoint(HIT_TOP_3X, HIT_TOP_3Y, true) && e._ground.hitTestPoint(HIT_BOTTOM_3X, HIT_BOTTOM_3Y, true))
        {
            e._vy += 20;
        }
        if(e._ground.hitTestPoint(HIT_TOP_1X, HIT_TOP_1Y, true) && e._ground.hitTestPoint(HIT_BOTTOM_1X, HIT_BOTTOM_1Y, true))
        {
            e._vy += 20;
        }
        if(e._ground.hitTestPoint(e._player.x,e._player.y, true))
        {
            e._vy = -(e._vy);
            e._vx = -(e._vx);
        }
        else
        {
            if(!(e._ground.hitTestPoint(HIT_BOTTOM_1X,HIT_BOTTOM_1Y,true) || e._ground.hitTestPoint(HIT_BOTTOM_2X,HIT_BOTTOM_2Y,true) 
        || e._ground.hitTestPoint(HIT_BOTTOM_3X,HIT_BOTTOM_3Y,true)))
            {
            e._vy -= 1;
            e._touchGround = false;
            }
        }
    }

    public function hurtCollision(hurtObject:*)
    {
        if(hurtObject.hitTestPoint(HIT_BOTTOM_1X,HIT_BOTTOM_1Y,true) || hurtObject.hitTestPoint(HIT_BOTTOM_2X,HIT_BOTTOM_2Y,true) 
        || hurtObject.hitTestPoint(HIT_BOTTOM_3X,HIT_BOTTOM_3Y,true))
        {
            e.hurtPlayer();
        }
        if(hurtObject.hitTestPoint(HIT_TOP_1X,HIT_TOP_1Y,true) || hurtObject.hitTestPoint(HIT_TOP_2X,HIT_TOP_2Y,true) 
        || hurtObject.hitTestPoint(HIT_TOP_3X,HIT_TOP_3Y,true))
        {
            e.hurtPlayer();
        }

         if(hurtObject.hitTestPoint(HIT_R_1X,HIT_R_1Y,true) || hurtObject.hitTestPoint(HIT_R_2X,HIT_R_2Y,true) 
        || hurtObject.hitTestPoint(HIT_R_3X,HIT_R_3Y,true))
        {
            e.hurtPlayer();
        }
        if(hurtObject.hitTestPoint(HIT_L_1X,HIT_L_1Y,true) || hurtObject.hitTestPoint(HIT_L_2X,HIT_L_2Y,true) 
        || hurtObject.hitTestPoint(HIT_L_3X,HIT_L_3Y,true))
        {
            e.hurtPlayer();
        }
    }
}

و}

والطبقة الأذى:

package

{     استيراد flash.display.MovieClip.     استيراد flash.events.Event.     استيراد التصادم؛

public class Hurt extends MovieClip
{
    public function Hurt() 
    {
        addEventListener(Event.ENTER_FRAME, enterFrame);
    }
    private function enterFrame(e:Event)
    {
        Collision.hurtCollision(this);
    }
}

و}

وتحرير: فقط للسماح تعلمون جميعا، e.hurtPlayer هو مجرد طريقة فئة المستند الذي يتحكم اللاعب الصحية

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

المحلول

ومشكلتكم تكمن هنا:

Collision.hurtCollision(this);

وhurtCollision ليس أسلوب فئة، هو أسلوب مثيل. إذا كنت تريد Collision لتكون أشبه فئة الخدمات العامة (بدلا من الاضطرار إلى إنشاء مثيلات لاستخدام الأساليب)، ثم ربما كنت تريد أن تفعل public static function ... بدلا من public function فقط.

وتقرأ على أساليب الفئة لأكثر من ذلك.

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

new Collision( e ).hurtCollision( this );

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

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