Problem z obsługą myszy

0

Witam. Mam do napisania prostą grę w Javie. Natrafiłem na pewien problem kiedy chciałem zaimplementować obsługę myszy. Ale najpierw może przedstawię to, co do tej pory udało mi się napisać:

SpaceMission.java:

package spacemission;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GraphicsDevice; // te dwa potzrebne do fullscreena
import java.awt.GraphicsEnvironment;
import java.awt.image.BufferStrategy;
import java.io.File;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class SpaceMission extends Canvas {
  private static final int GAMEWIDTH = 800;
  private static final int GAMEHEIGHT = 600;
  public static final String imagespath = "src" + File.separator + "spacemission" + File.separator + "images" + File.separator;
  private String imagepath = imagespath + "player" + File.separator + "czstrzala.gif";
  private BufferStrategy bstrategy;
  private Sprites sprites = new Sprites();
  private void InitSpaceMission() {
    JFrame Window = new JFrame("Space Mission v. 0.0001");
    JPanel Panel = (JPanel) Window.getContentPane();
    setBounds(0, 0, GAMEWIDTH, GAMEHEIGHT);
    Panel.setPreferredSize(new Dimension(GAMEWIDTH, GAMEHEIGHT));
    Panel.setBackground(new Color(0, 0, 0));
    Panel.setLayout(null);
    Panel.add(this);

    Window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Window.setBounds(0, 0, GAMEWIDTH, GAMEHEIGHT);
    Window.setResizable(false);
    Window.setLocationRelativeTo(null);
    Window.setIconImage(new ImageIcon(imagespath +"icon.gif").getImage());
    //odkomentować dla fullscreen
    //if (!Window.isDisplayable()) Window.setUndecorated(true);
    //GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
    //gd.setFullScreenWindow(Window);
    //if (gd.isFullScreenSupported()) {
      Window.setVisible(true);
    //}
    createBufferStrategy(2);
    bstrategy = getBufferStrategy();
    requestFocus();
  }

  private void PaintWorld() {
    Menu m = new Menu();
    IButton bu = m.PaintMenu();
    Graphics g = bstrategy.getDrawGraphics();
    g.drawImage(sprites.getSprite(bu.returnImagePath()), 300, 400, this);
    bstrategy.show();
    /*Graphics g = bstrategy.getDrawGraphics();
    g.drawImage(sprites.getSprite(imagepath), 300, 400, this);
    g.drawString("SpaceMission v 0.00001", 5, 15);
    bstrategy.show();*/
  }

  public static void main(String[] args) {
    SpaceMission NewGame = new SpaceMission();
    NewGame.InitSpaceMission();
    while (true) {
      NewGame.PaintWorld();
      try {
        Thread.sleep(1000);
      } catch (Exception e) {
        System.out.println(e);
        System.exit(0);
      }
    }
  }
}

IButton.java:

package spacemission;

import java.io.File;

public class IButton {
  private int width = 300;
  private int height = 100;
  private String uppath;
  private String downpath;
  private boolean isdown;

  IButton(String buttonname) { 
    isdown = false;
    uppath = SpaceMission.imagespath + "buttons" + File.separator + "up_" + buttonname;
    downpath = SpaceMission.imagespath + "buttons" + File.separator + "down_" + buttonname;
  }

  IButton(String buttonname, int width, int height) {
    this(buttonname);
    this.width = width;
    this.height = height;
  }

  public int returnWidth() {
    return width;
  }

  public int returnHeight() {
    return height;
  }
  public boolean returnState() {
    return isdown;
  }

  public void SwitchState() {
    if (isdown) isdown = false;
    else isdown = true;
  }
 
  public String returnImagePath() {
    if (isdown) return downpath;
    else return uppath;
  }
}

Menu.java

package spacemission;

import java.awt.Canvas;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

public class Menu extends Canvas implements MouseListener, MouseMotionListener {
  private IButton button1 = new IButton("exit.jpg");
  private int button1x = 30;
  private int button1y = 50;

  Menu() {
    addMouseListener(this);
    addMouseMotionListener(this);
  }

  public IButton PaintMenu() {
    return button1;
  }

  public void mouseExited(MouseEvent e) {}
  public void mouseEntered(MouseEvent e) {}
  public void mouseReleased(MouseEvent e) {
    button1.SwitchState();
    System.out.println("saaead");
  }
  public void mousePressed(MouseEvent e) {
    Point p = new Point();
    System.out.println("saad");
    if ((p.x < button1.returnWidth()+button1x) && (p.y < button1.returnHeight()+button1y) && (p.x > button1x) && (p.y > button1y)) {
      button1.SwitchState();
    }
  }
  public void mouseClicked(MouseEvent e) {}
  public void mouseMoved(MouseEvent e) {}
  public void mouseDragged(MouseEvent e) {}
}

Mam jeszcze plik Sprites.java, ale on jest sprawdzony wzdłuż i wszerz, zresztą nie tu leży problem. Generalnie chodzi mi o to, że próbuję narysować w okienku wyświetlanym w pliku głównym przycisk (IButton) obsługiwany myszą. Plik Menu odpowiada za przygotowanie do wyświetlenia i obsługę kilku takich przycisków. Jako że zna ona współrzędne każdego przycisku, odpowiadać ma również za mysz. W tym momencie udaje mi się wyświetlić 1 obrazek przycisku, ale nie reaguje on na myszkę (miałby być wyświetlony 2 obrazek i wypisane jakieś bzdury na wyjście ;)). Od razu mówię, że jestem bardzo początkujący w Javie, co zresztą pewnie widać. :)

0

Nie widzę byś podpiął do buttona MouseListenera i MouseMotionListenera.

0

Do buttona? Nie bardzo rozumiem, po co? Button zmienia u mnie tylko stan i w zależności od tego stanu wyświetla odpowiedni obrazek. A stan ten jest zmieniany w klasie Menu, po kliknięciu myszą.

1 użytkowników online, w tym zalogowanych: 0, gości: 1