0

Where is this happening? What I know: Canvas is displayed properly, due to the yellow. However, graphics will not cover the canvas completely, nor will my law class recognized it past the end of the black area...

So what is causing this to happen? And how could I draw on my currently undrawable section of canvas(yellow part), or should I just implement my graphics another way?

EDIT: The UI class creates a canvas and a buffer, then the graphics class takes over and starts drawing on them, however for some reason it cannot in the yellow section, nor will the Law Class which handles collision with the red cube and walls of the app, regogize the yellow area as a valid place to go. Even through the same variables for dimensions, were used everywhere.

Main Class

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();

    }
}

UI Class

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();
    }
}

Graphics Class

    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);
        }
    }

Law Class

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;
        }
    }
}
Dr Zarreh
  • 57
  • 6

2 Answers2

1

This is a bug with Frame#setResizable. Don't ask me why, but it wants to add about 10 pixels to the width and height of the frame.

The best solution I know is to call setResizable BEFORE pack

void show() {
    mainWin.add(wall);
    mainWin.setResizable(false); // Call me first
    mainWin.pack();
    mainWin.setLocationRelativeTo(null);
    mainWin.setVisible(true);
}
MadProgrammer
  • 343,457
  • 22
  • 230
  • 366
0

You're not interacting with Swing properly, and you're doing unsafe things with a default Graphics object you should not be touching. Here's the bare bones of what needs to happen, in order.

  • JFrame mainFrame = new JFrame()
  • MyCanvas myCanvas = new MyCanvas()
  • mainFrame.getContentPane().add(myCanvas, BorderLayout.CENTER)
  • mainFrame.setVisible(true);
  • new Thread(myThread).start()
  • Main.main() returns.

MyCanvas needs to look something like this:

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.
}

Here's the physics update thread:

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);
    }
}

You probably want to add constructors to these objects and pass in references to your other objects they need to reference.

NovaDenizen
  • 5,089
  • 14
  • 28