سؤال

أنا أعمل في J2ME، لدي Gameloop الخاص بك:

public void run() {
        Graphics g = this.getGraphics();
        while (running) {
            long diff = System.currentTimeMillis() - lastLoop;
            lastLoop = System.currentTimeMillis();
            input();
            this.level.doLogic();
            render(g, diff);
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                stop(e);
            }
        }
    }

لذلك هو مجرد gameloop الأساسية، doLogic() تدعو الدالة لجميع وظائف المنطق للشخصيات في المشهد و render(g, diff) مكالمات animateChar وظيفة كل شخصية على المشهد، بعد هذا، animChar تعمل الدالة في فئة الأحرف على إعداد كل شيء في الشاشة مثل هذا:

protected void animChar(long diff) {
        this.checkGravity();
        this.move((int) ((diff * this.dx) / 1000), (int) ((diff * this.dy) / 1000));
        if (this.acumFrame > this.framerate) {
            this.nextFrame();
            this.acumFrame = 0;
        } else {
            this.acumFrame += diff;
        }
    }

هذا يضمن لي أن كل شيء يجب أن يتحرك وفقا للوقت الذي يستغرقه الجهاز للذهاب من الدورة إلى الدورة (تذكر أنه هاتف، وليس منصة الألعاب). أنا متأكد من أنها ليست الطريقة الأكثر كفاءة لتحقيق هذا السلوك لذلك أنا مفتوح تماما من أجل انتقاد مهاراتي البرمجة في التعليقات، لكن مشكلتي هنا: عندما أجعلني قفزة شخصية، ما أقوم به هو أنني وضعت له دمية إلى قيمة سلبية، قل -200 وأنا وضعت المنطقية القفز إلى True، هذا يجعل الشخصية ترتفع، ثم لدي هذه الوظيفة تسمى checkGravity() تضمن أن كل ما يرتفع يجب أن ينخفض، checkGravity يتحقق أيضا للشخصية التي تتزوج من المنصات، لذلك سأقدمها قليلا من أجل وقتك:

public void checkGravity() {
        if (this.jumping) {
            this.jumpSpeed += 10;
            if (this.jumpSpeed > 0) {
                this.jumping = false;
                this.falling = true;
            }
            this.dy = this.jumpSpeed;
        }
        if (this.falling) {
            this.jumpSpeed += 10;
            if (this.jumpSpeed > 200) this.jumpSpeed = 200;
            this.dy = this.jumpSpeed;
            if (this.collidesWithPlatform()) {
                this.falling = false;
                this.standing = true;
                this.jumping = false;
                this.jumpSpeed = 0;
                this.dy = this.jumpSpeed;
            }
        }
    }

لذلك، المشكلة هي أن هذه الوظيفة تقوم بتحديث دمية بغض النظر عن فرق, ، جعل الشخصيات تطير مثل سوبرمان في الأجهزة البطيئة، وليس لدي أي فكرة عن كيفية تنفيذ فرق عامل بحيث عندما تكون شخصية القفز، تنقص سرعته بطريقة متناسبة لسرعة اللعبة. هل يمكن لأي شخص مساعدتي في حل هذه المشكلة؟ أو أعطني مؤشرات حول كيفية اصنع قفزة ثنائية الأبعاد في J2ME بالطريقة الصحيحة.

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

المحلول

ألا ينبغي أن تقوم بضبط Jumpspeed بناء على الوقت المنقضي؟ وهذا هو، ربما تتغير السرعة بحلول -75 / ثانية، لذلك يجب أن يكون فرقتك الوزن مقابل مقدار التغيير المطبق على Jumpspeed.

حتى تمر في فرق الشاحنات والقيام بشيء ما ... Jumpspeed + = (Diff * (rate_per_second)) / 1000؛

(على افتراض أن فرق في المليين ثانية)

(من الناحية المثالية، هذا من شأنه أن يجعله مثل الجاذبية الحقيقية: د)

نصائح أخرى

لماذا لا مجرد توفير جميع الثوابت بواسطة diff؟

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

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

long diff = System.currentTimeMillis() - lastLoop;
lastLoop = System.currentTimeMillis();

سيكون أقل. سيتم اشتقاق وقت الانتظار من DIFF بحيث تعمل اللعبة بنفس السرعة على معظم الآلات. سيكون لدي أيضا طريقة التجسيد في مؤشر ترابط منفصل بحيث لا تعتمد سرعة اللعبة على الرسومات.

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

Y = ناقص (الطاقة (X - طول القفزة مقسوما على اثنين) تتكاثر بنسبة 4 وضربها ارتفاع القفز) تقسم بقوة الطول وإضافة ارتفاع القفز في النهاية.

Y = - (XL / 2) (XL / 2) * 4 * H / (L * L) + H

وإذا كنت تريد أن تهبط كائن القفز على شيء ما، فيمكنك التحقق من كل X جديد إذا كان يقف تقريبا على منصة وإذا كان يقف على شيء ما، فلا يجعله يتوقف فقط، وجعله موقع y يساوي تماما ص من المنصة.

إذا كنت تستخدم شيئا مثل الفلاش أو القاعدة الأخرى التي تحولت إلى محور y، فقم بضرب إخراج الوظيفة بنسبة -1؛

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