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
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?