0

プログラムは、左矢印キーと右矢印キーを検出します。これらのキーのいずれかが押されると、GImageクラスのインスタンスである私のKnightオブジェクトは、文字列の配列を通過します(これらの文字列は、Knightオブジェクトのアニメーションへのディレクトリパスです。

私のコードの問題は、私が思いついたJavaコードで適切な流動的なアニメーションを見つけることができないように見えることです。矢印キーを押すと、アニメーションがすばやくループしてから遅くなりますが、矢印キーを押してもう一度押すと、アニメーションがすばやくループしてから遅くなります。

各動きのアニメーションには、4フレームのアニメーションがあります。

これが私が使用しているライブラリへの参照です http://jtf.acm.org/javadoc/student/acm/graphics/GObject.html#pause%28double%29

ヒントをいただければ幸いです。

import java.awt.event.KeyEvent;

import acm.graphics.GImage;

import acm.program.GraphicsProgram;



public class Castlevania extends GraphicsProgram {



    public void init(){
        setGameBackground();
        knight = new Knight("knight anim/knightFaceLeft/knight1.png", 500, 500);
        add(knight);
        setSize(APPLICATION_WIDTH, APPLICATION_HEIGHT);
        addKeyListeners();


    }


    private void setGameBackground() {
        // TODO Auto-generated method stub
        gameBackgroundImage = new GImage("link sprites/zelda_background.png");
        add(gameBackgroundImage);
    }



    public void keyPressed(KeyEvent e){ 

        /* Knight's Movement
         * 
         */
        int knightMovementKey = e.getKeyCode();
        if(knightMovementKey == KeyEvent.VK_LEFT)
        {

            this.xSpeed = 10;
            ySpeed = 0;


            knight.setImage(KnightFaceLeft[knightFrame]);
            knight.move(-xSpeed, ySpeed);

            knightFrame ++; 

            if(knightFrame >= KnightFaceLeft.length)
            {
                knightFrame = 0;
            }


        }

        else if(knightMovementKey == KeyEvent.VK_RIGHT){

            knight.setImage(KnightFaceRight[knightFrame]);
            knight.move(xSpeed,ySpeed);
            knightFrame++;

            this.xSpeed = 10;
            ySpeed = 0;

            if(knightFrame>=KnightFaceRight.length){

                knightFrame = 0;
            }

        }
        knight.pause(DELAY);
    }

    private String[] KnightFaceLeft = {"knight anim/knightFaceLeft/knight1.png","knight anim/knightFaceLeft/knight2.png","knight anim/knightFaceLeft/knight3.png","knight anim/knightFaceLeft/knight4.png"}; //Add in as many images as you want for your animation
    private String[] KnightFaceRight = {"knight anim/knightFaceRight/knight1.png","knight anim/knightFaceRight/knight2.png","knight anim/knightFaceRight/knight3.png","knight anim/knightFaceRight/knight4.png"}; 
    private GImage gameBackgroundImage;
    private Knight knight;
    private final int APPLICATION_WIDTH = 1200;
    private final int APPLICATION_HEIGHT = 800;
    private int knightFrame = 0;
    private int xSpeed ; //the number of pixels to move in x
    private int ySpeed = 0; //0 so you only move horiontally
    private double DELAY = 35;
}

import acm.graphics.GImage.*;

public class Knight extends GImage {

                public Knight(String imageDirectory, double knight_Location_XCoord, double knight_Location_YCoord) {
                    super(imageDirectory,knight_Location_XCoord, knight_Location_YCoord);
                }
            }
4

1 に答える 1

2

への呼び出しがイベント ディスパッチ スレッドpause()をブロックしています。このコンテキストで は、タイマーの でアニメーションのペースを調整するために使用します。acm.util.SwingTimerActionListener

于 2012-08-17T04:51:15.923 に答える