import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.Timer;
import java.util.ArrayList;
import java.awt.Component;
import java.awt.Color;
import java.awt.Graphics2D;
import java.io.*;
public class Prova10 extends JPanel{
public static void main(String [] args){
JFrame finestra = new MyFrame();
finestra.setVisible(true);
finestra.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
class MyFrame extends JFrame{
final int X = 530;
final int Y = 530;
private int schermoW, schermoH;
private int MaxBersagli = 10; //numero bersagli per ogni stage
private GiocoPanel myGioco;
private DatiPanel myDati;
private int Stage, Obiettivi, Punti, Points;
private double G = 40, raggio;
public int Colpiti = 0;
private Giocatore Player = new Giocatore();
private String NomeGiocatore;
public Giocatore getGiocatore(){
return Player;
}
public MyFrame(){
Dimension schermo = Toolkit.getDefaultToolkit().getScreenSize();
schermoH = schermo.height;
schermoW = schermo.width;
setTitle("Shoot At It");
setResizable(false);
setLocation( schermoW/2-250, schermoH/2-250);
setSize(X,Y);
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BorderLayout()); // BORDER LAYOUT
myGioco = new GiocoPanel();
myDati = new DatiPanel(1,0,0);
myDati.setStage(1);
myDati.setObiettivi(0);
myDati.setPunti(0);
myDati.refreshDati();
mainPanel.add(myGioco, BorderLayout.CENTER); // Posiziono myGioco al centro
mainPanel.add(myDati, BorderLayout.SOUTH); // Posiziono myDati in basso
add(mainPanel);
}
class GiocoPanel extends JPanel implements MouseListener, MouseMotionListener{
Dimension myGioco = new Dimension(0, 0);
Color myColor = new Color(22, 43, 86); //COLORE PANNELLO MYGIOCO;
private Timer t,t1;
private int tempo1 = 3000;
private ArrayList<Bersaglio> bersagli;
private ArrayList<Bersaglio> ElementiDaRimuovere;
double x,y;
private int creati;
private double velocita = 2;
InfoFile datiPlayer = new InfoFile(Player);
File F = new File(Player.getNome());
public GiocoPanel(){
setPreferredSize(myGioco);
setBackground(myColor);
setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
MaxBersagli = 10;
creati = 0;
String NomePlayer = JOptionPane.showInputDialog("Inserisci il tuo nome");
Player.setNome(NomePlayer);
if(F.exists()){
int Puntivecchi = datiPlayer.Leggi();
JOptionPane.showMessageDialog(null, "Vecchio Punteggio: "+Puntivecchi, "", JOptionPane.INFORMATION_MESSAGE);
}
else{
JOptionPane.showMessageDialog(null, "Benvenuto in Shoot-At-It "+Player.getNome()+"!\nLo scopo del gioco e' colpire piu' bersagli possibili.\nPer superare uno stage devi colpirne almeno 6.\nBuona partita!", "Benvenuto", JOptionPane.INFORMATION_MESSAGE );
}
Genera();
t = new Timer(20, new ActionListener(){
public void actionPerformed(ActionEvent event){
if(bersagli != null){
for(int i=0; i<bersagli.size(); i++){
((Bersaglio)(bersagli.get(i))).move();
if(Bordi(i)){
bersagli.remove(i);
}
repaint();
}
}
if(bersagli.size() == 0 && creati == MaxBersagli){
if(Colpiti < 6){
t.stop();
t1.stop();
int text = 0;
if(F.exists()){
datiPlayer.ScriviSuFile(Player.getPoints());
text = datiPlayer.Leggi();
}
else{
datiPlayer.ScriviSuFile(0);
text=datiPlayer.Leggi();
}
String controllo = ("Non hai colpito abbastanza bersagli!\nStage: "+Stage+
"\nObiettivi: "+Obiettivi+"\nPunti: "+Punti+"\nVuoi rigiocare?");
int risp = JOptionPane.showConfirmDialog(null, controllo, "Game Over", JOptionPane.YES_NO_OPTION );
if(risp == JOptionPane.YES_OPTION){
creati = 0;
Stage = 1;
Obiettivi = 0;
Punti = 0;
Points = 0;
Colpiti = 0;
velocita = 2;
tempo1 = 3000;
String NomePlayer1 = JOptionPane.showInputDialog("Inserisci il tuo nome");
Player = new Giocatore();
Player.setNome(NomePlayer1);
t.start();
t1.start();
Genera();
myDati.refreshDati();
}else{
if(risp == JOptionPane.CLOSED_OPTION||risp == JOptionPane.NO_OPTION){
JOptionPane.showMessageDialog(null,"GAME OVER");
System.exit(0);
}
}
}else{
Stage += 1;
creati = 0;
tempo1 -= 20;
G -= 2.5 ;
Obiettivi = 0;
Colpiti = 0;
velocita += 0.3;
myDati.refreshDati();
Genera();
}
}
repaint();
}
});
t.start();
t1.start();
addMouseListener(this);
addMouseMotionListener(this);
}
public void Genera(){
bersagli = new ArrayList<Bersaglio>();
t1 = new Timer(tempo1, new ActionListener(){ // TEMPO TRA UN BERSAGLIO E L'ALTRO
public void actionPerformed(ActionEvent event){
if(creati<MaxBersagli){
bersagli.add(new Bersaglio(0,0));
((Bersaglio)bersagli.get(bersagli.size()-1)).setSpeed(velocita); // Velocità Bersagli
((Bersaglio)(bersagli.get(bersagli.size()-1))).setCentro(CentroRandom());
creati++;
// System.out.println((Bersaglio)bersagli.get(bersagli.size()-1)).getDirection().getX()+" "+
// ((Bersaglio)bersagli.get(bersagli.size()-1)).getDirection().getY()+" "+
// bersagli.size());
}
}
});
t1.start();
}
public Point2D CentroRandom(){
Point2D punto = new Point2D.Double(150,150);
switch((int)Math.round(Math.random()*7+1)){
case 1: punto = new Point2D.Double(-30,-30);
((Bersaglio)bersagli.get(bersagli.size()-1)).setDirection(1,1);
break;
case 2: punto = new Point2D.Double(0,30+NRandom());
((Bersaglio)bersagli.get(bersagli.size()-1)).setDirection(1,0);
break;
case 3: punto = new Point2D.Double(30+NRandom(),0);
((Bersaglio)bersagli.get(bersagli.size()-1)).setDirection(0,1);
break;
case 4: punto = new Point2D.Double(530,530);
((Bersaglio)bersagli.get(bersagli.size()-1)).setDirection(-1,-1);
break;
case 5: punto = new Point2D.Double(520,0);
((Bersaglio)bersagli.get(bersagli.size()-1)).setDirection(-1,1);
break;
case 6: punto = new Point2D.Double(-15,520);
((Bersaglio)bersagli.get(bersagli.size()-1)).setDirection(1,-1);
break;
case 7: punto = new Point2D.Double(30+NRandom(),485);
((Bersaglio)bersagli.get(bersagli.size()-1)).setDirection(0,-1);
break;
case 8: punto = new Point2D.Double(530,30+NRandom());
((Bersaglio)bersagli.get(bersagli.size()-1)).setDirection(-1,0);
break;
}
return punto;
}
public int NRandom(){
int nrand = (int)(Math.round((Math.random())*300+1));
return nrand;
}
public boolean Bordi(int i){
boolean controllo = false;
if(bersagli.get(i).getCentro().getX() > 530+45)
controllo = true;
if(bersagli.get(i).getCentro().getX() < -45)
controllo = true;
if(bersagli.get(i).getCentro().getY() > 530+45)
controllo = true;
if(bersagli.get(i).getCentro().getY() < -45)
controllo = true;
return controllo;
}
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
if(bersagli==null)
bersagli = new ArrayList<Bersaglio>();
else
disegna(g2);
g2.setColor(new Color(22,43,86));
}
public void disegna(Graphics2D g2){
for(int i=0; i<bersagli.size(); i++){
((Bersaglio)bersagli.get(i)).disegna(g2);
}
}
//METODI MOUSE LISTENER
public void mouseMoved(MouseEvent e){ }
public void mousePressed(MouseEvent e){
x=e.getX();
y=e.getY();
// System.out.println(""+x+""+y);
for(int i=0; i<bersagli.size(); i++){
if (ElementiDaRimuovere == null)
ElementiDaRimuovere = new ArrayList<Bersaglio>();
// faccio un ciclo for che scorre l'array bersagli
if(bersagli.get(i).cerchio5.contains(x, y) ){ // e controllo se il click del mouse è interno o esterno
Punti += 50; // se è interno aggiungo punti
Obiettivi += 1; // aggiungo +1 al numero di bersagli colpiti
Colpiti += 1;
Player.setPoints(Player.getPoints()+50);
ElementiDaRimuovere.add(bersagli.get(i)); // aggiungo il bersaglio colpito all'array ElementiDaRimuovere
myDati.refreshDati();
} else if (bersagli.get(i).cerchio4.contains(x,y)){
Punti += 40;
Player.setPoints(Player.getPoints()+40);
Obiettivi += 1;
Colpiti += 1;
ElementiDaRimuovere.add(bersagli.get(i));
myDati.refreshDati();
} else if (bersagli.get(i).cerchio3.contains(x,y)){
Punti += 30; //Per l'assegnazione dei punti ho preferito usare
Player.setPoints(Player.getPoints()+30);
Obiettivi += 1; //questa formula che mi assegna punti diversi in base
Colpiti += 1;
ElementiDaRimuovere.add(bersagli.get(i)); //alla circonferenza colpita piuttosto che "10+stage"
myDati.refreshDati();
} else if (bersagli.get(i).cerchio2.contains(x,y)){
Punti += 20;
Player.setPoints(Player.getPoints()+20);
Obiettivi +=1 ;
Colpiti += 1;
ElementiDaRimuovere.add(bersagli.get(i));
myDati.refreshDati();
} else if (bersagli.get(i).cerchio1.contains(x,y)){
Punti += 10;
Player.setPoints(Player.getPoints()+10);
Obiettivi += 1;
Colpiti += 1;
ElementiDaRimuovere.add(bersagli.get(i));
myDati.refreshDati();
}
if (ElementiDaRimuovere != null){
for(int j=0; j<ElementiDaRimuovere.size(); j++){ //scorro l'array ElementiDaRimuovere
bersagli.remove(ElementiDaRimuovere.get(j));
}
ElementiDaRimuovere.clear(); // "pulisco" l'array dalle cose da rimuovere
}
}
}
public void mouseReleased(MouseEvent e){ }
public void mouseClicked(MouseEvent e){ }
public void mouseEntered(MouseEvent e){ }
public void mouseDragged(MouseEvent e) { }
public void mouseExited(MouseEvent e){ }
}
class DatiPanel extends JPanel{
private JLabel StageLabel, ObiettiviLabel, PuntiLabel;
public int getStage() { return Stage; }
public int getObiettivi() { return Obiettivi; }
public int getPunti() { return Punti; }
public void setStage(int value) { Stage = value; }
public void setObiettivi(int value) { Obiettivi = value; }
public void setPunti(int value) { Punti = value; }
public void refreshDati(){
StageLabel.setText("Stage:\t"+Stage);
ObiettiviLabel.setText("Obiettivi:\t"+Obiettivi+" /10");
PuntiLabel.setText("Punti:\t"+Punti);
}
public DatiPanel(int Stage, int Obiettivi, int Punti){
StageLabel = new JLabel("Stage:\t"+Stage);
ObiettiviLabel = new JLabel("Obiettivi:\t"+Obiettivi+" /10");
PuntiLabel = new JLabel("Punti:\t"+Punti);
add(StageLabel);
add(ObiettiviLabel);
add(PuntiLabel);
}
}
}
class Bersaglio{
Ellipse2D.Double cerchio1, cerchio2, cerchio3, cerchio4, cerchio5;
double raggio;
double G;
Point2D centro;
Color cBersaglioRosso, cBersaglioBianco;
Vector2 direzione;
double speed;
public Bersaglio(double x, double y){
centro = new Point2D.Double(x, y);
cBersaglioRosso = new Color(210, 0 ,5); //Colore circonferenza rossa
cBersaglioBianco = new Color(255,255,255); //Colore circonferenza bianca
direzione = new Vector2(0,0);
speed = 0;
G = 40;
raggio = G;
cerchio1 = new Ellipse2D.Double(centro.getX()-raggio, centro.getY()-raggio, raggio*2, raggio*2);
raggio = (4*G)/5;
cerchio2 = new Ellipse2D.Double(centro.getX()-raggio, centro.getY()-raggio, raggio*2, raggio*2);
raggio = (3*G)/5;
cerchio3 = new Ellipse2D.Double(centro.getX()-raggio, centro.getY()-raggio, raggio*2, raggio*2);
raggio = (2*G)/5;
cerchio4 = new Ellipse2D.Double(centro.getX()-raggio, centro.getY()-raggio, raggio*2, raggio*2);
raggio = G/5;
cerchio5 = new Ellipse2D.Double(centro.getX()-raggio, centro.getY()-raggio, raggio*2, raggio*2);
}
public void disegna(Graphics2D figura){
figura.setColor(cBersaglioRosso); // 1° circonferenza
figura.fill(cerchio1);
figura.setColor(cBersaglioBianco); // 2° circonferenza
figura.fill(cerchio2);
figura.setColor(cBersaglioRosso); // 3° circonferenza
figura.fill(cerchio3);
figura.setColor(cBersaglioBianco); // 4° circonferenza
figura.fill(cerchio4);
figura.setColor(cBersaglioRosso); // 5° circonferenza
figura.fill(cerchio5);
}
public void setSpeed(double s) {speed = s; }
public double getSpeed() { return speed; }
public void setCentro(Point2D centroNew) { centro = centroNew; }
public Point2D getCentro() { return centro; }
public void setDirection(Vector2 v) {direzione = v; }
public void setDirection(double dx, double dy) { direzione = new Vector2(dx,dy); direzione.normalize(); }
public Vector2 getDirection() { return direzione; }
public void move(){
double raggio = G;
centro = new Point2D.Double(centro.getX()+(direzione.getX()*speed), centro.getY()+(direzione.getY()*speed) );
cerchio1.setFrame( centro.getX()-raggio, centro.getY()-raggio, raggio*2, raggio*2);
raggio = (4*G)/5;
cerchio2.setFrame(centro.getX()-raggio, centro.getY()-raggio, raggio*2, raggio*2);
raggio = (3*G)/5;
cerchio3.setFrame(centro.getX()-raggio, centro.getY()-raggio, raggio*2, raggio*2);
raggio = (2*G)/5;
cerchio4.setFrame(centro.getX()-raggio, centro.getY()-raggio, raggio*2, raggio*2);
raggio = G/5;
cerchio5.setFrame(centro.getX()-raggio, centro.getY()-raggio, raggio*2, raggio*2);
}
public void directTo(Point2D p){
direzione = new Vector2( p.getX() - centro.getX(), p.getY() - centro.getY() );
direzione.normalize();
}
}
class Vector2{
private double x,y;
public Vector2(double a, double b){
x = a;
y = b;
}
public double getX() {return x; }
public void setX(double a) { x = a; }
public double getY() {return y; }
public void setY(double b) { y = b; }
public double length(){
return (Math.sqrt(Math.pow(x,2)+Math.pow(y,2)));
}
public void normalize(){
double l = length();
x = x/l;
y = y/l;
}
}
class Giocatore{
private int Stage;
private int Obiettivi;
private int Points;
private String Nome;
Giocatore(){
this("",1,0,0);
}
Giocatore(String newNome, int newStage, int newObiettivi, int newPoints){
setNome(newNome);
setStage(newStage);
setObiettivi(newObiettivi);
setPoints(newPoints);
}
public void setNome(String newNome){ Nome = newNome; }
public void setStage(int newStage){ Stage = newStage; }
public void setObiettivi(int newObiettivi){ Obiettivi = newObiettivi; }
public void setPoints(int newPoints) { Points = newPoints; }
public String getNome() { return Nome; }
public int getStage() { return Stage; }
public int getObiettivi() { return Obiettivi; }
public int getPoints() { return Points; }
}