在执行操作时从另一个类调用一个类

时间:2015-06-08 04:08:39

标签: java swing class jframe jbutton

我有一个flappy bird示例的游戏/测试类,我有一个登录屏幕,点击这个屏幕类中的JButton“loggin”我想调用下面的flappyBird类。

我试过这样的事但没有运气

if(event == jButtonLogin){
this.dispose();
FlappyBird bird = new FlappyBird();
bird.setVisible();

//因为它里面有Jframe我虽然这个逻辑可行。

如果有人能以正确的方式指出我,请

 public class FlappyBird implements ActionListener, MouseListener, KeyListener {

    //private static final long serialVersionUID = 1L;

    public static FlappyBird flappyBird; //creating a static flappybird so it can be acessed within main

    public final int WIDTH = 800, HEIGHT = 600;   //scren size of the game
    public int highScore = 0;

    public Renderer renderer;
    public Random rand;

    public Rectangle bird;

    public int ticks, yMotion, score; //bird movement
    public boolean gameOver, started;

    public ArrayList<Rectangle> columns;    //arrrayList of Recatangles names column


    public FlappyBird()
    {
        JFrame jframe = new JFrame();    //main frame of game

        Timer timer = new Timer(20,this);

        renderer = new Renderer();
        rand = new Random();

        jframe.setSize(WIDTH, HEIGHT);
        jframe.setLocationRelativeTo(null);
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //  jframe.setResizable(false);
        jframe.setVisible(true);
        jframe.addMouseListener(this);
        jframe.addKeyListener(this);
        jframe.setTitle("FlappyTest");
        jframe.add(renderer);    //need to create what were rendering

        bird = new Rectangle(50 - 10,HEIGHT/2 - 10,20,20);
        columns = new ArrayList<Rectangle>();

        addColumn(true);
        addColumn(true);
        addColumn(true);
        addColumn(true);

        timer.start();
    }

    public void addColumn(boolean start){
        int space = 350;
        int width = 100;
        int height = 50 + rand.nextInt(300);   // height of column //minum = 50 // and talles being random at 300

        if (start)  //if first pipes
        {
            columns.add(new Rectangle(WIDTH + width + columns.size() * 200, HEIGHT - height - 100, width, height));  //top pipe
            columns.add(new Rectangle(WIDTH + width + (columns.size() - 1) * 200, 0, width, HEIGHT - height - space));   // bot pipe 
        }
        else
        {
            columns.add(new Rectangle(columns.get(columns.size() - 1).x + 300, HEIGHT - height - 100, width, height)); //top pipe
            columns.add(new Rectangle(columns.get(columns.size() - 1).x, 0, width, HEIGHT - height - space));  //bot pipe
        }
    }

    public void paintColumn(Graphics g, Rectangle column)    //passing theses two vriable on the method
    {
        g.setColor(Color.green); //darker()
        g.fillRect(column.x, column.y, column.width, column.height);
    }

    public void jump()
    {
        if(gameOver)
        {
            bird = new Rectangle(50 - 10,HEIGHT/2 - 10,20,20);
            columns.clear();
            yMotion = 0;
            score = 0;

            addColumn(true);
            addColumn(true);
            addColumn(true);
            addColumn(true);

            gameOver = false;
        }

        if(!started)
        {
            started = true;
        }
        else if(!gameOver)
        {
            if (yMotion > 0)
            {
                yMotion = 0;
            }
            yMotion -=15;
        }

    }

    public void actionPerformed(ActionEvent arg0)    //action being performed on the timer (20,THIS)
    {
        int speed = 10; //columns speed

        ticks++; //keeping count of each tick of the bird

        if(started)
        {

            for(int i = 0;i < columns.size(); i++)
            {
                Rectangle column = columns.get(i);

                column.x -= speed;
            }
            if(ticks % 2 == 0 && yMotion < 15)   
            {
                yMotion += 2;
            }

            for(int i = 0;i < columns.size(); i++)  // for the whole columns ArrayList
            {
                Rectangle column = columns.get(i); // grab column at whichever i postion

                if(column.x + column.y < 0)   // column x.y less than 0
                {
                    columns.remove(column);   //remove that current column
                    if(column.y == 0)   //if the column.y == 0 when it turns 0 and you have no more starting columns
                    {
                        addColumn(false);   // you add the other columns false // infinite loop
                    }
                }
            }

            bird.y += yMotion;

            for(Rectangle column : columns)
            { // FOR EACH RECTANGLE column IN COLUMNS
                if(column.y == 0 && bird.x  + bird.width / 2 > column.x + column.width / 2 - 10 && bird.x  + bird.width / 2 < column.x + column.width / 2 + 10)
                {
                    score++;
                }
                if(column.intersects(bird))
                { //colision detection with pipes
                    gameOver = true;
                    if(bird.x < column.x)
                    {
                        bird.x  = column.x - bird.width;
                    }
                    else
                    {
                        if(column.y != 0){   //if its not the top column
                            bird.y = column.y - bird.height;
                        }
                        else if(bird.y < column.height)
                        {
                            bird.y = column.height;
                        }
                    }
                }
            }
            if(bird.y > HEIGHT - 100)  // if the Y becomes greater then the ground or if its less than 0
            {
                gameOver = true;
            }

            if(bird.y + yMotion >= HEIGHT - 120)
                bird.y = HEIGHT - 100 - bird.height;
            }
        renderer.repaint();   //EVERY 20 WE CALL REPAINT USING THE RENDERER TO UPDATE IT+
    }

    public void repaint(Graphics g) //MAIN SCREEN REPAINT
    {
        //System.out.println("Teste");
        System.out.println(bird.y);

        g.setColor(Color.BLACK);     //bground of the screen
        g.fillRect(0,0,WIDTH,HEIGHT);

        g.setColor(Color.BLUE);     //blue line
        g.drawLine(0, HEIGHT-100, WIDTH, HEIGHT-100);

        g.setColor(Color.WHITE);    //White Screen
        g.fillRect(0,HEIGHT-98,WIDTH, HEIGHT-100);

        g.setColor(Color.WHITE);     //adding bird component
        g.fillRect(bird.x,bird.y,bird.width,bird.height);

        for (Rectangle column : columns)
        {
            paintColumn(g, column);
        }

        g.setColor(Color.RED);
        g.setFont(new Font("Arial",1,100));

        if(!started)
        {
            g.drawString("Click to Start!", 75, HEIGHT / 2 - 50);
        }

        if(gameOver)
        {
            g.drawString("GAME OVER!", 75, HEIGHT / 2 - 50);
            if(score > highScore){
                highScore = score;
            }
        }
        if(!gameOver && started)
        {
            g.drawString(String.valueOf(score),WIDTH/2-25, 100);
        }

        g.setColor(Color.WHITE);
        g.setFont(new Font("Arial",1,20));
        g.drawString("High Score : " + highScore, 10, 50);
    }

    public static void main(String[] args) 
    {
        flappyBird = new FlappyBird(); // creating a new instance of flappybird
    }

    @Override
    public void mouseClicked(MouseEvent arg0) 
    {
        jump();
    }

    @Override
    public void mouseEntered(MouseEvent arg0)
    {
    }

    @Override
    public void mouseExited(MouseEvent arg0)
    {
    }

    @Override
    public void mousePressed(MouseEvent arg0)
    {
    }

    @Override
    public void mouseReleased(MouseEvent arg0) 
    {
    }

    @Override
    public void keyPressed(KeyEvent e) 
    {
        if(e.getKeyCode() == KeyEvent.VK_SPACE)
        {
            jump();
        }
    }

    @Override
    public void keyReleased(KeyEvent arg0)
    {

    }

    @Override
    public void keyTyped(KeyEvent arg0) 
    {

    }

}

1 个答案:

答案 0 :(得分:0)

考虑调查布局管理器以实现基于状态的游戏的行为。

Ex:在你的main方法中,不是调用新的FlappyBird()而是调用new Login()之类的东西。

在创建Login对象时要小心 - 你不希望通过“打开”和创建第二个JFrame来重新发明轮子(一个不受欢迎的创可贴解决方案可以通过隐藏JFrame来完成,但这不是你想要什么)。

相反,正如MadProgrammer暗示的那样 - 布局管理员可以立即允许您的应用程序交换环境。一些重组是为了完成这个设计,但总的来说它更模块化,可扩展(如果你想包括一个选项页面),更多面向OOP。

最终,从Login对象中,用户将能够单击将布局交换到Play布局的按钮(这是所有FlappyBird内容的位置)。