Object toevoegen

Status
Niet open voor verdere reacties.

Tim Hovius

Gebruiker
Lid geworden
25 jan 2008
Berichten
788
Hallo allemaal,

Ik ben bezig met een applicatie met bubbels. Als de bubbels tegen de boom-bubbel botsen, ontploft die. De boom-bubbel wordt toegevoegd met een muisklik.

Ik heb alleen een paar probleempjes:
  1. Hoe voeg ik de boom bubbel toe zodat deze zichtbaar is in het JPanel BubblePaneel? Ik voeg de boom-bubbel nu in de CollisionChecker toe.
  2. Hoe krijg ik de x- en y coördinaten van de boom-bubbel? Ik heb de x en y nu een vaste waarde gegeven (Point).

De code:

BubbleApp
[CPP]package magicBubbles;

import javax.swing.*;

public class BubbleApp extends JFrame
{
public BubbleApp()
{
this.setBounds(50, 50, 1000, 600);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setResizable(false);
this.setTitle("Magic Bubbles");

BubblePaneel bubblePaneel = new BubblePaneel();
this.add(bubblePaneel);

this.setVisible(true);

}

public static void main(String[] args)
{
new BubbleApp();
}

}
[/CPP]
BubblePaneel
[CPP]package magicBubbles;

import java.awt.*;
import java.awt.event.*;
import java.util.*;

import javax.swing.*;

public class BubblePaneel extends JPanel implements MouseListener
{
private ArrayList<MagicBubble> magicBubble;

public BubblePaneel()
{
this.setLayout(null);
magicBubble = new ArrayList<MagicBubble>();
this.addMouseListener(this);

for (int i = 0; i < 50; i++)
{
Random random = new Random();

Point middelpunt = new Point();
middelpunt.setLocation(random.nextInt(946), random.nextInt(541));

MagicBubble bubble = new MagicBubble(middelpunt, 15, Color.blue,
"BEWEGEN");
this.add(bubble);
this.magicBubble.add(bubble);
}
}

public void mousePressed(MouseEvent e)
{
@SuppressWarnings("unused")
CollisionChecker checker = new CollisionChecker(magicBubble);
repaint();
}

public void mouseClicked(MouseEvent e)
{

}

public void mouseEntered(MouseEvent e)
{

}

public void mouseExited(MouseEvent e)
{

}

public void mouseReleased(MouseEvent e)
{

}

}
[/CPP]
CollisionChecker
[CPP]package magicBubbles;

import java.awt.*;
import java.util.*;

public class CollisionChecker implements Runnable
{
MagicBubble bubble;
MagicBubble boom;
Point middelpunt;
BubblePaneel paneel;

private ArrayList<MagicBubble> magicBubble;

public CollisionChecker(ArrayList<MagicBubble> magicBubble)
{
Thread thread = new Thread(this);
thread.start();

this.magicBubble = new ArrayList<MagicBubble>();
this.magicBubble = magicBubble;

}

private boolean collision(MagicBubble boom, MagicBubble bubble)
{
Point m1 = boom.getMiddelpunt();
int r1 = boom.getStraal();
Point m2 = bubble.getMiddelpunt();
int r2 = bubble.getStraal();
return ((Math.pow(m1.x - m2.x, 2) + Math.pow(m1.y - m2.y, 2)) < Math
.pow(r1 + r2, 2));
}

public void run()
{
Point middelpunt = new Point();
middelpunt.setLocation(120, 120);
System.out.println(middelpunt);

this.boom = new MagicBubble(middelpunt, 5, Color.red, "EXPLODEREN");

while (true)
{
for (int i = 0; i < magicBubble.size(); i++)
{
bubble = magicBubble.get(i);

if (collision(boom, bubble) == true)
{
if (bubble.getStatus() == "BEWEGEN")
{
bubble.setStatus("EXPLODEREN");
}
}
}
}
}
}
[/CPP]
MagicBubble
[CPP]package magicBubbles;

import java.awt.*;
import java.awt.event.*;
import java.util.*;

import javax.swing.*;
import javax.swing.Timer;

