Reset author name to chosen name ✨
This commit is contained in:
@@ -0,0 +1 @@
|
||||
,chloe,chloe-ryzen-archlinux,05.09.2023 14:05,file:///home/chloe/.config/libreoffice/4;
|
||||
@@ -0,0 +1,111 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<title>BallControl.java</title>
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||||
<style type="text/css">
|
||||
<!--
|
||||
body {color: #a9b7c6; background-color: #2b2b2b; font-family: monospace; font-weight: bold}
|
||||
pre {color: #a9b7c6; background-color: #2b2b2b; font-family: monospace; font-weight: bold}
|
||||
table {color: #888888; background-color: #313335; font-family: monospace; font-weight: bold}
|
||||
.literal {color: #cc7832}
|
||||
.number {color: #6897bb}
|
||||
.string {color: #6a8759}
|
||||
.comment {color: #808080}
|
||||
.whitespace {color: #505050}
|
||||
-->
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<table width="100%"><tr><td align="center">/home/chloe/ASDV-Java/Semester 3/Assignments/MP2-chapter4_ChloeFontenot/src/MP2_chapter4_ChloeFontenot/BallControl.java</td></tr></table>
|
||||
<pre>
|
||||
<span class="comment">/*</span>
|
||||
<span class="comment"> * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license</span>
|
||||
<span class="comment"> * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template</span>
|
||||
<span class="comment"> */</span>
|
||||
<span class="literal">package</span> MP2_chapter4_ChloeFontenot;
|
||||
|
||||
<span class="literal">import</span> javafx.application.Application;
|
||||
<span class="literal">import</span> javafx.event.EventHandler;
|
||||
<span class="literal">import</span> javafx.scene.Scene;
|
||||
<span class="literal">import</span> javafx.scene.input.KeyCode;
|
||||
<span class="literal">import</span> javafx.scene.input.MouseEvent;
|
||||
<span class="literal">import</span> javafx.stage.Stage;
|
||||
|
||||
<span class="comment">/**</span>
|
||||
<span class="comment"> *</span>
|
||||
<span class="comment"> * </span><span class="comment">@author</span> <span class="comment">chloe</span>
|
||||
<span class="comment">*/</span>
|
||||
<span class="literal">public</span> <span class="literal">class</span> BallControl <span class="literal">extends</span> Application {
|
||||
|
||||
<span class="literal">private</span> <span class="literal">boolean</span> mouseFocus = <span class="literal">false</span>;
|
||||
<span class="literal">private</span> <span class="literal">int</span> racketPosition = <span class="number">0</span>;
|
||||
|
||||
@Override
|
||||
<span class="literal">public</span> <span class="literal">void</span> start(Stage primaryStage) <span class="literal">throws</span> Exception
|
||||
{
|
||||
|
||||
BouncingBall bouncingBall = <span class="literal">new</span> BouncingBall();
|
||||
<span class="comment">// Create a scene and place it in the stage</span>
|
||||
Scene scene = <span class="literal">new</span> Scene(bouncingBall, <span class="number">800</span>, <span class="number">600</span>);
|
||||
primaryStage.setTitle(<span class="string">"</span><span class="string">Bouncing Ball Control</span><span class="string">"</span>);
|
||||
primaryStage.setScene(scene);
|
||||
primaryStage.show();
|
||||
bouncingBall.requestFocus();
|
||||
bouncingBall.showInfoLabel();
|
||||
|
||||
bouncingBall.setOnMouseEntered(e
|
||||
-> {
|
||||
mouseFocus = <span class="literal">true</span>;
|
||||
bouncingBall.hideInfoLabel();
|
||||
bouncingBall.play();
|
||||
});
|
||||
|
||||
bouncingBall.setOnMouseExited(e -> {
|
||||
mouseFocus = <span class="literal">false</span>;
|
||||
});
|
||||
bouncingBall.setOnMouseMoved(<span class="literal">new</span> EventHandler<MouseEvent>() {
|
||||
@Override
|
||||
<span class="literal">public</span> <span class="literal">void</span> handle(MouseEvent event)
|
||||
{
|
||||
<span class="literal">double</span> mouseX = event.getSceneX() - (bouncingBall.RACKET_LENGTH / <span class="number">2</span>); <span class="comment">// set relative to center of racket</span>
|
||||
bouncingBall.moveRacket(mouseX);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
<span class="comment">// Increase and decrease animation</span>
|
||||
bouncingBall.setOnKeyPressed(e
|
||||
-> {
|
||||
<span class="literal">if</span> (e.getCode() == KeyCode.LEFT && mouseFocus == <span class="literal">false</span>) {
|
||||
bouncingBall.hideInfoLabel();
|
||||
<span class="literal">if</span> (racketPosition > <span class="number">0</span>) {
|
||||
racketPosition = racketPosition - <span class="number">30</span>;
|
||||
}
|
||||
bouncingBall.moveRacket(racketPosition);
|
||||
}
|
||||
<span class="literal">if</span> (e.getCode() == KeyCode.RIGHT && mouseFocus == <span class="literal">false</span>) {
|
||||
bouncingBall.hideInfoLabel();
|
||||
<span class="literal">if</span> (racketPosition < bouncingBall.getWidth()) {
|
||||
racketPosition = racketPosition + <span class="number">30</span>;
|
||||
}
|
||||
bouncingBall.moveRacket(racketPosition);
|
||||
}
|
||||
<span class="literal">if</span> (e.getCode() == KeyCode.UP) {
|
||||
bouncingBall.increaseSpeed();
|
||||
} <span class="literal">else</span> <span class="literal">if</span> (e.getCode() == KeyCode.DOWN) {
|
||||
bouncingBall.decreaseSpeed();
|
||||
}
|
||||
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
<span class="literal">public</span> <span class="literal">static</span> <span class="literal">void</span> main(String[] args)
|
||||
{
|
||||
launch(args);
|
||||
}
|
||||
}
|
||||
|
||||
</pre></body>
|
||||
</html>
|
||||
@@ -0,0 +1,278 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<title>BouncingBall.java</title>
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||||
<style type="text/css">
|
||||
<!--
|
||||
body {color: #a9b7c6; background-color: #2b2b2b; font-family: monospace; font-weight: bold}
|
||||
pre {color: #a9b7c6; background-color: #2b2b2b; font-family: monospace; font-weight: bold}
|
||||
table {color: #888888; background-color: #313335; font-family: monospace; font-weight: bold}
|
||||
.literal {color: #cc7832}
|
||||
.ST3 {font-family: monospace; font-weight: bold; font-style: italic}
|
||||
.ST0 {color: #287bde}
|
||||
.number {color: #6897bb}
|
||||
.string {color: #6a8759}
|
||||
.ST1 {color: #9876aa}
|
||||
.ST4 {color: #ffc66d}
|
||||
.comment {color: #808080}
|
||||
.whitespace {color: #505050}
|
||||
.ST2 {color: #9876aa; font-family: monospace; font-weight: bold; font-style: italic}
|
||||
-->
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<table width="100%"><tr><td align="center">/home/chloe/ASDV-Java/Semester 3/Assignments/MP2-chapter4_ChloeFontenot/src/MP2_chapter4_ChloeFontenot/BouncingBall.java</td></tr></table>
|
||||
<pre>
|
||||
<span class="comment">/*</span>
|
||||
<span class="comment"> * Click </span><span class="ST0">nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt</span><span class="comment"> to change this license</span>
|
||||
<span class="comment"> * Click </span><span class="ST0">nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java</span><span class="comment"> to edit this template</span>
|
||||
<span class="comment"> */</span>
|
||||
<span class="literal">package</span> MP2_chapter4_ChloeFontenot;
|
||||
|
||||
<span class="literal">import</span> java.io.File;
|
||||
<span class="literal">import</span> java.util.ArrayList;
|
||||
<span class="literal">import</span> java.util.List;
|
||||
<span class="literal">import</span> javafx.animation.KeyFrame;
|
||||
<span class="literal">import</span> javafx.animation.Timeline;
|
||||
<span class="literal">import</span> javafx.beans.property.DoubleProperty;
|
||||
<span class="literal">import</span> javafx.event.ActionEvent;
|
||||
<span class="literal">import</span> javafx.event.EventHandler;
|
||||
<span class="literal">import</span> javafx.scene.control.Label;
|
||||
<span class="literal">import</span> javafx.scene.layout.GridPane;
|
||||
<span class="literal">import</span> javafx.scene.layout.Pane;
|
||||
<span class="literal">import</span> javafx.scene.media.Media;
|
||||
<span class="literal">import</span> javafx.scene.media.MediaPlayer;
|
||||
<span class="literal">import</span> javafx.scene.paint.Color;
|
||||
<span class="literal">import</span> javafx.scene.shape.Circle;
|
||||
<span class="literal">import</span> javafx.scene.shape.Rectangle;
|
||||
<span class="literal">import</span> javafx.util.Duration;
|
||||
|
||||
<span class="comment">/**</span>
|
||||
<span class="comment"> *</span>
|
||||
<span class="comment"> * </span><span class="comment">@author</span> <span class="comment">chloe</span>
|
||||
<span class="comment">*/</span>
|
||||
<span class="literal">public</span> <span class="literal">class</span> BouncingBall <span class="literal">extends</span> Pane {
|
||||
|
||||
<span class="literal">private</span> List<MediaPlayer> <span class="ST1">mediaPlayers</span> = <span class="literal">new</span> ArrayList<>();
|
||||
GridPane <span class="ST1">textPane</span> = <span class="literal">new</span> GridPane();
|
||||
<span class="literal">private</span> String <span class="ST1">currentlyPlaying</span>;
|
||||
<span class="literal">private</span> <span class="literal">final</span> <span class="literal">int</span> <span class="ST1">COLLISION_COOLDOWN</span> = <span class="number">20</span>;
|
||||
<span class="literal">private</span> <span class="literal">long</span> <span class="ST1">timeSinceLastCollisionEvent</span> = <span class="number">0</span>;
|
||||
<span class="literal">final</span> <span class="literal">double</span> <span class="ST1">RACKET_LENGTH</span> = <span class="number">100</span>;
|
||||
<span class="literal">final</span> <span class="literal">double</span> <span class="ST1">radius</span> = <span class="number">20</span>;
|
||||
<span class="literal">private</span> <span class="literal">double</span> <span class="ST1">x</span> = <span class="ST1">radius</span>, <span class="ST1">y</span> = <span class="ST1">radius</span>;
|
||||
<span class="literal">private</span> <span class="literal">double</span> <span class="ST1">dx</span> = <span class="number">1</span>, <span class="ST1">dy</span> = <span class="number">1</span>;
|
||||
<span class="literal">private</span> Circle <span class="ST1">circle</span> = <span class="literal">new</span> Circle(<span class="ST1">x</span>, <span class="ST1">y</span>, <span class="ST1">r</span><span class="ST1">adius</span>);
|
||||
<span class="literal">private</span> Rectangle <span class="ST1">racket</span> = <span class="literal">new</span> Rectangle(<span class="ST1">R</span><span class="ST1">ACKET_LENGTH</span>, <span class="number">2</span><span class="number">0</span>);
|
||||
<span class="literal">private</span> Label <span class="ST1">infoLabel</span> = <span class="literal">new</span> Label(<span class="string">"</span><span class="string">Your mouse cursor must be inside the bounds of the window to play!</span><span class="string">"</span>);
|
||||
<span class="literal">private</span> Label <span class="ST1">racketTime</span> = <span class="literal">new</span> Label();
|
||||
<span class="literal">private</span> Label <span class="ST1">ballCords</span> = <span class="literal">new</span> Label();
|
||||
<span class="literal">private</span> Label <span class="ST1">playerScoreLabel</span> = <span class="literal">new</span> Label(<span class="string">"</span><span class="string">Player Score: 0</span><span class="string">"</span>);
|
||||
<span class="literal">private</span> Label <span class="ST1">computerScoreLabel</span> = <span class="literal">new</span> Label(<span class="string">"</span><span class="string">Computer Score: 0</span><span class="string">"</span>);
|
||||
<span class="literal">private</span> Label <span class="ST1">nowPlaying</span> = <span class="literal">new</span> Label();
|
||||
|
||||
<span class="literal">private</span> Timeline <span class="ST1">animation</span>;
|
||||
|
||||
<span class="literal">private</span> <span class="literal">int</span> <span class="ST1">computerScore</span>, <span class="ST1">playerScore</span> = <span class="number">0</span>;
|
||||
|
||||
<span class="literal">public</span> BouncingBall() {
|
||||
<span class="ST1">circle</span>.setFill(Color.<span class="ST2">RED</span>); <span class="comment">// Set ball color</span>
|
||||
<span class="ST1">racket</span>.setFill(Color.<span class="ST2">BLUE</span>);
|
||||
<span class="ST1">textPane</span>.add(<span class="ST1">r</span><span class="ST1">acketTime</span>, <span class="number">0</span>, <span class="number">0</span>);
|
||||
<span class="ST1">textPane</span>.add(<span class="ST1">b</span><span class="ST1">allCords</span>, <span class="number">0</span>, <span class="number">1</span>);
|
||||
<span class="ST1">textPane</span>.add(<span class="ST1">p</span><span class="ST1">layerScoreLabel</span>, <span class="number">0</span>, <span class="number">2</span>);
|
||||
<span class="ST1">textPane</span>.add(<span class="ST1">c</span><span class="ST1">omputerScoreLabel</span>, <span class="number">0</span>, <span class="number">3</span>);
|
||||
<span class="ST1">textPane</span>.add(<span class="ST1">n</span><span class="ST1">owPlaying</span>, <span class="number">0</span>, <span class="number">4</span>);
|
||||
getChildren().addAll(<span class="ST1">c</span><span class="ST1">ircle</span>, <span class="ST1">r</span><span class="ST1">acket</span>, <span class="ST1">t</span><span class="ST1">extPane</span>); <span class="comment">// Place a ball into this pane</span>
|
||||
<span class="ST1">racket</span>.relocate(<span class="number">0</span>, <span class="number">5</span><span class="number">80</span>);
|
||||
playSound(<span class="string">"</span><span class="string">bgm</span><span class="string">"</span>);
|
||||
<span class="comment">// Create an animation for moving the ball</span>
|
||||
<span class="ST1">animation</span> = <span class="literal">new</span> Timeline(<span class="literal">new</span> KeyFrame(Duration.<span class="ST3">millis</span>(<span class="number">1</span>), <span class="literal">new</span> EventHandler<ActionEvent>() {
|
||||
@Override
|
||||
<span class="literal">public</span> <span class="literal">void</span> <span class="ST4">handle</span>(ActionEvent t) {
|
||||
|
||||
<span class="ST1">timeSinceLastCollisionEvent</span>++;
|
||||
<span class="ST1">racketTime</span>.setText(<span class="string">"</span><span class="string">Frames since last collision: </span><span class="string">"</span> + <span class="ST1">timeSinceLastCollisionEvent</span>);
|
||||
moveBall();
|
||||
<span class="comment">// Process collisions</span>
|
||||
<span class="literal">if</span> (<span class="ST1">y</span> >= (getHeight() - <span class="number">20</span>) && (<span class="ST1">timeSinceLastCollisionEvent</span> > <span class="ST1">COLLISION_COOLDOWN</span>)) {
|
||||
<span class="ST1">timeSinceLastCollisionEvent</span> = <span class="number">0</span>;
|
||||
playSound(<span class="string">"</span><span class="string">collision</span><span class="string">"</span>);
|
||||
incrementComputerScore();
|
||||
}
|
||||
<span class="literal">if</span> ((<span class="ST1">x</span> <= <span class="number">20</span> && (<span class="ST1">timeSinceLastCollisionEvent</span> > <span class="ST1">COLLISION_COOLDOWN</span>)) || ((<span class="ST1">x</span> >= getWidth() - <span class="number">20</span>) && (<span class="ST1">timeSinceLastCollisionEvent</span> > <span class="ST1">COLLISION_COOLDOWN</span>))) {
|
||||
<span class="ST1">timeSinceLastCollisionEvent</span> = <span class="number">0</span>;
|
||||
playSound(<span class="string">"</span><span class="string">collision</span><span class="string">"</span>);
|
||||
}
|
||||
<span class="literal">if</span> (<span class="ST1">y</span> <= <span class="number">20</span> && (<span class="ST1">timeSinceLastCollisionEvent</span> > <span class="ST1">COLLISION_COOLDOWN</span>)) {
|
||||
<span class="ST1">timeSinceLastCollisionEvent</span> = <span class="number">0</span>;
|
||||
playSound(<span class="string">"</span><span class="string">collision</span><span class="string">"</span>);
|
||||
}
|
||||
}
|
||||
})
|
||||
);
|
||||
<span class="ST1">animation</span>.setRate(<span class="ST1">animation</span>.getRate() * <span class="number">.5</span>);
|
||||
<span class="ST1">animation</span>.setCycleCount(Timeline.<span class="ST2">INDEFINITE</span>);
|
||||
|
||||
}
|
||||
|
||||
<span class="literal">private</span> <span class="literal">boolean</span> <span class="ST4">processRacketCollision</span>() {
|
||||
<span class="literal">boolean</span> racketCollision = <span class="ST1">racket</span>.getBoundsInParent().intersects(<span class="ST1">c</span><span class="ST1">ircle</span>.getBoundsInParent());
|
||||
|
||||
<span class="literal">if</span> (racketCollision && (<span class="ST1">timeSinceLastCollisionEvent</span> > <span class="ST1">COLLISION_COOLDOWN</span>)) { <span class="comment">// This is second condition is a cooldown. It prevents odd behavior happening with the ball and the racket if the racket hits the ball at certain angles.</span>
|
||||
System.<span class="ST2">out</span>.println(<span class="string">"</span><span class="string">Racket collision detected!</span><span class="string">"</span>);
|
||||
<span class="ST1">timeSinceLastCollisionEvent</span> = <span class="number">0</span>;
|
||||
incrementPlayerScore();
|
||||
playSound(<span class="string">"</span><span class="string">racket</span><span class="string">"</span>);
|
||||
<span class="literal">return</span> <span class="literal">true</span>;
|
||||
} <span class="literal">else</span> {
|
||||
<span class="literal">return</span> <span class="literal">false</span>;
|
||||
}
|
||||
}
|
||||
|
||||
<span class="literal">private</span> <span class="literal">void</span> <span class="ST4">moveBall</span>() {
|
||||
|
||||
<span class="comment">// Check boundaries</span>
|
||||
<span class="literal">if</span> (<span class="ST1">x</span> < <span class="ST1">radius</span> || <span class="ST1">x</span> > getWidth() - <span class="ST1">radius</span>) {
|
||||
<span class="ST1">dx</span> *= -<span class="number">1</span>; <span class="comment">// Change ball move direction</span>
|
||||
}
|
||||
<span class="literal">if</span> (<span class="ST1">y</span> < <span class="ST1">radius</span> || <span class="ST1">y</span> > getHeight() - <span class="ST1">radius</span> || processRacketCollision()) {
|
||||
<span class="ST1">dy</span> *= -<span class="number">1</span>; <span class="comment">// Change ball move direction</span>
|
||||
}
|
||||
|
||||
<span class="comment">// Adjust ball position by 1 or -1</span>
|
||||
<span class="ST1">x</span> += <span class="ST1">dx</span>;
|
||||
<span class="ST1">y</span> += <span class="ST1">dy</span>;
|
||||
<span class="ST1">circle</span>.setCenterX(<span class="ST1">x</span>);
|
||||
<span class="ST1">circle</span>.setCenterY(<span class="ST1">y</span>);
|
||||
ballCoordsToLabel();
|
||||
}
|
||||
|
||||
<span class="literal">public</span> <span class="literal">void</span> <span class="ST4">play</span>() {
|
||||
<span class="ST1">animation</span>.play();
|
||||
}
|
||||
|
||||
<span class="literal">public</span> <span class="literal">void</span> <span class="ST4">pause</span>() {
|
||||
<span class="ST1">animation</span>.pause();
|
||||
}
|
||||
|
||||
<span class="literal">public</span> <span class="literal">void</span> <span class="ST4">increaseSpeed</span>() {
|
||||
<span class="ST1">animation</span>.setRate(<span class="ST1">animation</span>.getRate() * <span class="number">1.5</span>);
|
||||
System.<span class="ST2">out</span>.println(<span class="ST1">a</span><span class="ST1">nimation</span>.getRate());
|
||||
}
|
||||
|
||||
<span class="literal">public</span> <span class="literal">void</span> <span class="ST4">decreaseSpeed</span>() {
|
||||
<span class="ST1">animation</span>.setRate(<span class="ST1">animation</span>.getRate() * <span class="number">1.5</span> > <span class="number">0</span> ? <span class="ST1">animation</span>.getRate() / <span class="number">1.5</span> : <span class="number">0</span>);
|
||||
System.<span class="ST2">out</span>.println(<span class="ST1">a</span><span class="ST1">nimation</span>.getRate());
|
||||
}
|
||||
|
||||
<span class="literal">public</span> DoubleProperty <span class="ST4">rateProperty</span>() {
|
||||
<span class="literal">return</span> <span class="ST1">animation</span>.rateProperty();
|
||||
}
|
||||
|
||||
<span class="literal">public</span> <span class="literal">void</span> <span class="ST4">moveRacket</span>(<span class="literal">double</span> x) {
|
||||
<span class="ST1">racket</span>.relocate(x, <span class="number">5</span><span class="number">80</span>);
|
||||
}
|
||||
|
||||
<span class="literal">public</span> <span class="literal">void</span> <span class="ST4">showInfoLabel</span>() {
|
||||
<span class="literal">double</span> paneHeight = getHeight();
|
||||
<span class="literal">double</span> paneWidth = getWidth();
|
||||
getChildren().add(<span class="ST1">i</span><span class="ST1">nfoLabel</span>);
|
||||
<span class="comment">// Center Text</span>
|
||||
<span class="ST1">infoLabel</span>.relocate(paneWidth / <span class="number">4.0</span>, paneHeight / <span class="number">2.0</span>);
|
||||
}
|
||||
|
||||
<span class="literal">public</span> <span class="literal">void</span> <span class="ST4">hideInfoLabel</span>() {
|
||||
getChildren().remove(<span class="ST1">i</span><span class="ST1">nfoLabel</span>);
|
||||
}
|
||||
|
||||
<span class="literal">private</span> <span class="literal">void</span> <span class="ST4">incrementPlayerScore</span>() {
|
||||
<span class="ST1">playerScoreLabel</span>.setText(<span class="string">"</span><span class="string">Player score: </span><span class="string">"</span> + ++<span class="ST1">playerScore</span>);
|
||||
}
|
||||
|
||||
<span class="literal">private</span> <span class="literal">void</span> <span class="ST4">incrementComputerScore</span>() {
|
||||
<span class="ST1">computerScoreLabel</span>.setText(<span class="string">"</span><span class="string">Computer score: </span><span class="string">"</span> + ++<span class="ST1">computerScore</span>);
|
||||
|
||||
}
|
||||
|
||||
<span class="literal">private</span> <span class="literal">void</span> <span class="ST4">ballCoordsToLabel</span>() {
|
||||
<span class="ST1">ballCords</span>.setText(<span class="string">"</span><span class="string">Ball coords: </span><span class="string">"</span> + <span class="ST1">x</span> + <span class="string">"</span><span class="string">, </span><span class="string">"</span> + <span class="ST1">y</span>);
|
||||
}
|
||||
|
||||
<span class="literal">private</span> <span class="literal">void</span> <span class="ST4">playSound</span>(String sampleType) {
|
||||
<span class="literal">boolean</span> isSfx = <span class="literal">true</span>;
|
||||
String sample = <span class="string">"</span><span class="string">sound/sfx/Sample_00</span><span class="string">"</span>;
|
||||
<span class="literal">int</span> randInt = (<span class="literal">int</span>) (Math.<span class="ST3">random</span>() * <span class="number">2</span>);
|
||||
<span class="literal">switch</span> (sampleType) {
|
||||
<span class="literal">case</span> <span class="string">"</span><span class="string">collision</span><span class="string">"</span>:
|
||||
randInt = (<span class="literal">int</span>) (Math.<span class="ST3">random</span>() * <span class="number">2</span>);
|
||||
isSfx = <span class="literal">true</span>;
|
||||
<span class="literal">switch</span> (randInt) {
|
||||
<span class="literal">case</span> <span class="number">0</span>:
|
||||
sample += <span class="string">"</span><span class="string">05</span><span class="string">"</span>;
|
||||
<span class="literal">break</span>;
|
||||
<span class="literal">case</span> <span class="number">1</span>:
|
||||
sample += <span class="string">"</span><span class="string">07</span><span class="string">"</span>;
|
||||
<span class="literal">break</span>;
|
||||
}
|
||||
<span class="literal">break</span>;
|
||||
<span class="literal">case</span> <span class="string">"</span><span class="string">racket</span><span class="string">"</span>:
|
||||
randInt = (<span class="literal">int</span>) (Math.<span class="ST3">random</span>() * <span class="number">2</span>);
|
||||
isSfx = <span class="literal">true</span>;
|
||||
<span class="literal">switch</span> (randInt) {
|
||||
<span class="literal">case</span> <span class="number">0</span>:
|
||||
sample += <span class="string">"</span><span class="string">10</span><span class="string">"</span>;
|
||||
<span class="literal">break</span>;
|
||||
<span class="literal">case</span> <span class="number">1</span>:
|
||||
sample += <span class="string">"</span><span class="string">12</span><span class="string">"</span>;
|
||||
<span class="literal">break</span>;
|
||||
}
|
||||
<span class="literal">break</span>;
|
||||
<span class="literal">case</span> <span class="string">"</span><span class="string">bgm</span><span class="string">"</span>:
|
||||
sample = <span class="string">"</span><span class="string">sound/bgm/</span><span class="string">"</span>;
|
||||
randInt = (<span class="literal">int</span>) (Math.<span class="ST3">random</span>() * <span class="number">3</span>);
|
||||
isSfx = <span class="literal">false</span>;
|
||||
<span class="literal">switch</span> (randInt) {
|
||||
<span class="literal">case</span> <span class="number">0</span>:
|
||||
<span class="ST1">currentlyPlaying</span> = <span class="string">"</span><span class="string">Chloe Fontenot - Blips</span><span class="string">"</span>;
|
||||
<span class="ST1">nowPlaying</span>.setText(<span class="string">"</span><span class="string">Now playing: </span><span class="string">"</span> + <span class="ST1">currentlyPlaying</span>);
|
||||
<span class="literal">break</span>;
|
||||
<span class="literal">case</span> <span class="number">1</span>:
|
||||
<span class="ST1">currentlyPlaying</span> = <span class="string">"</span><span class="string">Chloe Fontenot - DEAL WITH IT</span><span class="string">"</span>;
|
||||
<span class="ST1">nowPlaying</span>.setText(<span class="string">"</span><span class="string">Now playing: </span><span class="string">"</span> + <span class="ST1">currentlyPlaying</span>);
|
||||
<span class="literal">break</span>;
|
||||
<span class="literal">case</span> <span class="number">2</span>:
|
||||
<span class="ST1">currentlyPlaying</span> = <span class="string">"</span><span class="string">Chloe Fontenot - Tomodachi Moment</span><span class="string">"</span>;
|
||||
<span class="ST1">nowPlaying</span>.setText(<span class="string">"</span><span class="string">Now playing: </span><span class="string">"</span> + <span class="ST1">currentlyPlaying</span>);
|
||||
<span class="literal">break</span>;
|
||||
}
|
||||
sample += <span class="ST1">currentlyPlaying</span>;
|
||||
<span class="literal">break</span>;
|
||||
}
|
||||
Media sound = <span class="literal">new</span> Media(<span class="literal">n</span><span class="literal">ew</span> File(sample + <span class="string">"</span><span class="string">.wav</span><span class="string">"</span>).toURI().toString());
|
||||
MediaPlayer mediaPlayer = <span class="literal">new</span> MediaPlayer(sound);
|
||||
mediaPlayer.setStartTime(Duration.<span class="ST2">ZERO</span>);
|
||||
mediaPlayer.setAutoPlay(<span class="literal">t</span><span class="literal">rue</span>);
|
||||
<span class="comment">// If we're playing BGM, lower the volume a little</span>
|
||||
<span class="literal">if</span> (!isSfx) {
|
||||
mediaPlayer.setVolume(<span class="number">0</span><span class="number">.6</span>);
|
||||
mediaPlayer.setCycleCount(MediaPlayer.<span class="ST2">INDEFINITE</span>);
|
||||
}
|
||||
mediaPlayer.play();
|
||||
<span class="ST1">mediaPlayers</span>.add(mediaPlayer); <span class="comment">// Prevent the JVM's GC from deleting our media player if there's already one running</span>
|
||||
<span class="comment">// Free the media player when it has finished playing a sound.</span>
|
||||
mediaPlayer.setOnEndOfMedia(<span class="literal">new</span> Runnable() {
|
||||
@Override
|
||||
<span class="literal">public</span> <span class="literal">void</span> <span class="ST4">run</span>() {
|
||||
<span class="comment">//System.out.println("I'm done playing sound! Please take me to the ether, Java GC!");</span>
|
||||
mediaPlayer.stop();
|
||||
mediaPlayer.dispose();
|
||||
<span class="ST1">mediaPlayers</span>.remove(mediaPlayer);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
</pre></body>
|
||||
</html>
|
||||
53
Semester 3/Assignments/MP2-chapter4_ChloeFontenot/build.xml
Normal file
53
Semester 3/Assignments/MP2-chapter4_ChloeFontenot/build.xml
Normal file
@@ -0,0 +1,53 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><!-- You may freely edit this file. See commented blocks below for --><!-- some examples of how to customize the build. --><!-- (If you delete it and reopen the project it will be recreated.) --><!-- By default, only the Clean and Build commands use this build script. --><project name="lab3_ChloeFontenot" default="default" basedir="." xmlns:fx="javafx:com.sun.javafx.tools.ant">
|
||||
<description>Builds, tests, and runs the project lab3_ChloeFontenot.</description>
|
||||
<import file="nbproject/build-impl.xml"/>
|
||||
<!--
|
||||
|
||||
There exist several targets which are by default empty and which can be
|
||||
used for execution of your tasks. These targets are usually executed
|
||||
before and after some main targets. Those of them relevant for JavaFX project are:
|
||||
|
||||
-pre-init: called before initialization of project properties
|
||||
-post-init: called after initialization of project properties
|
||||
-pre-compile: called before javac compilation
|
||||
-post-compile: called after javac compilation
|
||||
-pre-compile-test: called before javac compilation of JUnit tests
|
||||
-post-compile-test: called after javac compilation of JUnit tests
|
||||
-pre-jfx-jar: called before FX SDK specific <fx:jar> task
|
||||
-post-jfx-jar: called after FX SDK specific <fx:jar> task
|
||||
-pre-jfx-deploy: called before FX SDK specific <fx:deploy> task
|
||||
-post-jfx-deploy: called after FX SDK specific <fx:deploy> task
|
||||
-pre-jfx-native: called just after -pre-jfx-deploy if <fx:deploy> runs in native packaging mode
|
||||
-post-jfx-native: called just after -post-jfx-deploy if <fx:deploy> runs in native packaging mode
|
||||
-post-clean: called after cleaning build products
|
||||
|
||||
(Targets beginning with '-' are not intended to be called on their own.)
|
||||
|
||||
Example of inserting a HTML postprocessor after javaFX SDK deployment:
|
||||
|
||||
<target name="-post-jfx-deploy">
|
||||
<basename property="jfx.deployment.base" file="${jfx.deployment.jar}" suffix=".jar"/>
|
||||
<property name="jfx.deployment.html" location="${jfx.deployment.dir}${file.separator}${jfx.deployment.base}.html"/>
|
||||
<custompostprocess>
|
||||
<fileset dir="${jfx.deployment.html}"/>
|
||||
</custompostprocess>
|
||||
</target>
|
||||
|
||||
Example of calling an Ant task from JavaFX SDK. Note that access to JavaFX SDK Ant tasks must be
|
||||
initialized; to ensure this is done add the dependence on -check-jfx-sdk-version target:
|
||||
|
||||
<target name="-post-jfx-jar" depends="-check-jfx-sdk-version">
|
||||
<echo message="Calling jar task from JavaFX SDK"/>
|
||||
<fx:jar ...>
|
||||
...
|
||||
</fx:jar>
|
||||
</target>
|
||||
|
||||
For more details about JavaFX SDK Ant tasks go to
|
||||
http://docs.oracle.com/javafx/2/deployment/jfxpub-deployment.htm
|
||||
|
||||
For list of available properties check the files
|
||||
nbproject/build-impl.xml and nbproject/jfx-impl.xml.
|
||||
|
||||
-->
|
||||
</project>
|
||||
@@ -0,0 +1,3 @@
|
||||
Manifest-Version: 1.0
|
||||
X-COMMENT: Main-Class will be added automatically by build
|
||||
|
||||
BIN
Semester 3/Assignments/MP2-chapter4_ChloeFontenot/mp2.doc
Normal file
BIN
Semester 3/Assignments/MP2-chapter4_ChloeFontenot/mp2.doc
Normal file
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,2 @@
|
||||
# Do not modify this property in this configuration. It can be re-generated.
|
||||
$label=Run as WebStart
|
||||
@@ -0,0 +1,2 @@
|
||||
# Do not modify this property in this configuration. It can be re-generated.
|
||||
$label=Run in Browser
|
||||
@@ -0,0 +1,8 @@
|
||||
build.xml.data.CRC32=7c5d606e
|
||||
build.xml.script.CRC32=f4beac8b
|
||||
build.xml.stylesheet.CRC32=f85dc8f2@1.107.0.48
|
||||
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
|
||||
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
|
||||
nbproject/build-impl.xml.data.CRC32=1d3703fe
|
||||
nbproject/build-impl.xml.script.CRC32=4d538bea
|
||||
nbproject/build-impl.xml.stylesheet.CRC32=12e0a6c2@1.107.0.48
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,124 @@
|
||||
annotation.processing.enabled=true
|
||||
annotation.processing.enabled.in.editor=false
|
||||
annotation.processing.processors.list=
|
||||
annotation.processing.run.all.processors=true
|
||||
annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
|
||||
application.title=MP2-chapter4_ChloeFontenot
|
||||
application.vendor=chloe
|
||||
build.classes.dir=${build.dir}/classes
|
||||
build.classes.excludes=**/*.java,**/*.form
|
||||
# This directory is removed when the project is cleaned:
|
||||
build.dir=build
|
||||
build.generated.dir=${build.dir}/generated
|
||||
build.generated.sources.dir=${build.dir}/generated-sources
|
||||
# Only compile against the classpath explicitly listed here:
|
||||
build.sysclasspath=ignore
|
||||
build.test.classes.dir=${build.dir}/test/classes
|
||||
build.test.results.dir=${build.dir}/test/results
|
||||
compile.on.save=true
|
||||
compile.on.save.unsupported.javafx=true
|
||||
# Uncomment to specify the preferred debugger connection transport:
|
||||
#debug.transport=dt_socket
|
||||
debug.classpath=\
|
||||
${run.classpath}
|
||||
debug.modulepath=\
|
||||
${run.modulepath}
|
||||
debug.test.classpath=\
|
||||
${run.test.classpath}
|
||||
debug.test.modulepath=\
|
||||
${run.test.modulepath}
|
||||
# This directory is removed when the project is cleaned:
|
||||
dist.dir=dist
|
||||
dist.jar=${dist.dir}/MP2-chapter4_ChloeFontenot.jar
|
||||
dist.javadoc.dir=${dist.dir}/javadoc
|
||||
endorsed.classpath=
|
||||
excludes=
|
||||
includes=**
|
||||
# Non-JavaFX jar file creation is deactivated in JavaFX 2.0+ projects
|
||||
jar.archive.disabled=true
|
||||
jar.compress=false
|
||||
javac.classpath=
|
||||
# Space-separated list of extra javac options
|
||||
javac.compilerargs=
|
||||
javac.deprecation=false
|
||||
javac.external.vm=false
|
||||
javac.modulepath=
|
||||
javac.processormodulepath=
|
||||
javac.processorpath=\
|
||||
${javac.classpath}
|
||||
javac.source=1.8
|
||||
javac.target=1.8
|
||||
javac.test.classpath=\
|
||||
${javac.classpath}:\
|
||||
${build.classes.dir}
|
||||
javac.test.modulepath=\
|
||||
${javac.modulepath}
|
||||
javac.test.processorpath=\
|
||||
${javac.test.classpath}
|
||||
javadoc.additionalparam=
|
||||
javadoc.author=false
|
||||
javadoc.encoding=${source.encoding}
|
||||
javadoc.html5=false
|
||||
javadoc.noindex=false
|
||||
javadoc.nonavbar=false
|
||||
javadoc.notree=false
|
||||
javadoc.private=false
|
||||
javadoc.splitindex=true
|
||||
javadoc.use=true
|
||||
javadoc.version=false
|
||||
javadoc.windowtitle=
|
||||
javafx.application.implementation.version=1.0
|
||||
javafx.binarycss=false
|
||||
javafx.deploy.allowoffline=true
|
||||
# If true, application update mode is set to 'background', if false, update mode is set to 'eager'
|
||||
javafx.deploy.backgroundupdate=false
|
||||
javafx.deploy.embedJNLP=true
|
||||
javafx.deploy.includeDT=true
|
||||
# Set true to prevent creation of temporary copy of deployment artifacts before each run (disables concurrent runs)
|
||||
javafx.disable.concurrent.runs=false
|
||||
# Set true to enable multiple concurrent runs of the same WebStart or Run-in-Browser project
|
||||
javafx.enable.concurrent.external.runs=false
|
||||
# This is a JavaFX project
|
||||
javafx.enabled=true
|
||||
javafx.fallback.class=com.javafx.main.NoJavaFXFallback
|
||||
# Main class for JavaFX
|
||||
javafx.main.class=MP2_chapter4_ChloeFontenot.BallControl
|
||||
javafx.preloader.class=
|
||||
# This project does not use Preloader
|
||||
javafx.preloader.enabled=false
|
||||
javafx.preloader.jar.filename=
|
||||
javafx.preloader.jar.path=
|
||||
javafx.preloader.project.path=
|
||||
javafx.preloader.type=none
|
||||
# Set true for GlassFish only. Rebases manifest classpaths of JARs in lib dir. Not usable with signed JARs.
|
||||
javafx.rebase.libs=false
|
||||
javafx.run.height=600
|
||||
javafx.run.width=800
|
||||
jlink.launcher=false
|
||||
jlink.launcher.name=MP2-chapter4_ChloeFontenot
|
||||
# Pre-JavaFX 2.0 WebStart is deactivated in JavaFX 2.0+ projects
|
||||
jnlp.enabled=false
|
||||
# Main class for Java launcher
|
||||
main.class=com.javafx.main.Main
|
||||
# For improved security specify narrower Codebase manifest attribute to prevent RIAs from being repurposed
|
||||
manifest.custom.codebase=*
|
||||
# Specify Permissions manifest attribute to override default (choices: sandbox, all-permissions)
|
||||
manifest.custom.permissions=
|
||||
manifest.file=manifest.mf
|
||||
meta.inf.dir=${src.dir}/META-INF
|
||||
mkdist.disabled=false
|
||||
platform.active=JDK_1.8
|
||||
run.classpath=\
|
||||
${dist.jar}:\
|
||||
${javac.classpath}:\
|
||||
${build.classes.dir}
|
||||
run.modulepath=\
|
||||
${javac.modulepath}
|
||||
run.test.classpath=\
|
||||
${javac.test.classpath}:\
|
||||
${build.test.classes.dir}
|
||||
run.test.modulepath=\
|
||||
${javac.test.modulepath}
|
||||
source.encoding=UTF-8
|
||||
src.dir=src
|
||||
test.src.dir=test
|
||||
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://www.netbeans.org/ns/project/1">
|
||||
<type>org.netbeans.modules.java.j2seproject</type>
|
||||
<configuration>
|
||||
<buildExtensions xmlns="http://www.netbeans.org/ns/ant-build-extender/1">
|
||||
<extension file="jfx-impl.xml" id="jfx3">
|
||||
<dependency dependsOn="-jfx-copylibs" target="-post-jar"/>
|
||||
<dependency dependsOn="-rebase-libs" target="-post-jar"/>
|
||||
<dependency dependsOn="jfx-deployment" target="-post-jar"/>
|
||||
<dependency dependsOn="jar" target="debug"/>
|
||||
<dependency dependsOn="jar" target="profile"/>
|
||||
<dependency dependsOn="jar" target="run"/>
|
||||
</extension>
|
||||
</buildExtensions>
|
||||
<data xmlns="http://www.netbeans.org/ns/j2se-project/3">
|
||||
<name>MP2-chapter4_ChloeFontenot</name>
|
||||
<explicit-platform explicit-source-supported="true"/>
|
||||
<source-roots>
|
||||
<root id="src.dir"/>
|
||||
</source-roots>
|
||||
<test-roots>
|
||||
<root id="test.src.dir"/>
|
||||
</test-roots>
|
||||
</data>
|
||||
</configuration>
|
||||
</project>
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,87 @@
|
||||
/*
|
||||
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
|
||||
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
|
||||
*/
|
||||
package MP2_chapter4_ChloeFontenot;
|
||||
|
||||
import javafx.application.Application;
|
||||
import javafx.event.EventHandler;
|
||||
import javafx.scene.Scene;
|
||||
import javafx.scene.input.KeyCode;
|
||||
import javafx.scene.input.MouseEvent;
|
||||
import javafx.stage.Stage;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author chloe
|
||||
*/
|
||||
public class BallControl extends Application {
|
||||
|
||||
private boolean mouseFocus = false;
|
||||
private int racketPosition = 0;
|
||||
|
||||
@Override
|
||||
public void start(Stage primaryStage) throws Exception
|
||||
{
|
||||
|
||||
BouncingBall bouncingBall = new BouncingBall();
|
||||
// Create a scene and place it in the stage
|
||||
Scene scene = new Scene(bouncingBall, 800, 600);
|
||||
primaryStage.setTitle("Bouncing Ball Control");
|
||||
primaryStage.setScene(scene);
|
||||
primaryStage.show();
|
||||
bouncingBall.requestFocus();
|
||||
bouncingBall.showInfoLabel();
|
||||
|
||||
bouncingBall.setOnMouseEntered(e
|
||||
-> {
|
||||
mouseFocus = true;
|
||||
bouncingBall.hideInfoLabel();
|
||||
bouncingBall.play();
|
||||
});
|
||||
|
||||
bouncingBall.setOnMouseExited(e -> {
|
||||
mouseFocus = false;
|
||||
});
|
||||
bouncingBall.setOnMouseMoved(new EventHandler<MouseEvent>() {
|
||||
@Override
|
||||
public void handle(MouseEvent event)
|
||||
{
|
||||
double mouseX = event.getSceneX() - (bouncingBall.RACKET_LENGTH / 2); // set relative to center of racket
|
||||
bouncingBall.moveRacket(mouseX);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
// Increase and decrease animation
|
||||
bouncingBall.setOnKeyPressed(e
|
||||
-> {
|
||||
if (e.getCode() == KeyCode.LEFT && mouseFocus == false) {
|
||||
bouncingBall.hideInfoLabel();
|
||||
if (racketPosition > 0) {
|
||||
racketPosition = racketPosition - 30;
|
||||
}
|
||||
bouncingBall.moveRacket(racketPosition);
|
||||
}
|
||||
if (e.getCode() == KeyCode.RIGHT && mouseFocus == false) {
|
||||
bouncingBall.hideInfoLabel();
|
||||
if (racketPosition < bouncingBall.getWidth()) {
|
||||
racketPosition = racketPosition + 30;
|
||||
}
|
||||
bouncingBall.moveRacket(racketPosition);
|
||||
}
|
||||
if (e.getCode() == KeyCode.UP) {
|
||||
bouncingBall.increaseSpeed();
|
||||
} else if (e.getCode() == KeyCode.DOWN) {
|
||||
bouncingBall.decreaseSpeed();
|
||||
}
|
||||
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
launch(args);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,255 @@
|
||||
/*
|
||||
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
|
||||
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
|
||||
*/
|
||||
package MP2_chapter4_ChloeFontenot;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import javafx.animation.KeyFrame;
|
||||
import javafx.animation.Timeline;
|
||||
import javafx.beans.property.DoubleProperty;
|
||||
import javafx.event.ActionEvent;
|
||||
import javafx.event.EventHandler;
|
||||
import javafx.scene.control.Button;
|
||||
import javafx.scene.control.Label;
|
||||
import javafx.scene.layout.GridPane;
|
||||
import javafx.scene.layout.Pane;
|
||||
import javafx.scene.media.Media;
|
||||
import javafx.scene.media.MediaPlayer;
|
||||
import javafx.scene.paint.Color;
|
||||
import javafx.scene.shape.Circle;
|
||||
import javafx.scene.shape.Rectangle;
|
||||
import javafx.util.Duration;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author chloe
|
||||
*/
|
||||
public class BouncingBall extends Pane {
|
||||
|
||||
private List<MediaPlayer> mediaPlayers = new ArrayList<>();
|
||||
GridPane textPane = new GridPane();
|
||||
private String currentlyPlaying;
|
||||
private final int COLLISION_COOLDOWN = 20;
|
||||
private long timeSinceLastCollisionEvent = 0;
|
||||
final double RACKET_LENGTH = 100;
|
||||
final double radius = 20;
|
||||
private double x = radius, y = radius;
|
||||
private double dx = 1, dy = 1;
|
||||
private Circle circle = new Circle(x, y, radius);
|
||||
private Rectangle racket = new Rectangle(RACKET_LENGTH, 20);
|
||||
private Label infoLabel = new Label("Your mouse cursor must be inside the bounds of the window to play!");
|
||||
private Label racketTime = new Label();
|
||||
private Label ballCords = new Label();
|
||||
private Label playerScoreLabel = new Label("Player Score: 0");
|
||||
private Label computerScoreLabel = new Label("Computer Score: 0");
|
||||
private Label nowPlaying = new Label();
|
||||
private Button restartBgm = new Button("Restart BGM");
|
||||
|
||||
private Timeline animation;
|
||||
|
||||
private int computerScore, playerScore = 0;
|
||||
|
||||
public BouncingBall() {
|
||||
restartBgm.setOnMouseClicked(e -> {
|
||||
playSound("bgm");
|
||||
});
|
||||
circle.setFill(Color.RED); // Set ball color
|
||||
racket.setFill(Color.BLUE);
|
||||
textPane.add(racketTime, 0, 0);
|
||||
textPane.add(ballCords, 0, 1);
|
||||
textPane.add(playerScoreLabel, 0, 2);
|
||||
textPane.add(computerScoreLabel, 0, 3);
|
||||
textPane.add(nowPlaying, 0, 4);
|
||||
textPane.add(restartBgm, 0, 5);
|
||||
getChildren().addAll(circle, racket, textPane); // Place a ball into this pane
|
||||
racket.relocate(0, 580);
|
||||
playSound("bgm");
|
||||
// Create an animation for moving the ball
|
||||
animation = new Timeline(new KeyFrame(Duration.millis(1), new EventHandler<ActionEvent>() {
|
||||
@Override
|
||||
public void handle(ActionEvent t) {
|
||||
|
||||
timeSinceLastCollisionEvent++;
|
||||
racketTime.setText("Frames since last collision: " + timeSinceLastCollisionEvent);
|
||||
moveBall();
|
||||
// Process collisions
|
||||
if (y >= (getHeight() - 20) && (timeSinceLastCollisionEvent > COLLISION_COOLDOWN)) {
|
||||
timeSinceLastCollisionEvent = 0;
|
||||
playSound("collision");
|
||||
incrementComputerScore();
|
||||
}
|
||||
if ((x <= 20 && (timeSinceLastCollisionEvent > COLLISION_COOLDOWN)) || ((x >= getWidth() - 20) && (timeSinceLastCollisionEvent > COLLISION_COOLDOWN))) {
|
||||
timeSinceLastCollisionEvent = 0;
|
||||
playSound("collision");
|
||||
}
|
||||
if (y <= 20 && (timeSinceLastCollisionEvent > COLLISION_COOLDOWN)) {
|
||||
timeSinceLastCollisionEvent = 0;
|
||||
playSound("collision");
|
||||
}
|
||||
}
|
||||
})
|
||||
);
|
||||
animation.setRate(animation.getRate() * .5);
|
||||
animation.setCycleCount(Timeline.INDEFINITE);
|
||||
|
||||
}
|
||||
|
||||
private boolean processRacketCollision() {
|
||||
boolean racketCollision = racket.getBoundsInParent().intersects(circle.getBoundsInParent());
|
||||
|
||||
if (racketCollision && (timeSinceLastCollisionEvent > COLLISION_COOLDOWN)) { // This is second condition is a cooldown. It prevents odd behavior happening with the ball and the racket if the racket hits the ball at certain angles.
|
||||
System.out.println("Racket collision detected!");
|
||||
timeSinceLastCollisionEvent = 0;
|
||||
incrementPlayerScore();
|
||||
playSound("racket");
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private void moveBall() {
|
||||
|
||||
// Check boundaries
|
||||
if (x < radius || x > getWidth() - radius) {
|
||||
dx *= -1; // Change ball move direction
|
||||
}
|
||||
if (y < radius || y > getHeight() - radius || processRacketCollision()) {
|
||||
dy *= -1; // Change ball move direction
|
||||
}
|
||||
|
||||
// Adjust ball position by 1 or -1
|
||||
x += dx;
|
||||
y += dy;
|
||||
circle.setCenterX(x);
|
||||
circle.setCenterY(y);
|
||||
ballCoordsToLabel();
|
||||
}
|
||||
|
||||
public void play() {
|
||||
animation.play();
|
||||
}
|
||||
|
||||
public void pause() {
|
||||
animation.pause();
|
||||
}
|
||||
|
||||
public void increaseSpeed() {
|
||||
animation.setRate(animation.getRate() * 1.5);
|
||||
System.out.println(animation.getRate());
|
||||
}
|
||||
|
||||
public void decreaseSpeed() {
|
||||
animation.setRate(animation.getRate() * 1.5 > 0 ? animation.getRate() / 1.5 : 0);
|
||||
System.out.println(animation.getRate());
|
||||
}
|
||||
|
||||
public DoubleProperty rateProperty() {
|
||||
return animation.rateProperty();
|
||||
}
|
||||
|
||||
public void moveRacket(double x) {
|
||||
racket.relocate(x, 580);
|
||||
}
|
||||
|
||||
public void showInfoLabel() {
|
||||
double paneHeight = getHeight();
|
||||
double paneWidth = getWidth();
|
||||
getChildren().add(infoLabel);
|
||||
// Center Text
|
||||
infoLabel.relocate(paneWidth / 4.0, paneHeight / 2.0);
|
||||
}
|
||||
|
||||
public void hideInfoLabel() {
|
||||
getChildren().remove(infoLabel);
|
||||
}
|
||||
|
||||
private void incrementPlayerScore() {
|
||||
playerScoreLabel.setText("Player score: " + ++playerScore);
|
||||
}
|
||||
|
||||
private void incrementComputerScore() {
|
||||
computerScoreLabel.setText("Computer score: " + ++computerScore);
|
||||
|
||||
}
|
||||
|
||||
private void ballCoordsToLabel() {
|
||||
ballCords.setText("Ball coords: " + x + ", " + y);
|
||||
}
|
||||
|
||||
private void playSound(String sampleType) {
|
||||
boolean isSfx = true;
|
||||
String sample = "sound/sfx/Sample_00";
|
||||
int randInt = (int) (Math.random() * 2);
|
||||
switch (sampleType) {
|
||||
case "collision":
|
||||
randInt = (int) (Math.random() * 2);
|
||||
isSfx = true;
|
||||
switch (randInt) {
|
||||
case 0:
|
||||
sample += "05";
|
||||
break;
|
||||
case 1:
|
||||
sample += "07";
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case "racket":
|
||||
randInt = (int) (Math.random() * 2);
|
||||
isSfx = true;
|
||||
switch (randInt) {
|
||||
case 0:
|
||||
sample += "10";
|
||||
break;
|
||||
case 1:
|
||||
sample += "12";
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case "bgm":
|
||||
sample = "sound/bgm/";
|
||||
randInt = (int) (Math.random() * 3);
|
||||
isSfx = false;
|
||||
switch (randInt) {
|
||||
case 0:
|
||||
currentlyPlaying = "Chloe Fontenot - Blips";
|
||||
nowPlaying.setText("Now playing: " + currentlyPlaying);
|
||||
break;
|
||||
case 1:
|
||||
currentlyPlaying = "Chloe Fontenot - DEAL WITH IT";
|
||||
nowPlaying.setText("Now playing: " + currentlyPlaying);
|
||||
break;
|
||||
case 2:
|
||||
currentlyPlaying = "Chloe Fontenot - Tomodachi Moment";
|
||||
nowPlaying.setText("Now playing: " + currentlyPlaying);
|
||||
break;
|
||||
}
|
||||
sample += currentlyPlaying;
|
||||
break;
|
||||
}
|
||||
Media sound = new Media(new File(sample + ".wav").toURI().toString());
|
||||
MediaPlayer mediaPlayer = new MediaPlayer(sound);
|
||||
mediaPlayer.setStartTime(Duration.ZERO);
|
||||
mediaPlayer.setAutoPlay(true);
|
||||
// If we're playing BGM, lower the volume a little
|
||||
if (!isSfx) {
|
||||
mediaPlayer.setVolume(0.6);
|
||||
mediaPlayer.setCycleCount(MediaPlayer.INDEFINITE);
|
||||
}
|
||||
mediaPlayer.play();
|
||||
mediaPlayers.add(mediaPlayer); // Prevent the JVM's GC from deleting our media player if there's already one running
|
||||
// Free the media player when it has finished playing a sound.
|
||||
mediaPlayer.setOnEndOfMedia(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
//System.out.println("I'm done playing sound! Please take me to the ether, Java GC!");
|
||||
mediaPlayer.stop();
|
||||
mediaPlayer.dispose();
|
||||
mediaPlayers.remove(mediaPlayer);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
|
||||
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
|
||||
*/
|
||||
package MP2_chapter4_ChloeFontenot;
|
||||
|
||||
import javafx.scene.media.MediaPlayer;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author chloe
|
||||
*/
|
||||
public class MediaType {
|
||||
private MediaPlayer mediaPlayer;
|
||||
private boolean isBgm;
|
||||
|
||||
public MediaType(MediaPlayer mediaPlayer, boolean isBgm) {
|
||||
this.mediaPlayer = mediaPlayer;
|
||||
this.isBgm = isBgm;
|
||||
}
|
||||
|
||||
public boolean isIsBgm() {
|
||||
return isBgm;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user