كيفية إظهار بكمن فم فتح/إغلاق الرسوم المتحركة في جافا مزدوجة مع التخزين المؤقت ؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

أنا أحاول أن أظهر الشهير الفم فتح/إغلاق المتحركة من بكمن حرف في بخس بكمن اللعبة أنا صنع لتعليم نفسي برمجة اللعبة.

ما أقوم به هو رسم فتح الفم الصورة ثم إعادة رسم الفم مغلقة صورة في نفس (x/y) موقع.ولكن هذا لا يعمل, ورأيت مغلقة الفم الرسوم المتحركة في كل وقت.

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

لقد اختبرت و تأكدوا من أن كل الصور يتم تحميلها بشكل صحيح كما هو متوقع.

هنا هو بلدي startAnim() وظيفة ما يسمى عند النقر المزدوج على الصغير:

public void beginGame() //Called from engine.java
{
    isRunning=true;
    repaint();
    pacman.startAnim();
}

public void startAnim() //In different class, pacman.java
{
    Image orig;
    while (engine.isRunning)
    {
        orig=this.getCurrentImg();
        draw(engine.getGraphics());
        this.setCurrImg(currImg2);
        this.draw(engine.getGraphics());
        this.setCurrImg(orig);
        this.draw(engine.getGraphics());
        try
        {
            Thread.sleep(100);
        }
        catch (InterruptedException e) {}
    }
}

public void draw(Graphics g) //Called from engine.paint()
{
    g.drawImage(getCurrentImg(), getX(), 
            getY(), engine);
}
هل كانت مفيدة؟

المحلول

وكان لديك للنوم بين الصور 2. وإلا فإنك لن ترى سوى الصورة الأخيرة رسمت.

وعلى سبيل المثال.

while( running )
{
    image 1
    draw
    sleep
    image 2
    draw
    sleep
}

وشيء من هذا القبيل:

public void startAnim() //In different class, pacman.java
{
                            final int  cnt  = 2;
    Image[] imgs = new Image[ cnt  ];
    int         step = 0;

    imgs[ 0 ] = closedMouthImage;
    imgs[ 1 ] = openMouthImage;

            while ( engine.isRunning )
            {
                this.setCurrImg( imgs[ step ] );
                    draw(engine.getGraphics());
                step = ( step + 1 ) % cnt;
                    try
                    {
                                Thread.sleep(100);
                    }
                    catch (InterruptedException e) {}
            }
}

نصائح أخرى

كما sfossen قال: كنت في حاجة الى تأخير بين رسم الصور.

بضعة أشياء أخرى للنظر.

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

مثال (pseudocode)

frameWidth = 32
frameIndex = 0
while(running) {
  // Draw just the frame of your animation that you want
  drawImage(pacmanX, pacmanY, filmStrip, frameIndex * frameWidth, 0, frameWidth, frameHeight)
  frameIndex = (frameIndex + 1) % frameCount

  // Update position of pacman & ghosts
  // Update sound effects, score indicators, etc.
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top