2013-07-09 2 views
2

У меня есть следующий код ... (плюс общий класс игрока с getX, getY, setX, setY, render(), tick() и т. Д. Не включены)Переключение jpanels на основе проигрывателя X, Y?

Я хочу, чтобы игрок загружался в ViewB и когда он попадает в край .. Я бы хотел, чтобы ViewB закрывался и был заменен ViewA или ViewC (в зависимости от того, имеет ли он левый край или правый край) ... Я не могу это сделать, и я не знаю, я знаю, что я делаю неправильно .... Класс игрока создан в MainGameThread.java ... и передается на новый JPanel, так что я все еще работаю с оригинальным объектом/спрайтом Player, который был создан .. Команда
System.out.println("Should change screens here to ViewA"); похоже, не срабатывает, когда он попадает в край .. что я делаю неправильно здесь ???? и какой класс я должен исправить?

MainGameThread Класс:

import java.util.LinkedList; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class MainGameThread extends JFrame { 

    private LinkedList<JPanel> screens = new LinkedList<JPanel>(); 
    private ViewA va; 
    private ViewB vb; 
    private ViewC vc; 
    private ViewD vd; 
    private Player player; 

    public MainGameThread() { 
     player = new Player(); 
     // load player settings from server 
     // .. 
     // 
     // va = new ViewA(player); 
     //vc = new ViewC(player); 
     //vd = new ViewD(Player) 

     vb = new ViewB(player); 

     screens.add(0,ViewB); 
     screens.add(1,ViewA); 
     screens.add(2,ViewB); 
     screens.add(3,ViewC); 

     add(screens.get(0)); // starting from view B 

     //go to end of view B (x=0), change to View A, close view B 

     if(player.getX()<=5){ 
      System.out.println("Should change screens here to ViewA"); 
      vb = null; 
      va = new ViewA(player); 
      remove(screens.get(0)); 

      add(screens.get(1)); 
     } 

     if(player.getX()>=615){ 
      System.out.println("Should change screens here to ViewC"); 
      vb = null; 
      vc = new ViewC(player); 
      remove(screens.get(0)); 

      add(screens.get(2)); 
     } 
     setSize(652, 480); 
     setLocationRelativeTo(null); 
     setTitle("GAME"); 
     setResizable(false); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     new MainGameThread(); 
    } 
} 

JPanel Вид: (заменить ViewA с ViewB и т.д .. в D)

import java.awt.Color; 
import java.awt.Font; 
import java.awt.FontMetrics; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import java.awt.Toolkit; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 
import java.util.ArrayList; 

import javax.swing.JPanel; 
import javax.swing.Timer; 


public class ViewA extends JPanel implements ActionListener { 

    private Player player; 
    private Timer timer; 
    private int B_WIDTH; 
    private int B_HEIGHT; 
    private boolean ingame; 

    public ViewA(Player player) { 
     this.player = player; 

     addKeyListener(new TAdapter()); 
     setFocusable(true); 
     setBackground(Color.RED); 
     setDoubleBuffered(true); 
     setSize(652, 480); 
     ingame = true; 


     timer = new Timer(5, this); 
     timer.start(); 
    } 

    public void addNotify() { 
     super.addNotify(); 
     B_WIDTH = getWidth(); 
     B_HEIGHT = getHeight(); 

    } 

    public void paint(Graphics g) { 
     super.paint(g); 

     if (ingame) { 

      Graphics2D g2d = (Graphics2D)g; 

      if (player.isVisible()) 
       g2d.drawImage(player.getImage() 
        , player.getX(), player.getY(), this); 

      g2d.setColor(Color.BLACK); 
      g2d.drawString("ViewA: ", 5, 15);   
     } 

     Toolkit.getDefaultToolkit().sync(); 
     g.dispose(); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 

     player.move(); 
     checkCollisions(); 
     repaint(); 
    } 

    public void checkCollisions() { 
    } 

    private class TAdapter extends KeyAdapter { 
     public void keyReleased(KeyEvent e) { 
      player.keyReleased(e); 
     } 

     public void keyPressed(KeyEvent e) { 
      player.keyPressed(e); 
     } 
    } 
} 

ответ

5
  • использование CardLayout для переключения видом посредникам (ViewA, ViewB, ViewC, ViewD), в противном случае вы должны позвонить (re)validate и repaint за JFrame (как последние строки кода, после всех изменений в уже видимом графическом интерфейсе Swing выполняется)

  • заказ картина сделана paintComponent() вместо paint()

  • удалить недействительным public void addNotify() { и вместо этого пробела, чтобы переопределить getPreferredSize, то все координаты Objects в JPanel основаны на getWeight/Height

+1

+1 для 'CardLayout', я как раз собирался это написать. – Dahaka

+0

"удалить void public void addNotify() {и вместо этого void переопределить getPreferredSize, тогда все координаты для объектов в JPanel основаны на getWeight/Height" - так удалить addNotify() вообще? Или сделайте это 'public void addNotify() { super.addNotify(); B_WIDTH = getWidth(); B_HEIGHT = getHeight(); super.setPreferredSize (новое измерение (B_WIDTH, B_HEIGHT)); } '}' – user2556304

+0

удалите весь блок кода, нет причины ничего уведомлять, пожалуйста, попробуйте связанный код, щелкнув мышью на getPreferredSize, затем вы можете сравнить, btw искать здесь paintComponent + getPreferredSize, заказать по новее, затем вы можете увидеть несколько чудес – mKorbel

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