2013-12-13 4 views
0

В качестве учебного пособия для школы нам приходилось разрабатывать самоопределяемый проект, в котором я выбрал игру, которую я изначально собирался писать на ActionScript, но решил нажать на нее на Java , Первоначально это происходило хорошо, при работе кода игры анимация спрайтов обрабатывалась отлично, и все поддерживалось в игровом цикле. Это было до тех пор, пока я не начал пытаться добавлять к нему такие компоненты, как кнопки и ярлыки.Панели/Кнопки и перекрашивание головной боли

В настоящее время структура моей игры такова (GameSystem [обрабатывает цикл и перерисовку]] - GameMenu [Простой вводный экран с началом игры] < --- свопы между ---> GameContainer [содержит информацию об игре])

Моя петля внутри GameSystem обновляет все необходимые объекты, перекрашивает и затем сообщает обо всем объектам, которые будут перерисовываться после.

игровой системы:

/**/for(int i = 0; i < UpdateList.size();i++){ 
/**/UpdateList.get(i).Update(delta * 1.1); // tell list the element is an object that extends an interface  
/**/} 
/**/Game.repaint(); 

/**/@Override 
/**/public void paint(Graphics g) { 
/**/super.paint(g); 
/**/Graphics2D g2d = (Graphics2D) g; 
/**/g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
/**/  RenderingHints.VALUE_ANTIALIAS_ON); 
/**/for(int i = 0; i < UpdateList.size();i++){ 
/**/UpdateList.get(i).paint(g2d); // tell list the element is an object that extends an interface  
/**/} 
/**/} 

Это где он начинает получать ненадежный, потому что система игры перерисовывает это сам каждый цикл, очищая кадр предыдущего материала, кнопки, которые я добавить в мой gamemenu, который создается внутри игровой системы очищаются и только кратковременно появляются, когда вы наводите на них курсор.

Game Menu:

////////////////// 
    // Start Button // 
    ////////////////// 
    Buttons = new JPanel();  
    Buttons.add(Start_game = new JButton("Start Game")); 
    this.add(Buttons); 
    Start_game.addActionListener(new Load()); 
    /**/} 
    /////////////////// 

    ////////////////// 
    //Paint sprite // 
    ////////////////// 
    @Override 
    /**/public void paintComponent(Graphics g) { 
    /**///super.paintComponent(g); 
    /**/Buttons.paintComponents(g); 
    /**/} 
    //////////////////////////////////// 

На данный момент я пробовал краски, краски компоненты, перепроверить() и множество других вещей, я блестел от других постов, но ни один из них помогли. Единственный способ, которым у меня была кнопка, выглядела видимой, - если я удалю вызов, чтобы перерисовать в игровом цикле. Однако это влияет на игру, поскольку ни один из объектов не перекрашивается.

TL DR: Как я могу обработать перекраску различных объектов в моем списке обновлений и обновить панель «Игровая система» без каких-либо компонентов, которые такие кнопки исчезнут? Извините, если это вопрос noobish, но это мой фактический первый раз, когда я работаю с Java, поскольку я хотел бы расширить внешний вид от ActionScript, если вам нужна дополнительная информация, я с радостью добавлю сообщение, спасибо за вашу помощь.

+1

1) Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org/). 2) Пожалуйста, не забудьте добавить '?' на вопросы! Некоторые люди выполняют поиск на странице «?» и если ни один из них не существует в «вопросе», переходите непосредственно к следующему (фактическому) вопросу в очереди. –

+0

Также кажется, что вы расширяете 'JFrame' и переопределяете метод' paint (..) '? Если это так, не делайте этого. Расширьте 'JPanel' для пользовательской картины, переопределите' paintComponent (..) 'вместо краски и верните предпочтительный размер по мере необходимости для этого компонента. –

+0

Извините, что забыли вопросительный знак, который действительно имеет смысл, поскольку я спрашиваю его.также в случае с JFrames, я изначально распространял их до тех пор, пока не возникли проблемы, и я их поменял, поэтому если класс должен вызвать paint(), теперь он расширяет JPanel вместо – ulthanex

ответ

1

Проблема в том, что вы пытаетесь обрабатывать покраску кнопок иначе, чем живопись вашей игры.

Game System 
{ 
    paint loop 
    { 
     painting Game 
    } 
} 

Components //managing the painting itself through paintComponent, trying to run at same time as Game System. 
{ 
    paintComponent 
} 

Таким образом, вы хотите переключить один на другой. Вы можете использовать либо paintComponent() в GameSystem вместо paint(), который управляет располагающей графики и перекраски для вас (если она уже расширяя JComponent) ...

или вам нужно, чтобы начать управление кнопками картина аналогична как вы делаете это для своей игры, вместо того, чтобы полагаться на paintComponent()

+0

Фактически, в моем цикле игры, который вызывает перерисовку, а затем просматривает список обновлений, чтобы перерисовать их, мне нужен отдельный список всех кнопок и обрабатывать их одинаково? – ulthanex

+0

Было бы очень рекомендую, чтобы Swing обрабатывал перекраску с помощью paintComponent, поскольку вы используете компоненты Swing, но если вы почти там, и вам просто нужно работать, это должно сделать это. – DoubleDouble

Смежные вопросы