Otóż ma problem z implementacją wykrywania kolizji między kwadratami. Zamiar jest taki, by metoda playerIsDefeated wykryła gdy kwadrat gracza (skrajnie po lewej) zderza się z kwadratem-wrogiem (nadchodzące z prawej). Po etapie zabaw z wyciąganiem współrzędnych z oraz y, gdy kod jako tako działał ale było dość sporo błędów dogrzebałem się do metody intersects(), która owe kolizje ma wykrywać. Oto jej użycie:
Metoda playerIsDefeated:
Ukryta treść:
Kod: Zaznacz cały
public boolean playerIsDefeated(){
for (int i=0; i<actualEnemiesNumber; i++){
if (littleRect.intersects(enemiesList.get(i))==true) {
return true;
}
}
return false;
}
Kod klasy MyPanel, zawierający tą metodę:
Ukryta treść:
Kod: Zaznacz cały
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package gierrka;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JPanel;
import javax.swing.Timer;
/**
*
* @author Abc
*/
class MyPanel extends JPanel{
private final int step;
private final int multiplier;
private final int interval;
private final int enemiesNumber;
private int width, height, xCoord, yCoord;
private int widthLit, heightLit, xCoordLit, yCoordLit;
private int actualEnemiesNumber;
private int xCoordEnemy, yCoordEnemy;
private int defeatedEnemies;
private List<Rectangle2D> enemiesList;
private Rectangle2D rect2d;
private Rectangle2D littleRect;
private Random ranGenerator;
private Timer timer;
public MyPanel(int widthT, int heightT) {
super();
interval=2000;
timer = new Timer(interval, event);
timer.start();
multiplier=24;
step=5;
enemiesNumber=3;
actualEnemiesNumber=1;
defeatedEnemies=0;
width=widthT;
height=heightT;
widthLit=widthT/32;
heightLit=heightT/32;
xCoord=(int)(width/16);
yCoord=(int) (height/16);
xCoordLit=(int)(width/16)+3;
yCoordLit=(int)(height/16)+3;
setSize(new Dimension(width, height));
xCoordEnemy = xCoord+(widthLit*multiplier);
setForeground(Color.red);
rect2d = new Rectangle2D.Double(xCoord,yCoord,width*0.75,height*0.75);
littleRect = new Rectangle2D.Double(xCoordLit,yCoordLit,widthLit,heightLit);
enemiesList = new ArrayList(enemiesNumber);
ranGenerator = new Random();
yCoordEnemy = ((int)rect2d.getY()) + ranGenerator.nextInt((heightLit*multiplier)+step);
Rectangle2D rect = new Rectangle2D.Double(xCoordEnemy,yCoordEnemy,widthLit, heightLit);
enemiesList.add(rect);
}
public void moveNorth(){
if (yCoordLit>yCoord){
yCoordLit-=step;
}
} /*
public void moveWest(){
if (xCoordLit>xCoord){
xCoordLit-=step;
}
}
public void moveEast(){
if(xCoordLit<(xCoord+(widthLit*11))){
xCoordLit+=step;
}
}*/
public void moveSouth(){
if (yCoordLit<(yCoord+(heightLit*multiplier)+step)){
yCoordLit+=step;
}
}
public void moveEnemies(){
int enemiesNumberT = enemiesList.size();
//xCoordEnemy-=3;
for (int i=0; i<enemiesNumberT; i++){
if ((int)(enemiesList.get(i).getX()-(step/2))>xCoord){
enemiesList.get(i).setRect((int)(enemiesList.get(i).getX()-(step/2)), (int)enemiesList.get(i).getY(), widthLit, heightLit);
}
}
destroyEnemyIfDefeated();
}
private void addEnemy(){
if (actualEnemiesNumber<enemiesNumber){
yCoordEnemy = ((int)rect2d.getY()) + ranGenerator.nextInt((heightLit*multiplier)+step);
Rectangle2D rect = new Rectangle2D.Double(xCoordEnemy,yCoordEnemy,widthLit, heightLit);
enemiesList.add(rect);
actualEnemiesNumber++;
}
}
private void destroyEnemyIfDefeated(){
for (int i=0; i<actualEnemiesNumber; i++){
if ((enemiesList.get(i).getX()-step/2)<xCoord+3){
enemiesList.remove(i);
//System.out.println("rozmiar:" + enemiesList.size());
actualEnemiesNumber--;
defeatedEnemies++;
}
}
}
public boolean playerIsDefeated(){
for (int i=0; i<actualEnemiesNumber; i++){
if (littleRect.intersects(enemiesList.get(i))==true) {
return true;
}
}
return false;
}
ActionListener event = new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
addEnemy();
if (playerIsDefeated()){
timer.stop();
}
}
};
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2D = (Graphics2D) g;
g2D.draw(rect2d);
g2D.fillRect(xCoordLit,yCoordLit,(int)(widthLit)+1,(int)(heightLit)+1);
for (int i=0; i<actualEnemiesNumber; i++){
g2D.fillRect((int)enemiesList.get(i).getX(), (int)enemiesList.get(i).getY(), widthLit, heightLit);
}
}
}
Ukryta treść:
Kod: Zaznacz cały
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package gierrka;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.Timer;
/**
*
* @author Abc
*/
class MyFrame extends JFrame implements KeyListener{
private int width, height;
private MyPanel panel;
private final int interval;
private Timer timer;
public MyFrame(int widthT, int heightT) {
super("Gierrka!");
width=widthT;
height=heightT;
interval=50;
timer = new Timer(interval, event);
timer.start();
setLayout( new BorderLayout(5,1));
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize( new Dimension(width, height));
setVisible(true);
setLocation(0, 0);
setBackground(Color.white);
addKeyListener(this);
double widthD=0.75*width;
double heightD=0.75*height;
panel = new MyPanel((int)widthD,(int)heightD);
add(panel, BorderLayout.CENTER);
}
ActionListener event = new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
panel.moveEnemies();
if (panel.playerIsDefeated()){
timer.stop();
}
repaint();
}
};
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
int keyCode=e.getKeyCode();
switch (keyCode){
case KeyEvent.VK_UP:
panel.moveNorth();
break;
/* case KeyEvent.VK_LEFT:
panel.moveWest();
break;
case KeyEvent.VK_RIGHT:
panel.moveEast();
break; */
case KeyEvent.VK_DOWN:
panel.moveSouth();
break;
}
}
@Override
public void keyReleased(KeyEvent e) {
}
}
Ukryta treść:
Kod: Zaznacz cały
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package gierrka;
import java.awt.EventQueue;
/**
*
* @author Abc
*/
public class Gierrka {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
MyFrame frame;
frame = new MyFrame(800,720);
}
});
}
}
Z góry dziękuję za pomoc,
Pneumokok.