przesuwalne obrazki i operacje na nich

0

Cześć, mam mały problem. Piszę aplikację, w której główną częścią będzie przesuwanie obrazków po ekranie ( odwzorowanie jakichś przedmiotów ) i wywoływanie jakichś zachowań między nimi, gdy się do tego zbliżą. Nie daję rady ruszyć do przodu z projektem, bo mam problem, w jaki sposób to zacząć, tj. męczę się z dodaniem kilku ruchomych obrazków do jednego okna i wywołań jakichś funkcji tylko w przypadku, gdy są na sobie, ewentualnie blisko. Udało mi się zrobić coś na wzór tego, tj. napisałem aplikację, w której mogę przesuwać dwa obiekty (rectangle) po ekranie. Niestety jak się na siebie nasuną, to sieją się dziwne rzeczy ( pewnie źle zaprogramowałem metody z mouselistenera ). Czy ktoś z Was mógłby mi pomóc z rozwiązaniem tego problemu? Mam małe doświadczenie z projektowaniem interfejsu graficznego w javie, w c# jakoś bym z tym ruszył...

0

W linijce 3. tego listenera masz błąd.

Tak na poważnie, to pochwal się tym listenerem w którym podejrzewasz błąd, bo inaczej ciężko ci będzie pomóc.

0
import java.applet.Applet;
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Label;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.ImageIcon;
import javax.swing.JApplet;

//Use double buffering to remove rectangle flickers and make it repaint faster.
public class ShapeMover extends JApplet
{

    public void init()
    {
        getContentPane().setLayout(new BorderLayout());
        getContentPane().add(new MyCanvas());
    }

    public static void main(String s[])
    {
        Frame f = new Frame("ShapeMover");
        f.addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent e)
            {
                System.exit(0);
            }
        });
        Applet applet = new ShapeMover();
        f.add("Center", applet);
        applet.init();
        f.pack();
        Toolkit tk = Toolkit.getDefaultToolkit();
        Dimension screenSize = tk.getScreenSize();
        int scrWidth = screenSize.width - 300;
        int scrHeight = screenSize.height - 300;
        f.setSize(scrWidth, scrHeight);
        f.show();

    }
}

class MyCanvas extends Canvas implements MouseListener, MouseMotionListener
{
    Rectangle rect = new Rectangle(0, 0, 50, 50);
    
    Rectangle rect1 = new Rectangle(0, 0, 50, 50);

    Image image = getToolkit().getImage("a.png");

    Graphics2D g2;

    int preX, preY;
    
    int preX1, preY1;

    int lastX, lastY;

    boolean isFirstTime = true;

    Rectangle area;

    boolean pressOut = false;
    boolean pressOut1 = false;

    public MyCanvas()
    {
        setBackground(Color.white);
        addMouseMotionListener(this);
        addMouseListener(this);
    }

    public void mousePressed(MouseEvent e)
    {
        preX = rect.x - e.getX();
        preY = rect.y - e.getY();
        
        preX1 = rect1.x - e.getX();
        preY1 = rect1.y - e.getY();

        if (rect1.contains(e.getX(), e.getY()))
        {
            updateLocation(e, rect1);
        }
        else
        {
            pressOut1 = true;
        }
        if(rect.contains(e.getX(), e.getY()))
        {
            updateLocation(e, rect);
        }
        else
        {
            pressOut = true;
        }
    }

    public void mouseDragged(MouseEvent e)
    {
        if (!pressOut)
        {
            updateLocation(e, rect);
        }
        else if(!pressOut1)
        {
            updateLocation(e, rect1);
        }
    }

    public void mouseReleased(MouseEvent e)
    {
        if (rect.contains(e.getX(), e.getY()))
            updateLocation(e, rect);
        else
        {
            pressOut = false;
        }
        if(rect1.contains(e.getX(), e.getY()))
        {
            updateLocation(e, rect1);
        }
        else
        {
            pressOut1= false;
        }
    }

    public void mouseMoved(MouseEvent e)
    {
    }

    public void mouseClicked(MouseEvent e)
    {
    }

    public void mouseExited(MouseEvent e)
    {
    }

    public void mouseEntered(MouseEvent e)
    {
    }

    public void updateLocation(MouseEvent e, Rectangle sender)
    {
        if(sender == rect)
        {
            rect.setLocation(preX + e.getX(), preY + e.getY());
            lastX = e.getX();
            lastY = e.getY();
            repaint();
        }
        if(sender == rect1)
        {
            rect1.setLocation(preX1 + e.getX(), preY1 + e.getY());
            lastX = e.getX();
            lastY = e.getY();
            repaint();
        }
        
    }

    public void paint(Graphics g)
    {
        update(g);
    }

    public void update(Graphics g)
    {
        Graphics2D g2 = (Graphics2D) g;
        Dimension dim = getSize();
        int w = (int) dim.getWidth();
        int h = (int) dim.getHeight();

        if (isFirstTime)
        {
            area = new Rectangle(dim);
            rect.setLocation(w / 2 - 50, h / 2 - 25);
            rect1.setLocation(w/2-200, h/2-150);
            isFirstTime = false;
        }

        // Rysuje prostokąt na cały ekran, w ten sposób czyści.
        g2.setPaint(Color.white);
        g2.fillRect(0, 0, w, h);

        g2.setColor(Color.black);
        g2.draw(rect);
        g2.draw(rect1);

        //g2.drawImage(image, lastX, lastY, null); // ten obrazek próbuje podążać za ostatnim ruchem prostokąta

    }
}

Na razie to wycudowałem. Może jednak lepiej użyć jakeijś biblioteki graficznej do gier?

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