2017-02-24 13:19:58 +01:00
package nl.minkema.leendert ;
2017-02-25 16:02:32 +01:00
import javafx.event.EventHandler ;
2017-02-24 13:19:58 +01:00
import javafx.scene.Group ;
import javafx.scene.Node ;
2017-02-25 16:02:32 +01:00
import javafx.scene.Scene ;
2017-03-23 22:10:31 +01:00
import javafx.scene.control.Alert ;
import javafx.scene.control.ButtonType ;
2017-03-31 14:09:13 +02:00
import javafx.scene.control.Tooltip ;
2017-02-24 13:19:58 +01:00
import javafx.scene.image.Image ;
import javafx.scene.image.ImageView ;
2017-02-25 16:02:32 +01:00
import javafx.scene.input.MouseEvent ;
import javafx.scene.layout.StackPane ;
2017-02-24 13:19:58 +01:00
import javafx.scene.media.Media ;
import javafx.scene.media.MediaPlayer ;
2017-02-25 16:02:32 +01:00
import javafx.scene.paint.Color ;
import javafx.scene.shape.Rectangle ;
import javafx.scene.text.Text ;
import javafx.scene.text.TextBoundsType ;
2017-02-24 13:19:58 +01:00
2017-02-25 16:02:32 +01:00
import java.net.MalformedURLException ;
2017-02-24 13:19:58 +01:00
import java.net.URISyntaxException ;
import java.util.ArrayList ;
2017-02-25 16:02:32 +01:00
import java.util.Random ;
2017-02-24 13:19:58 +01:00
/ * *
2017-02-25 16:02:32 +01:00
* @author J0QUE
* @version 1.0
2017-02-24 13:19:58 +01:00
* /
public class Menu extends Group {
2017-03-19 22:53:15 +01:00
2017-03-23 22:10:31 +01:00
public static Image [ ] images ;
2017-03-31 14:09:13 +02:00
public static String [ ] names ;
2017-03-04 19:59:11 +01:00
private static Random random = new Random ( System . currentTimeMillis ( ) ) ;
2017-03-23 22:10:31 +01:00
private int hoeveel = - 1 ;
private ArrayList < Integer > chosen = new ArrayList < > ( ) ;
2017-02-25 16:02:32 +01:00
2017-04-14 16:14:20 +02:00
/ * *
* De constructor voor het menu
*
* @throws URISyntaxException als de achtergrondmuziek niet gevonden kan worden .
* @throws MalformedURLException gebeurt hopelijk niet . . .
* /
2017-02-25 16:02:32 +01:00
public Menu ( ) throws URISyntaxException , MalformedURLException {
2017-02-24 13:19:58 +01:00
ArrayList < Node > nodes = new ArrayList < > ( ) ;
2017-04-14 16:14:20 +02:00
//achtergrondafbeelding
Image bg = new Image ( "/images/background.png" ) ;
2017-02-24 13:19:58 +01:00
ImageView view = new ImageView ( bg ) ;
2017-04-14 16:14:20 +02:00
//zet de x en y naar de linker bovenhoek
2017-02-24 13:19:58 +01:00
view . setX ( 0 ) ;
view . setY ( 0 ) ;
2017-04-14 16:14:20 +02:00
//dit is om te zorgen dat de afbeelding past
2017-03-23 18:16:53 +01:00
view . setFitHeight ( 850 ) ;
view . setPreserveRatio ( false ) ;
view . setFitWidth ( 1250 ) ;
2017-04-14 16:14:20 +02:00
nodes . add ( view ) ;
2017-03-19 22:53:15 +01:00
2017-04-14 16:14:20 +02:00
//De achtergrondmuziek
2017-02-25 16:02:32 +01:00
String loc = this . getClass ( ) . getResource ( "/music/menu.mp4" ) . toString ( ) ;
2017-02-24 13:19:58 +01:00
Media music = new Media ( loc ) ;
MediaPlayer menuplayer = new MediaPlayer ( music ) ;
menuplayer . setCycleCount ( Integer . MAX_VALUE ) ;
2017-02-25 16:02:32 +01:00
menuplayer . setVolume ( 0.6f ) ;
2017-04-14 16:14:20 +02:00
//Dit deel is om te garanderen dat de muziek start, hoewel het soms toch niet werkt, iets met codecs enzo
2017-02-24 13:19:58 +01:00
menuplayer . setAutoPlay ( true ) ;
2017-02-25 16:02:32 +01:00
menuplayer . play ( ) ;
menuplayer . play ( ) ;
2017-03-19 22:53:15 +01:00
2017-04-14 16:14:20 +02:00
//De breedte van de afbeelding
2017-03-23 18:16:53 +01:00
int imagewidth = 100 ;
2017-04-14 16:14:20 +02:00
//Een array met speler afbeeldingen
2017-03-19 22:53:15 +01:00
images = new Image [ ] {
new Image ( "/svg/p1.svg" , imagewidth , 0 , true , false ) ,
new Image ( "/svg/p2.svg" , imagewidth , 0 , true , false ) ,
new Image ( "/svg/p3.svg" , imagewidth , 0 , true , false ) ,
new Image ( "/svg/p4.svg" , imagewidth , 0 , true , false ) ,
new Image ( "/svg/p5.svg" , imagewidth , 0 , true , false ) } ;
2017-03-31 14:09:13 +02:00
2017-04-14 16:14:20 +02:00
//De namen van de karakters
2017-03-31 14:09:13 +02:00
names = new String [ ] { "Paulus" , "Pinkeltje" , "Petunia" , "Kwebbel" , "Stuart" } ;
2017-03-19 22:53:15 +01:00
int x = 0 , y = 0 ;
2017-04-14 16:14:20 +02:00
//Voor elke afbeelding wordt dit uitgevoerd
2017-03-23 18:16:53 +01:00
for ( int i1 = 0 ; i1 < images . length ; i1 + + ) {
2017-04-14 16:14:20 +02:00
//We maken van de afbeelding een ImageView, zodat het zichtbaar gemaakt kan worden
2017-03-23 18:16:53 +01:00
Image i = images [ i1 ] ;
2017-03-19 22:53:15 +01:00
ImageView iv = new ImageView ( i ) ;
2017-03-23 18:16:53 +01:00
iv . setX ( 750 + x ) ;
iv . setY ( 400 + y ) ;
2017-04-14 16:14:20 +02:00
//En geven het een tooltip met de naam van de Kabouter
2017-03-31 14:09:13 +02:00
Tooltip . install ( iv , new Tooltip ( names [ i1 ] ) ) ;
2017-03-19 22:53:15 +01:00
x + = i . getRequestedWidth ( ) ;
2017-04-14 16:14:20 +02:00
//Als we te ver gaan op de x as, gaan we door op een volgende regel
2017-03-19 22:53:15 +01:00
if ( x > 200 ) {
y + = 150 ;
2017-03-23 18:16:53 +01:00
x = - 70 ;
2017-03-19 22:53:15 +01:00
}
2017-03-23 22:10:31 +01:00
final int ch = i1 ;
2017-04-14 16:14:20 +02:00
//Wat er gebeurt als je op een kabouter klikt
2017-03-23 22:10:31 +01:00
iv . setOnMouseClicked ( e - > {
2017-04-14 16:14:20 +02:00
//Eerst controleren of het karakter al is gekozen.
2017-03-23 22:10:31 +01:00
if ( chosen . contains ( ch ) ) {
new Alert ( Alert . AlertType . ERROR , "Sorry, dit karakter is al door iemand anders gekozen..." ) . show ( ) ;
return ;
}
2017-04-14 16:14:20 +02:00
//Als er nog geen hoeveelheid is gekozen kan dat ook best een probleempje opleveren.
2017-03-23 22:10:31 +01:00
if ( hoeveel < 0 ) {
Alert alert = new Alert ( Alert . AlertType . ERROR , "Je moet eerst kiezen hoe veel spelers je wilt!\nDruk links op de juiste hoeveelheid kaboutertjes!" , ButtonType . OK ) ;
alert . show ( ) ;
} else {
2017-04-14 16:14:20 +02:00
//Maar verder kunnen we gewoon de karakters vinden
2017-03-23 22:10:31 +01:00
Image image = new Image ( i . impl_getUrl ( ) , 0 , 50 , true , false ) ;
2017-04-14 16:14:20 +02:00
//Toevoegen aan de lijst van spelers
2017-03-23 22:10:31 +01:00
Game . players . add ( new Player ( image , ch ) ) ;
2017-04-14 16:14:20 +02:00
//De hoeveelheid benodigde spelers met één verlagen
2017-03-23 22:10:31 +01:00
hoeveel - - ;
2017-04-14 16:14:20 +02:00
//En controleren of iedereen er een gekozen heeft
2017-03-23 22:10:31 +01:00
if ( hoeveel = = 0 ) {
2017-04-14 16:14:20 +02:00
//Zo ja: we stoppen het muziekje en starten het spel!
2017-04-11 12:00:54 +02:00
menuplayer . stop ( ) ;
2017-03-23 22:10:31 +01:00
Main . scene . setRoot ( new Game ( ) ) ;
} else {
2017-04-14 16:14:20 +02:00
//Maar anders laten we mensen nog kiezen.
2017-03-23 22:10:31 +01:00
String een = "Er moet nog 1 persoon kiezen!" ;
String meer = String . format ( "Er moeten nog %d mensen kiezen!" , hoeveel ) ;
Alert alert = new Alert ( Alert . AlertType . NONE , hoeveel > 1 ? meer : een , ButtonType . OK ) ;
alert . show ( ) ;
2017-03-31 14:09:13 +02:00
chosen . add ( ch ) ;
2017-03-23 22:10:31 +01:00
}
}
2017-03-31 14:09:13 +02:00
2017-03-23 22:10:31 +01:00
} ) ;
2017-04-14 16:14:20 +02:00
//Maar we moeten wel het karakter zichtbaar maken.
2017-03-19 22:53:15 +01:00
nodes . add ( iv ) ;
}
2017-03-04 19:59:11 +01:00
2017-03-23 18:16:53 +01:00
int x2 = 30 , y2 = 50 ;
2017-04-14 16:14:20 +02:00
//Dit zijn de knoppen voor de hoeveelheid spelers
2017-03-23 18:16:53 +01:00
for ( int i = 0 ; i < 4 ; i + + ) {
2017-03-23 22:10:31 +01:00
if ( i = = 0 ) continue ;
2017-03-23 18:16:53 +01:00
int number = 1 + i ;
2017-04-14 16:14:20 +02:00
int locy = y2 + 155 * i + 10 ;
2017-03-23 18:16:53 +01:00
for ( int e = 0 ; e < number ; e + + ) {
ImageView view1 = new ImageView ( new Image ( "/svg/p1.svg" , 75 , 0 , true , false ) ) ;
view1 . setX ( x2 + 85 * e + 10 * e ) ;
view1 . setY ( locy ) ;
nodes . add ( view1 ) ;
}
2017-04-14 16:14:20 +02:00
Rectangle clickable = new Rectangle ( x2 - 10 , locy + 125 , 95 + i * 95 , 152 ) ;
2017-03-23 22:10:31 +01:00
clickable . setFill ( Color . TRANSPARENT ) ;
clickable . setStroke ( Color . BLACK ) ;
2017-03-31 14:09:13 +02:00
clickable . setArcHeight ( 50 ) ;
clickable . setArcWidth ( 50 ) ;
2017-03-23 22:10:31 +01:00
final int s = i + 1 ;
clickable . setOnMouseClicked ( e - > {
hoeveel = s ;
new Alert ( Alert . AlertType . INFORMATION , "Alle " + hoeveel + " spelers kunnen nu een karakter kiezen. \nAls iemand de verkeerde kiest kan je opnieuw \nop de knop drukken om opnieuw te beginnen." ) . show ( ) ;
} ) ;
2017-03-31 14:09:13 +02:00
Tooltip tip = new Tooltip ( "Hier kan je op klikken" ) ;
Tooltip . install ( clickable , tip ) ;
2017-03-23 22:10:31 +01:00
nodes . add ( clickable ) ;
2017-03-23 18:16:53 +01:00
}
2017-02-24 13:19:58 +01:00
getChildren ( ) . addAll ( nodes ) ;
2017-02-25 16:02:32 +01:00
}
2017-04-14 16:14:20 +02:00
/ * *
* Maakt een knop op een plek , met een willekeurige kleur .
* @param string de tekst van de knop
* @param x de x co ö rdinaat van de knop
* @param y de y co ö rdinaat van de knop
* @param onClick een { @link EventHandler } die wordt uitgevoerd als de knop is ingedrukt
* @return een stackpane met daarin een knop
* /
2017-02-25 16:02:32 +01:00
public static StackPane createButton ( String string , double x , double y , EventHandler < MouseEvent > onClick ) {
Text text = createText ( string ) ;
Rectangle rectangle = rectangulate ( text ) ;
StackPane pane = new StackPane ( rectangle , text ) ;
pane . setOnMouseClicked ( onClick ) ;
pane . setLayoutX ( x ) ;
pane . setLayoutY ( y ) ;
return pane ;
}
2017-04-14 16:14:20 +02:00
/ * *
* Maakt een text object
* @param string de tekst van het object
* @return een object met de tekst
* /
2017-02-25 16:02:32 +01:00
private static Text createText ( String string ) {
Text text = new Text ( string ) ;
text . setBoundsType ( TextBoundsType . VISUAL ) ;
text . setStyle (
"-fx-font-family: \"Arial\";" +
//"-fx-font-style: normal;" +
"-fx-font-size: 24px;"
) ;
return text ;
}
2017-04-14 16:14:20 +02:00
/ * *
* Maakt een rechthoek precies passend om de tekst heen .
* @param text een { @link Text } object
* @return een rechthoek met daar in de tekst
* /
2017-02-25 16:02:32 +01:00
private static Rectangle rectangulate ( Text text ) {
Rectangle rectangle = new Rectangle ( ) ;
rectangle . setFill ( getRandomColor ( ) ) ;
final double PADDING = 25 ;
rectangle . setWidth ( getWidth ( text ) + PADDING ) ;
rectangle . setHeight ( getHeight ( text ) + PADDING ) ;
rectangle . setArcHeight ( 20 ) ;
rectangle . setArcWidth ( 20 ) ;
return rectangle ;
}
2017-04-14 16:14:20 +02:00
/ * *
* methode die de breedte van een { @link Text } object opvraagt
* @param text het object
* @return de breedte van het object
* /
2017-02-25 16:02:32 +01:00
private static double getWidth ( Text text ) {
new Scene ( new Group ( text ) ) ;
text . applyCss ( ) ;
return text . getLayoutBounds ( ) . getWidth ( ) ;
}
2017-04-14 16:14:20 +02:00
/ * *
* methode die de hoogte van een { @link Text } object opvraagt
* @param text het object
* @return de hoogte van het object
* /
2017-02-25 16:02:32 +01:00
private static double getHeight ( Text text ) {
new Scene ( new Group ( text ) ) ;
text . applyCss ( ) ;
return text . getLayoutBounds ( ) . getHeight ( ) ;
}
2017-04-14 16:14:20 +02:00
/ * *
* maakt een willekeurige kleur
* @return een willekeurige kleur .
* /
2017-02-25 16:02:32 +01:00
public static Color getRandomColor ( ) {
2017-03-04 19:59:11 +01:00
2017-02-25 16:02:32 +01:00
return Color . hsb ( random . nextInt ( 360 ) , 0.8 , 0.8 ) ;
2017-02-24 13:19:58 +01:00
}
}