public class MagicBubble extends JPanel implements ActionListener,
MouseListener
{
private Timer timer;
private Color kleur;
private Point middelpunt;
private int straal, dx, dy;
private String status;



public MagicBubble(Point middelpunt, int straal, Color kleur, String status)
{
this.addMouseListener(this);
this.setOpaque(false);
this.setBounds(middelpunt.x - straal, middelpunt.y - straal,
straal * 2, straal * 2);

this.timer = new Timer(20, this);
timer.start();

this.middelpunt = middelpunt;
this.straal = straal;
this.kleur = kleur;
this.status = status;
}

public void beweeg()
{
if (middelpunt.x <= 0)
{
dx = 1;
middelpunt.x += dx;
}

if (middelpunt.y <= 0)
{
dy = 1;
middelpunt.y += dy;
}

if (middelpunt.x >= 964)
{
dx = -1;
middelpunt.x += dx;
}

if (middelpunt.y >= 541)
{
dy = -1;
middelpunt.y += dy;
}
}

public void animeer()
{
if (status == "BEWEGEN")
{
Random random = new Random();

int nummer = random.nextInt(50);

if (nummer == 0)
{
dx = random.nextInt(3) - 1;
dy = random.nextInt(3) - 1;
}

this.middelpunt.x += dx;
this.middelpunt.y += dy;

this.setLocation(middelpunt);

beweeg();
}
}

public void explodeer()
{
if (status == "EXPLODEREN")
{
middelpunt.x -= 1;
middelpunt.y -= 1;

this.straal += 1;
this.setSize(straal * 2 + 1, straal * 2 + 1);
this.setLocation(this.getX() - 1, this.getY() - 1);
repaint();
}

if (straal >= 100)
{
status = "KRIMPEN";
}
}

public void krimp()
{
if (status == "KRIMPEN")
{
middelpunt.x += 1;
middelpunt.y += 1;

this.straal -= 1;
this.setSize(straal * 2 - 1, straal * 2 - 1);
this.setLocation(this.getX() + 1, this.getY() + 1);
repaint();
}

if (straal <= 0)
{
status = "KLAAR";
}
}

public void paintComponent(Graphics g)
{
super.paintComponent(g);

g.setColor(kleur);
g.fillOval(0, 0, straal * 2, straal * 2);
}

public void actionPerformed(ActionEvent e)
{
this.animeer();
this.explodeer();
this.krimp();
this.repaint();
}

public void mousePressed(MouseEvent arg0)
{
this.requestFocus();
this.status = "EXPLODEREN";
}

public void mouseClicked(MouseEvent arg0)
{

}

public void mouseEntered(MouseEvent arg0)
{

}

public void mouseExited(MouseEvent arg0)
{

}

public void mouseReleased(MouseEvent arg0)
{

}

public String getStatus()
{
return status;
}

public void setStatus(String status)
{
this.status = status;
}

public Point getMiddelpunt()
{
return this.middelpunt;
}

public int getStraal()
{
return this.straal;
}

}
[/CPP]
 
Ik heb even gekeken en heb het op de volgende manier opgelost.

Ten eerste heb ik de volgende regel verwijderd aangezien daardoor ongeindig veel threads gespawned werden:
[cpp]
public void mousePressed(MouseEvent e)
{
@SuppressWarnings("unused")
//alleen de regel hieronder.
CollisionChecker checker = new CollisionChecker(magicBubble);
repaint();
}
[/cpp]

[cpp]

public void mousePressed(MouseEvent e)
{
@SuppressWarnings("unused")
Point p = e.getPoint();
checker.addBoom(p,this);
repaint();
}

[/cpp]


ik heb de collisionchecker in de constructor gezet zodat er maar 1 instantie van gemaakt wordt.

Vervolgens heb ik een aanpassing gemaakt in de MagicBubbel class. Deze heeft nu de bubbelPanel als paramter nodig (Je zult toch op een manier het object aan de panel moeten toevoegen. Hier zal waarschijnlijk een elegantere oplossing voor zijn)

Daarna heb ik in de class COllisionCHecker het volgende toegevoegt:

[cpp]

public void addBoom(Point p, BubblePaneel paneel){

if (boom != null){
this.boom.remove();
}

this.boom = new MagicBubble(p, 15, Color.red, "EXPLODEER", paneel);

}

[/cpp]

tot slot heb ik nog de run methode aangepast in de collisionchecker aangezien een thread.sleep wel handig is. hij hoeft niet elke nano seconden te kijken lijkt me :)

[cpp]

public void run()
{

while (keepRunning)
{

if (boom != null){

for (int i = 0; i < magicBubble.size(); i++)
{
bubble = magicBubble.get(i);

if (collision(boom, bubble) == true)
{
if (bubble.getStatus() == "BEWEGEN")
{
bubble.setStatus("EXPLODEREN");
}

boom.remove();
boom = null;
break;
}
}

}
try {
Thread.sleep(150);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
[/cpp]


voor de complete modificatie: http://dl.dropbox.com/u/3380837/Bubble.rar
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan