Skip to content
Snippets Groups Projects
Commit a5cbb3ea authored by jez04's avatar jez04
Browse files

feat: assignment lab06

parent 9fd2f101
Branches master
No related merge requests found
Pipeline #2589 failed with stages
in 0 seconds
Showing
with 408 additions and 340 deletions
...@@ -3,10 +3,10 @@ ...@@ -3,10 +3,10 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>cz.vsb.fei.java2</groupId> <groupId>cz.vsb.fei.java2</groupId>
<artifactId>java2-lab05-v1</artifactId> <artifactId>java2-lab06-v1</artifactId>
<version>0.0.1-SNAPHOST</version> <version>0.0.1-SNAPHOST</version>
<name>java2-lab05-v1</name> <name>java2-lab06-v1</name>
<packaging>jar</packaging> <packaging>jar</packaging>
<properties> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
...@@ -15,8 +15,17 @@ ...@@ -15,8 +15,17 @@
<lombok.version>1.18.34</lombok.version> <lombok.version>1.18.34</lombok.version>
</properties> </properties>
<dependencies> <dependencies>
<!-- https://mvnrepository.com/artifact/jakarta.persistence/jakarta.persistence-api --> <dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jpamodelgen</artifactId>
<scope>provided</scope>
<version>6.6.11.Final</version>
</dependency>
<!--
https://mvnrepository.com/artifact/jakarta.persistence/jakarta.persistence-api -->
<dependency> <dependency>
<groupId>jakarta.persistence</groupId> <groupId>jakarta.persistence</groupId>
<artifactId>jakarta.persistence-api</artifactId> <artifactId>jakarta.persistence-api</artifactId>
...@@ -36,14 +45,16 @@ ...@@ -36,14 +45,16 @@
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core --> <!--
https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency> <dependency>
<groupId>org.apache.logging.log4j</groupId> <groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId> <artifactId>log4j-core</artifactId>
<version>2.24.3</version> <version>2.24.3</version>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api --> <!--
https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
<dependency> <dependency>
<groupId>org.apache.logging.log4j</groupId> <groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId> <artifactId>log4j-api</artifactId>
...@@ -111,10 +122,43 @@ ...@@ -111,10 +122,43 @@
<artifactId>lombok</artifactId> <artifactId>lombok</artifactId>
<version>${lombok.version}</version> <version>${lombok.version}</version>
</path> </path>
<path>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jpamodelgen</artifactId>
<version>6.6.11.Final</version>
</path>
</annotationProcessorPaths> </annotationProcessorPaths>
</configuration> </configuration>
<executions>
<execution>
<id>process</id>
<phase>generate-sources</phase>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>3.6.0</version>
<configuration>
<sources>
<source>target/generated-sources/annotations</source>
</sources>
</configuration>
<executions>
<execution>
<id>add-source</id>
<phase>process-resources</phase>
<goals>
<goal>add-source</goal>
</goals>
</execution>
</executions>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId> <artifactId>maven-dependency-plugin</artifactId>
......
NetworkNinja;122
VirtualVoyager;198
TweetTrendsetter;109
WebWizard;262
ScreenSage;95
CodeCommander;276
FunctionFanatic;288
DataDetective;112
ScreenSage;181
PixelArtist;242
RenderRogue;62
siast;101
ByteBishop;53
PixelProdigy;196
PixelArtist;70
AppAlchemist;106
ScriptSensei;283
package lab;
import java.io.IOException;
import java.sql.SQLException;
import org.h2.tools.Server;
import lab.storage.JpaConnector;
import lombok.extern.log4j.Log4j2;
/**
* Class <b>App</b> - extends class Application and it is an entry point of the
* program
*
* @author Java I
*/
@Log4j2
public class App {
public static void main(String[] args) {
log.info("Application lauched");
Server server = startDBWebServer();
JpaConnector connector = new JpaConnector();
//TODO
waitForKeyPress();
stopDBWebServer(server);
}
private static Server startDBWebServer() {
// Start HTTP server for access H2 DB for look inside
try {
Server server = Server.createWebServer();
log.info(server.getURL());
server.start();
log.info("DB Web server started!");
return server;
} catch (SQLException e) {
log.error("Cannot create DB web server.", e);
return null;
}
}
private static void stopDBWebServer(Server server) {
// Stop HTTP server for access H2 DB
log.info("Ending DB web server BYE.");
server.stop();
}
private static void waitForKeyPress() {
log.info("Waitnig for Key press (ENTER)");
try {
System.in.read();
} catch (IOException e) {
log.error("Cannot read input from keyboard.", e);
}
}
}
\ No newline at end of file
package lab;
import lab.storage.DbConnector;
import lab.storage.ScoreStorageInterface;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Builder.Default;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.ToString;
@Getter
@Builder(toBuilder = true)
@EqualsAndHashCode
@ToString
@AllArgsConstructor
public class Setting {
@Getter
private static Setting instance;
@Default
private ScoreStorageInterface scoreStorageInterface = new DbConnector();
@Default
private double gravity = 9.81;
@Default
private double normalBulletSpeed = 30;
@Default
private int numberOfUfos = 3;
@Default
private double ufoMinPercentageHeight = 0.3;
@Default
private double ufoMinSpeed = 70;
@Default
private double ufoMaxSpeed = 150;
@Default
private double bulletMinSpeed = 30;
@Default
private double bulletMaxSpeed = 300;
public static void configure(Setting setting) {
instance = setting;
}
public static Setting getInstanceForHardcoreGame() {
return builder().numberOfUfos(50).ufoMinPercentageHeight(0.9).ufoMinSpeed(200).ufoMaxSpeed(500).build();
}
}
package lab;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class Tools {
public static final Random RANDOM = new Random();
public static final List<String> FIRST_NAMES = List.of("Petr", "Marie", "Jan", "Jana", "Tomáš", "Kateřina", "Lukáš",
"Tereza", "Martin", "Veronika", "David", "Eva", "Jakub", "Lucie", "Michal", "Anna", "Adam", "Monika", "Tom",
"Klára", "Robert", "Kristýna", "Marek", "Simona", "Filip", "Petra", "Ondřej", "Lenka", "Matěj", "Markéta",
"Pavel", "Hana", "Jakub", "Adéla", "Daniel", "Barbora", "Lukáš", "Eliška", "Josef");
public static final List<String> LAST_NAMES = List.of("Novák", "Svoboda", "Novotný", "Dvořák", "Černý",
"Procházková", "Kučera", "Veselý", "Horák", "Němec", "Pokorný", "Mareš", "Pospíšilová", "Hájek", "Jelínek",
"Král", "Růžička", "Beneš", "Fiala", "Sedláček", "Kříž", "Němcová", "Vlček", "Kolář", "Bartoš", "Bílý",
"Veselá", "Kovařík", "Havelka", "Malý", "Urban", "Kopecký", "Vlach", "Šimek", "Konečný", "Doležal",
"Šťastný", "Kopečná", "Holub", "Pospíchal");
public static final List<String> STREETS = List.of("Panská", "Hlavní", "Ulice Nová", "Náměstí Svobody", "Hřbitovní",
"Revoluční", "Sadová", "Jiráskova", "Školní", "Vinohradská", "Komenského", "Mírová", "Křížová",
"Masarykova", "Třída Svobody", "Karlova", "Dlouhá", "Žižkova", "Purkyňova", "Rybářská", "Sokolská",
"Rybníček", "Vrchlického", "Štefánikova", "Veselá", "Lipová", "Na Hrázi", "Výšinná", "Nová Cesta", "Česká");
public static final List<String> CITIES = Collections.unmodifiableList(
Arrays.asList("Praha", "Brno", "Ostrava", "Plzeň", "Liberec", "Olomouc", "České Budějovice",
"Hradec Králové", "Ústí nad Labem", "Pardubice", "Zlín", "Karlovy Vary", "Jihlava", "Tábor",
"Havířov", "Český Těšín", "Mladá Boleslav", "Trutnov", "Přerov", "Kladno", "Opava", "Frýdek-Místek",
"Děčín", "Karviná", "Jablonec nad Nisou", "Třebíč", "Žďár nad Sázavou", "Kolín", "Uherské Hradiště",
"Znojmo", "Prostějov", "Litoměřice", "Kroměříž", "Chomutov", "Příbram", "Příbram", "Cheb",
"Teplice", "Uherský Brod", "Sokolov", "Břeclav", "Litvínov", "Klatovy", "Vsetín", "Nový Jičín"));
public static final List<String> POST_NUMBER = List.of("10000", "11000", "12000", "13000", "14000", "15000",
"16000", "17000", "18000", "19000", "20000", "21000", "22000", "23000", "24000", "25000", "26000", "27000",
"28000", "29000", "30000", "31000", "32000", "33000", "34000", "35000", "36000", "37000", "38000", "39000");
public static final List<String> COMPANY_NAMES = List.of("Inova", "Sprint", "Polaris", "Forte", "Nexus", "Vertex",
"Synergie", "Horizon", "Astra", "Axiom", "Optima", "Integra", "Evolve", "Apex", "Dynasty", "Eclipse",
"Paragon", "Fusion", "Oasis", "Equinox", "Voyage", "Genesis", "Zenith", "Elite", "Harmony", "Stratos",
"Aurora", "Quantum", "Spectrum");
public static final List<String> BIRD_NAMES = List.of("Vlaštovka", "Sýkorka", "Krkavec", "Sokol", "Káně",
"Střízlík", "Sojka", "Datel", "Drozd", "Rorýs", "Husa", "Labuť", "Krahujec", "Sova", "Výr", "Husice",
"Havran", "Špaček", "Ledňáček", "Sup");
public static final List<String> NICKNAMES = List.of("CyberSurfer", "PixelPioneer", "SocialSavvy", "DigitalDynamo",
"ByteBuddy", "InstaGuru", "TikTokTornado", "SnapMaster", "TweetTrendsetter", "ChatChampion", "HashtagHero",
"EmojiEnthusiast", "StoryStylist", "SelfieStar", "FilterFanatic", "VlogVirtuoso", "Memelord",
"InfluencerInsider", "StreamSupreme", "GeekyGizmo", "CodeCommander", "JavaJuggernaut", "ByteNinja",
"SyntaxSamurai", "ClassyCoder", "ObjectOmnipotent", "LoopLegend", "VariableVirtuoso", "DebugDemon",
"CompilerCrusader", "PixelProdigy", "VirtualVoyager", "AlgorithmAce", "DataDynamo", "ExceptionExpert",
"BugBuster", "SyntaxSorcerer", "CodeCrusader", "JavaJester");
public static final List<String> PLAYER_NICKS = List.of("CyberSurfer", "PixelPioneer", "SocialSavvy",
"DigitalDynamo", "ByteBuddy", "InstaGuru", "TikTokTornado", "SnapMaster", "TweetTrendsetter",
"ChatChampion", "HashtagHero", "EmojiEnthusiast", "StoryStylist", "SelfieStar", "FilterFanatic",
"VlogVirtuoso", "Memelord", "InfluencerInsider", "StreamSupreme", "GeekyGizmo", "CodeCommander",
"JavaJuggernaut", "ByteNinja", "SyntaxSamurai", "ClassyCoder", "ObjectOmnipotent", "LoopLegend",
"VariableVirtuoso", "DebugDemon", "CompilerCrusader", "PixelProdigy", "VirtualVoyager", "AlgorithmAce",
"DataDynamo", "ExceptionExpert", "BugBuster", "SyntaxSorcerer", "CodeCrusader", "JavaJester",
"NerdyNavigator", "CryptoCaptain", "SocialButterfly", "AppArchitect", "WebWizard", "FunctionFreak",
"PixelArtist", "CyberPhantom", "HackHero", "CacheChampion", "ScreenSage", "WebWeaver", "LogicLover",
"BitBlazer", "NetworkNomad", "ProtocolPioneer", "BinaryBoss", "StackSultan", "SocialScribe", "RenderRuler",
"ScriptSorcerer", "HTMLHero", "PixelProwler", "FrameFreak", "DataDreamer", "BotBuilder", "ByteBishop",
"KeyboardKnight", "DesignDaredevil", "JavaJuggler", "SyntaxStrategist", "TechTactician", "ProgramProdigy",
"BinaryBard", "PixelPoet", "GigabyteGuru", "TechTrekker", "NetworkNinja", "DataDetective", "MatrixMaster",
"CodeConductor", "AppAlchemist", "ServerSage", "ClusterChampion", "ScriptSensei", "KeyboardKicker",
"CacheCrafter", "SocialSpark", "BinaryBeast", "CodeConnoisseur", "BitBrain", "VirtualVanguard",
"SystemSculptor", "RenderRogue", "CryptoConqueror", "MachineMonarch", "PixelPal", "CompilerCaptain",
"BitBuilder", "TechTitan", "CloudConqueror", "EchoExplorer", "FunctionFanatic", "RobotRanger");
public static final List<String> NAME_OF_GAMES = List.of("Call of Duty: Warzone", "Counter-Strike 2", "Battlefield 2042",
"Overwatch 2", "Team Fortress 2", "Halo Infinite", "Apex Legends", "Rainbow Six Siege", "Valorant",
"Fortnite", "PUBG: Battlegrounds", "Destiny 2", "Titanfall 2", "Splatoon 3", "Gears of War 5",
"Left 4 Dead 2", "Dota 2", "League of Legends", "Minecraft (Bedrock/Java - multiplayer)", "Rust",
"Escape from Tarkov", "DayZ", "Hell Let Loose", "Hunt: Showdown", "Chivalry 2", "Payday 3", "War Thunder",
"Enlisted", "World of Tanks", "Sea of Thieves");
public static String randomGameName() {
return randomElementFrom(NAME_OF_GAMES);
}
public static String randomNick() {
return randomElementFrom(PLAYER_NICKS);
}
public static String randomFistName() {
return randomElementFrom(FIRST_NAMES);
}
public static String randomLastName() {
return randomElementFrom(LAST_NAMES);
}
public static final List<String> COURSE_NAMES = List.of("Java 1", "Java 2", "C# 1", "C# 2", "Python", "Databáze I",
"Databáze II", "Funkcionální programování", "OOP", "PS", "APPS", "SWI");
public static String generateCompanyName() {
StringBuilder name = new StringBuilder();
int numberOfWords = RANDOM.nextInt(2) + 1;
for (int j = 0; j < numberOfWords; j++) {
name.append(randomElementFrom(COMPANY_NAMES));
if (j < numberOfWords - 1) {
name.append(" ");
}
}
return name.toString();
}
public static String generateAddress() {
return String.format("%s %d, %s, %s", randomElementFrom(STREETS), RANDOM.nextInt(99) + 1,
randomElementFrom(CITIES), randomElementFrom(POST_NUMBER));
}
public static <T> T randomElementFrom(List<T> list) {
return randomElementFrom(list, RANDOM);
}
public static <T> T random(T[] array) {
return array[RANDOM.nextInt(array.length)];
}
public static <T> T randomElementFrom(List<T> list, Random r) {
if (list.isEmpty()) {
return null;
}
return list.get(r.nextInt(list.size()));
}
public static LocalDate generatePreviousDate() {
return LocalDate.of(LocalDate.now().getYear() - RANDOM.nextInt(80), RANDOM.nextInt(12) + 1, 1)
.plusDays(RANDOM.nextInt(31));
}
public static LocalDate generateDateInFuture() {
return LocalDate.now().plusDays(RANDOM.nextInt(400));
}
public static LocalDateTime generatePreviousDateTime() {
return LocalDateTime.now().minusMinutes(RANDOM.nextInt(100000));
}
private Tools() {
/* hide public one - nothing to do */
}
}
package lab.data;
package lab.data;
import java.util.List;
import jakarta.persistence.Entity;
import lab.Tools;
import lab.data.PlatformGame.PlatformType;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString(callSuper = true)
public class FirstPersonShooter extends Game{
private FPSType fpsType;
private int playersCount;
enum FPSType{
DEATHMATCH, TEAM_DEATHMATCH, KING_OF_THE_HILL, ASSAULT, BATTLE_ROYALE, INFECTION;
}
public FirstPersonShooter(Long id, String name, List<Score> scores, FPSType fpsType, int playersCount) {
super(id, name, scores);
this.fpsType = fpsType;
this.playersCount = playersCount;
}
public static FirstPersonShooter generate() {
return new FirstPersonShooter(null, Tools.randomGameName(), null, Tools.random(FPSType.values()), Tools.random(new Integer[]{1,2,5,10,20,50,100}));
}
}
package lab.data;
import java.util.List;
import lab.Tools;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
@Builder(toBuilder = true)
public class Game implements MyEntity{
private Long id;
private String name;
private List<Score> scores;
public static Game generate() {
return new Game(null, Tools.randomGameName(), null);
}
public static Game generateAny() {
return switch (Tools.RANDOM.nextInt(3)) {
case 0 -> generate();
case 1 -> PlatformGame.generate();
case 2 -> FirstPersonShooter.generate();
default -> generate();
};
}
}
package lab.data; package lab.data;
public enum Level { public interface MyEntity {
EASY, MEDIUM, HARD;
Long getId();
} }
package lab.data;
import java.util.List;
import lab.Tools;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString(callSuper = true)
public class PlatformGame extends Game{
private boolean retro;
private PlatformType platformType;
enum PlatformType{
SINGLE_SCREEN, SCROLLING;
}
public PlatformGame(Long id, String name, List<Score> scores, boolean retro, PlatformType platformType) {
super(id, name, scores);
this.retro = retro;
this.platformType = platformType;
}
public static PlatformGame generate() {
return new PlatformGame(null, Tools.randomGameName(), null, Tools.RANDOM.nextBoolean(), Tools.random(PlatformType.values()));
}
}
package lab.data;
import java.util.List;
import lab.Tools;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
@Builder(toBuilder = true)
public class Player implements MyEntity{
private Long id;
private String firstName;
private String lastName;
private String nick;
private List<Score> scores;
public static Player generate() {
return new Player(null, Tools.randomFistName(), Tools.randomLastName(), Tools.randomNick(), null);
}
}
package lab.data; package lab.data;
import java.util.Random; import java.util.List;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType; import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated; import jakarta.persistence.Enumerated;
import jakarta.persistence.GeneratedValue; import lab.Tools;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter; import lombok.Setter;
import lombok.ToString; import lombok.ToString;
@Entity
@Getter @Getter
@Setter @Setter
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
@ToString @ToString
@Builder(toBuilder = true) @Builder(toBuilder = true)
public class Score { public class Score implements MyEntity{
private static final Random RANDOM = new Random();
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id; private Long id;
private String name;
private int points; private int points;
@Enumerated(EnumType.STRING) @Enumerated(EnumType.STRING)
private Level level; private Difficult level;
private Player player;
private Game game;
public static Score generate() { public static Score generate(List<Player> players, List<Game> games) {
return new Score(null, getRandomNick(), RANDOM.nextInt(50, 300), Level.values()[RANDOM.nextInt(Level.values().length)]); return new Score(null, Tools.RANDOM.nextInt(100, 2000), Tools.random(Difficult.values()), Tools.randomElementFrom(players), Tools.randomElementFrom(games));
} }
public static final String[] nicks = { "CyberSurfer", "PixelPioneer", "SocialSavvy", "DigitalDynamo", "ByteBuddy", "InstaGuru", public enum Difficult {
"TikTokTornado", "SnapMaster", "TweetTrendsetter", "ChatChampion", "HashtagHero", "EmojiEnthusiast", EASY, MEDIUM, HARD;
"StoryStylist", "SelfieStar", "FilterFanatic", "VlogVirtuoso", "Memelord", "InfluencerInsider",
"StreamSupreme", "GeekyGizmo", "CodeCommander", "JavaJuggernaut", "ByteNinja", "SyntaxSamurai",
"ClassyCoder", "ObjectOmnipotent", "LoopLegend", "VariableVirtuoso", "DebugDemon", "CompilerCrusader",
"PixelProdigy", "VirtualVoyager", "AlgorithmAce", "DataDynamo", "ExceptionExpert", "BugBuster",
"SyntaxSorcerer", "CodeCrusader", "JavaJester", "NerdyNavigator", "CryptoCaptain", "SocialButterfly",
"AppArchitect", "WebWizard", "FunctionFreak", "PixelArtist", "CyberPhantom", "HackHero", "CacheChampion",
"ScreenSage", "WebWeaver", "LogicLover", "BitBlazer", "NetworkNomad", "ProtocolPioneer", "BinaryBoss",
"StackSultan", "SocialScribe", "RenderRuler", "ScriptSorcerer", "HTMLHero", "PixelProwler", "FrameFreak",
"DataDreamer", "BotBuilder", "ByteBishop", "KeyboardKnight", "DesignDaredevil", "JavaJuggler",
"SyntaxStrategist", "TechTactician", "ProgramProdigy", "BinaryBard", "PixelPoet", "GigabyteGuru",
"TechTrekker", "NetworkNinja", "DataDetective", "MatrixMaster", "CodeConductor", "AppAlchemist",
"ServerSage", "ClusterChampion", "ScriptSensei", "KeyboardKicker", "CacheCrafter", "SocialSpark",
"BinaryBeast", "CodeConnoisseur", "BitBrain", "VirtualVanguard", "SystemSculptor", "RenderRogue",
"CryptoConqueror", "MachineMonarch", "PixelPal", "CompilerCaptain", "BitBuilder", "TechTitan",
"CloudConqueror", "EchoExplorer", "FunctionFanatic", "RobotRanger" };
public static String getRandomNick() {
return nicks[RANDOM.nextInt(nicks.length)];
} }
} }
package lab.game;
public enum AngleChange {
UP, DOWN;
}
package lab.game;
import javafx.geometry.Point2D;
import javafx.geometry.Rectangle2D;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.paint.Color;
public class Bullet extends WorldEntity implements Collisionable{
private static final double SIZE = 20;
protected final Point2D acceleration;
protected Point2D velocity;
public Bullet(World world, Point2D position, Point2D velocity, Point2D acceleration) {
super(world, position);
this.velocity = velocity;
this.acceleration = acceleration;
}
@Override
public void drawInternal(GraphicsContext gc) {
gc.setFill(Color.SILVER);
gc.fillOval(position.getX(), position.getY(), SIZE, SIZE);
}
@Override
public void simulate(double deltaT) {
position = position.add(velocity.multiply(deltaT));
velocity = velocity.add(acceleration.multiply(deltaT));
}
@Override
public Rectangle2D getBoundingBox() {
return new Rectangle2D(position.getX(), position.getY(), SIZE, SIZE);
}
@Override
public boolean intersect(Rectangle2D another) {
return getBoundingBox().intersects(another);
}
@Override
public void hitBy(Collisionable another) {
}
public void setVelocity(Point2D velocity) {
this.velocity = velocity;
}
}
package lab.game;
import java.util.ArrayList;
import java.util.List;
import javafx.geometry.Point2D;
import javafx.geometry.Rectangle2D;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.Image;
public class BulletAnimated extends Bullet {
private static final double SIZE = 40;
private final Point2D initVelocity;
private Cannon cannon;
private static Image image = new Image(BulletAnimated.class.getResourceAsStream("fireball-transparent.gif"));
private List<HitListener> hitListeners = new ArrayList<>();
public BulletAnimated(World world, Cannon cannon, Point2D position, Point2D velocity, Point2D acceleration) {
super(world, position, velocity, acceleration);
this.initVelocity = velocity;
this.cannon = cannon;
}
@Override
public void drawInternal(GraphicsContext gc) {
gc.drawImage(image, getPosition().getX(), getPosition().getY(), SIZE, SIZE);
gc.strokeRect(position.getX(), position.getY(), SIZE, SIZE);
}
@Override
public void hitBy(Collisionable another) {
if (another instanceof Ufo) {
world.remove(this);
fireUfoDestroyed();
}
}
public void reload() {
position = cannon.getPosition();
velocity = new Point2D(0, 0);
}
public boolean addHitListener(HitListener e) {
return hitListeners.add(e);
}
public boolean removeHitListener(HitListener o) {
return hitListeners.remove(o);
}
private void fireUfoDestroyed() {
for (HitListener hitListener : hitListeners) {
hitListener.ufoDestroyed();
}
}
}
\ No newline at end of file
package lab.game;
import javafx.geometry.Point2D;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.paint.Color;
import javafx.scene.transform.Affine;
import javafx.scene.transform.Transform;
public class Cannon extends WorldEntity{
private static final double LENGTH = 60;
private static final double WIDTH = 15;
private double angle;
private double angleDelta = -25;
public Cannon(World world, Point2D position, double angle) {
super(world, position);
this.angle = angle;
}
@Override
public void drawInternal(GraphicsContext gc) {
gc.transform(new Affine(Transform.rotate(angle, position.getX(), position.getY() + WIDTH / 2)));
gc.setFill(Color.BROWN);
gc.fillRect(position.getX(), position.getY(), LENGTH, WIDTH);
}
@Override
public void simulate(double deltaT) {
// angle += angleDelta * deltaT;
// if (angle >= 0 || angle <= -90) {
// angleDelta = -angleDelta;
// }
}
public double getAngle() {
return angle;
}
public void setAngle(double angle) {
this.angle = -angle;
}
}
package lab.game;
import javafx.geometry.Rectangle2D;
public interface Collisionable {
Rectangle2D getBoundingBox();
boolean intersect(Rectangle2D another);
void hitBy(Collisionable another);
}
package lab.game;
import javafx.scene.canvas.GraphicsContext;
public interface DrawableSimulable {
void draw(GraphicsContext gc);
void simulate(double deltaT);
}
package lab.game;
import javafx.animation.AnimationTimer;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
public class DrawingThread extends AnimationTimer {
private final Canvas canvas;
private final GraphicsContext gc;
private final World world;
private long lastTime;
public DrawingThread(Canvas canvas) {
this.canvas = canvas;
this.gc = canvas.getGraphicsContext2D();
world = new World(canvas.getWidth(), canvas.getHeight());
lastTime = System.nanoTime();
}
/**
* Draws objects into the canvas. Put you code here.
*/
@Override
public void handle(long now) {
double deltaT = (now - lastTime) / 1e9;
// call draw on world
this.world.draw(gc);
// call simulate on world
this.world.simulate(deltaT);
lastTime = now;
}
public World getWorld() {
return world;
}
}
package lab.game;
public enum ForceChange {
UP, DOWN;
}
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment