2013-05-21 5 views
0

Where is this happening? Что я знаю: Холст отображается правильно, из-за желтого. Тем не менее, графика не будет полностью покрывать полотно, и мой законный класс не узнал бы его после конца черной области ...Графика не покрывает весь холст

Так что же это может случиться? И как я мог бы нарисовать мою текущую часть холста (желтую часть), или я должен просто реализовать свою графику по-другому?

EDIT: класс пользовательского интерфейса создает холст и буфер, тогда класс графики берет на себя и начинает рисовать на них, однако по какой-то причине он не может быть в желтой секции, и законный класс, который обрабатывает столкновение с красным куб и стены приложения, отрегулируйте желтую область в качестве действующего места. Даже через одни и те же переменные для измерений использовались повсюду.

Главный класс

package app; 

public class Main { 

    static final int X = 1024; 
    static final int Y = 680; 
    static final int sanic = 10; 
    int fps = 0; 
    int frames = 0; 
    long totalTime = 0; 
    long curTime = System.currentTimeMillis(); 
    long lastTime = curTime; 
    static int[] pos; 
    Graphics graphics; 
    Law physics; 
    static int status; 
    boolean holdState; 

    public Main() { 
     pos = new int[5]; 
     pos[1] = X; 
     pos[2] = Y; 
    } 

    public void launch() { 
     // Audio sound = new Audio(); 
     graphics = new Graphics(); 
     physics = new Law(); 
     graphics.draw(); 
     // sound.play(); 
     handle(); 
    } 

    public void update() { 
     graphics.cache(); 
     physics.check(); 
     graphics.render(); 
     try { 
      Thread.sleep(10); 
     } catch (Exception e) { 
     } finally { 
      graphics.dump(); 
     } 
    } 

    public void handle() { 
     while (!isOver()) { 
      if (!isPaused()) { 
       update(); 
      } 
     } 
    } 

    boolean isOver() { 
     if (status == 1) { 
      status = 0; 
      return true; 
     } 
     return false; 
    } 

    boolean isPaused() { 
     if (status == 2) { 
      status = 0; 
      if (!holdState) { 
       holdState = true; 
       pos[3] = pos[1]; 
       pos[4] = pos[2]; 
      } else if (holdState) { 
       holdState = false; 
       pos[1] = pos[3]; 
       pos[2] = pos[4]; 
      } 
     } 
     return holdState; 
    } 

    public static void main(String[] args) { 
     Main game = new Main(); 
     game.launch(); 

    } 
} 

Class UI

package app; 

import java.awt.*; 
import java.awt.image.*; 
import java.net.URL; 
import javax.swing.*; 

public class UI extends Main { 

    JFrame mainWin; 
    Canvas wall; 
    URL pic; 
    Toolkit kit; 
    Image img; 
    BufferStrategy Buffer; 
    Graphics2D shell; 
    Graphics2D ball; 

    public UI() { 
     mainWin = new JFrame("Game"); 
     wall = new Canvas(); 
     wall.addKeyListener(new Input()); 
    } 

    void draw() { 
     frame(); 
     icon(); 
     canvas(); 
     show(); 
     prep(); 
    } 

    void frame() { 
     mainWin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     mainWin.setBackground(Color.BLUE); 
     mainWin.setIgnoreRepaint(true); 
    } 

    void icon() { 
     pic = ClassLoader.getSystemResource("res/app.png"); 
     kit = Toolkit.getDefaultToolkit(); 
     img = kit.createImage(pic); 
     mainWin.setIconImage(img); 

    } 

    void canvas() { 
     wall.setBackground(Color.YELLOW); 
     wall.setIgnoreRepaint(true); 
     wall.setBounds(0, 0, X, Y); 
    } 

    void show() { 
     mainWin.add(wall); 
     mainWin.pack(); 
     mainWin.setResizable(false); 
     mainWin.setLocationRelativeTo(null); 
     mainWin.setVisible(true); 
    } 

    void prep() { 
     wall.createBufferStrategy(2); 
     Buffer = wall.getBufferStrategy(); 
    } 
} 

Графика Класс

package app; 

    import java.awt.*; 

    public class Graphics extends UI { 
    public void render() { 
     mask(); 
     player(); 
     fps(); 
     Buffer.show(); 
    } 

    void cache() { 
     shell = (Graphics2D) Buffer.getDrawGraphics(); 
     ball = (Graphics2D) Buffer.getDrawGraphics(); 
    } 

    void dump() { 
     shell.dispose(); 
     ball.dispose(); 
    } 

    void mask() { 
     shell.setColor(Color.black); 
     shell.fillRect(0, 0, X, Y); 
    } 

    void fps() { 
     lastTime = curTime; 
     curTime = System.currentTimeMillis(); 
     totalTime += curTime - lastTime; 
     if (totalTime > 1000) { 
      totalTime -= 1000; 
      fps = frames; 
      frames = 0; 
     } 
     frames++; 
     shell.setColor(Color.GREEN); 
     shell.setFont(new Font("Courier New", Font.PLAIN, 12)); 
     shell.drawString(String.format("FPS: %s", fps), 20, 20); 
    } 

     void player() { 
      ball.setColor(Color.RED); 
      ball.fillRect(pos[1], pos[2], 32, 32); 
     } 
    } 

Закон Класс

package app; 

public class Law extends Main { 

    public void check() { 
     out(); 
    } 

    void out() { 
     if (pos[1] < 0) { 
      pos[1] = 0; 
     } 
     if (pos[2] < 0) { 
      pos[2] = 0; 
     } 
     if (pos[1] > X - 32) { 
      pos[1] = X - 32; 
     } 
     if (pos[2] > Y - 32) { 
      pos[2] = Y - 32; 
     } 
    } 
} 
+0

Вы можете быть более описательным в своей проблеме? на что он должен быть похож? Я не хочу, чтобы вы изучали весь источник, чтобы узнать, что происходит. – Breavyn

+0

K, добавлено описание. –

+0

Это проблема с 'setResizble', которая хочет добавить около 10 пикселей к ширине и высоте – MadProgrammer

ответ

1

Это ошибка с Frame#setResizable. Не спрашивайте меня, почему, но он хочет добавить около 10 пикселей к ширине и высоте кадра.

Лучшее решение, которое я знаю, это позвонить setResizable ДО pack

void show() { 
    mainWin.add(wall); 
    mainWin.setResizable(false); // Call me first 
    mainWin.pack(); 
    mainWin.setLocationRelativeTo(null); 
    mainWin.setVisible(true); 
} 
+0

Вот и все ... Спасибо, и я думаю, что он украл пространство для воображаемых полос прокрутки? –

+0

Я изначально думал, что вы рисуете непосредственно основную рамку ... – MadProgrammer

0

Вы не взаимодействуя с Свинг должным образом, и вы делаете небезопасные вещи по умолчанию Graphics объекта, который вы не должны касаться. Вот голой кости того, что должно произойти, в порядке.

  • JFrame mainFrame = new JFrame()
  • MyCanvas myCanvas = new MyCanvas()
  • mainFrame.getContentPane().add(myCanvas, BorderLayout.CENTER)
  • mainFrame.setVisible(true);
  • new Thread(myThread).start()
  • Main.main() возвращается.

MyCanvas должен выглядеть примерно так:

public class MyCanvas extends Canvas { 
    public void paint(Graphics g) { 
     // drawing code goes here 
    } // g is now no longer valid. Don't hold onto it or dispose it or anything. 
} 

Вот обновление физики нить:

public class MyThread implements Runnable { 
    public void run() { 
     while (keepRunning()) { 
      physics.update(); 
      myCanvas.repaint(); // myCanvas.paint() will eventually be called 
      sleep(10); 
     } 
     System.exit(0); 
    } 
} 

Вы, вероятно, хотите добавить конструкторов к этим объектам и передавать в ссылках на другие объекты, которые они должны ссылаться.

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