From af68db873cbece0aeebcfa000a1756eb8657f475 Mon Sep 17 00:00:00 2001 From: Cagdas Date: Wed, 18 Nov 2020 21:47:13 +0300 Subject: [PATCH 1/7] Add mvn exec:java target --- README.md | 6 ++++++ pom.xml | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/README.md b/README.md index c2c0ff8..68885d3 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,12 @@ You will need a Java JDK 8+ and maven 3+. Execute **mvn clean package assembly:single** to build the release package. +# How to run it ? + +**mvn clean** +**mvn package** +**mvn exec:java** + ## How to play ? - SPACE - Start a new game diff --git a/pom.xml b/pom.xml index c8fd6d0..9e992f8 100644 --- a/pom.xml +++ b/pom.xml @@ -111,6 +111,14 @@ @{project.version} + + org.codehaus.mojo + exec-maven-plugin + 1.2.1 + + spypunk.tetris.Main + + From 80665808fc63a4f0bced13ba191fdce07c8709b1 Mon Sep 17 00:00:00 2001 From: Cagdas Date: Wed, 18 Nov 2020 21:54:18 +0300 Subject: [PATCH 2/7] Update jdk14 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 9bcf999..42fe87f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,3 @@ language: java jdk: - - oraclejdk8 + - oraclejdk14 From 5586e523dffc58a051296419b16b02b3441c0244 Mon Sep 17 00:00:00 2001 From: Cagdas Date: Sun, 6 Dec 2020 18:10:17 +0300 Subject: [PATCH 3/7] Minor format update --- README.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 68885d3..a3303fa 100644 --- a/README.md +++ b/README.md @@ -19,10 +19,14 @@ You will need a Java JDK 8+ and maven 3+. Execute **mvn clean package assembly:single** to build the release package. # How to run it ? +``` +mvn clean -**mvn clean** -**mvn package** -**mvn exec:java** +mvn package + +mvn exec:java + +``` ## How to play ? From 82b8a866c2ed0dae3d0c8397f726d6f7e108e94e Mon Sep 17 00:00:00 2001 From: MErenB Date: Sat, 10 Apr 2021 21:55:42 +0300 Subject: [PATCH 4/7] GUI for choosing player count added. --- src/main/java/spypunk/tetris/Main.java | 50 ++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/src/main/java/spypunk/tetris/Main.java b/src/main/java/spypunk/tetris/Main.java index 810e491..5920958 100644 --- a/src/main/java/spypunk/tetris/Main.java +++ b/src/main/java/spypunk/tetris/Main.java @@ -8,9 +8,12 @@ package spypunk.tetris; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.io.File; -import javax.swing.JOptionPane; +import javax.swing.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -44,8 +47,8 @@ private Main() { public static void main(final String[] args) { try { - final Injector injector = Guice.createInjector(new TetrisModule()); - injector.getInstance(TetrisController.class).start(); + new PlayerChoosingScreen(); + } catch (CreationException | ConfigurationException | ProvisionException e) { LOGGER.error(e.getMessage(), e); SwingUtils.doInAWTThread(Main::showErrorDialog); @@ -57,5 +60,46 @@ private static void showErrorDialog() { ERROR_MESSAGE, ERROR_TITLE, JOptionPane.ERROR_MESSAGE); + } + + private static class PlayerChoosingScreen{ + public PlayerChoosingScreen() { + JFrame mainFrame = new JFrame("Select Player Number"); + mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + mainFrame.setSize(400,200); + + mainFrame.getContentPane().setLayout(new FlowLayout()); + //todo debug etmek icin maven sekmesini ac ordan exec:java yı debug et! + JButton onePlayer = new JButton("One Player"); + onePlayer.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + final Injector injector = Guice.createInjector(new TetrisModule()); + injector.getInstance(TetrisController.class).start(); + mainFrame.dispose(); + } + }); + JButton twoPlayers = new JButton("Two Players"); + twoPlayers.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + final Injector injector = Guice.createInjector(new TetrisModule()); + injector.getInstance(TetrisController.class).start(); + //new KeyConfigScreen(); + mainFrame.dispose(); + + } + }); + + mainFrame.add(onePlayer); + mainFrame.add(twoPlayers); + + mainFrame.setLocationRelativeTo(null); + mainFrame.setVisible(true); + } + + + + } } From 68067c3f68590357c26b82d503c7a60fc59ab4d2 Mon Sep 17 00:00:00 2001 From: MErenB Date: Sat, 10 Apr 2021 21:56:21 +0300 Subject: [PATCH 5/7] GUI for key configuration created but key config is not implemented. --- .../tetris/ui/view/KeyConfigScreen.java | 121 ++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 src/main/java/spypunk/tetris/ui/view/KeyConfigScreen.java diff --git a/src/main/java/spypunk/tetris/ui/view/KeyConfigScreen.java b/src/main/java/spypunk/tetris/ui/view/KeyConfigScreen.java new file mode 100644 index 0000000..d64ba94 --- /dev/null +++ b/src/main/java/spypunk/tetris/ui/view/KeyConfigScreen.java @@ -0,0 +1,121 @@ +package spypunk.tetris.ui.view; + +//import sun.text.resources.cldr.ext.FormatData_ia; + +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Arrays; + +public class KeyConfigScreen { + private JFrame mainFrame; + + private String[] keysForPlayer1; + private String[] keysForPlayer2; + + public KeyConfigScreen() { + + mainFrame = new JFrame("Configure Key Bindings"); + mainFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + + JPanel mainPanel = new JPanel(); + mainPanel.setLayout(new BoxLayout(mainPanel,BoxLayout.PAGE_AXIS)); + //mainFrame.getContentPane().setLayout(new BoxLayout(mainFrame,BoxLayout.PAGE_AXIS)); + + + mainPanel.add(new JLabel("Oyuncularin tuslarini ayarlayin. Tuslarda cakisma olursa oyun baslamaz!")); + JLabel result = new JLabel("Tuslari girin:"); + mainPanel.add(result); + + mainPanel.add(new JLabel("Player 1: Left")); + JTextField tf1Left = new JTextField(); + mainPanel.add(tf1Left); + mainPanel.add(new JLabel("Player 1: Right")); + JTextField tf1Right = new JTextField(); + mainPanel.add(tf1Right); + mainPanel.add(new JLabel("Player 1: Down")); + JTextField tf1Down = new JTextField(); + mainPanel.add(tf1Down); + mainPanel.add(new JLabel("Player 1: Rotate")); + JTextField tf1Rotate = new JTextField(); + mainPanel.add(tf1Rotate); + mainPanel.add(new JLabel("Player 1: Hard Drop")); + JTextField tf1HardDrop = new JTextField(); + mainPanel.add(tf1HardDrop); + + mainPanel.add(new JLabel("Player 2: Left")); + JTextField tf2Left = new JTextField(); + mainPanel.add(tf2Left); + mainPanel.add(new JLabel("Player 2: Right")); + JTextField tf2Right = new JTextField(); + mainPanel.add(tf2Right); + mainPanel.add(new JLabel("Player 2: Down")); + JTextField tf2Down = new JTextField(); + mainPanel.add(tf2Down); + mainPanel.add(new JLabel("Player 2: Rotate")); + JTextField tf2Rotate = new JTextField(); + mainPanel.add(tf2Rotate); + mainPanel.add(new JLabel("Player 2: Hard Drop")); + JTextField tf2HardDrop = new JTextField(); + mainPanel.add(tf2HardDrop); + + JButton okButton = new JButton("Ok"); + okButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + String[] allKeys = new String[10]; + + allKeys[0] = tf1Left.getText(); + allKeys[1] = tf1Right.getText(); + allKeys[2] = tf1Down.getText(); + allKeys[3] = tf1Rotate.getText(); + allKeys[4] = tf1HardDrop.getText(); + + allKeys[5] = tf2Left.getText(); + allKeys[6] = tf2Right.getText(); + allKeys[7] = tf2Down.getText(); + allKeys[8] = tf2Rotate.getText(); + allKeys[9] = tf2HardDrop.getText(); + + boolean hasCollision = false; + for (int i = 0; i < allKeys.length; i++) { + for (int j = i+1; j < allKeys.length; j++) { + if (allKeys[i].equals(allKeys[j])) { + hasCollision = true; + break; + } + } + } + + if (!hasCollision) { + String[] keys1 = new String[5]; + String[] keys2 = new String[5]; + + System.arraycopy(allKeys,0,keys1,0,5); + System.arraycopy(allKeys,5,keys2,0,5); + + keysForPlayer1 = keys1; + keysForPlayer2 = keys2; + + //tetrisControllerInputHandler classinda key bindingleri. + //todo key configlerini yap. + //todo 2 kisilik oyunu ac. + mainFrame.dispose(); + } + else { + result.setText("Tuslarda cakisma oldu. Lutfen tekrar deneyin."); + } + } + }); + + mainPanel.add(okButton); + + mainFrame.getContentPane().add(mainPanel); + + mainFrame.setSize(600,600); + mainFrame.setLocationRelativeTo(null); + mainFrame.setVisible(true); + } + + +} From 1a091a12fcc2a2dc7f7f5c524d9ebf66cea85496 Mon Sep 17 00:00:00 2001 From: MErenB Date: Sun, 11 Apr 2021 23:36:54 +0300 Subject: [PATCH 6/7] Classes are created for co-op playing. --- .../spypunk/tetris/guice/TetrisModule2.java | 120 +++++++++++ .../TetrisControllerGameLoopImpl2.java | 106 ++++++++++ .../tetris/ui/view/Tetris2PlayerView.java | 65 ++++++ .../tetris/ui/view/TetrisMainView2Impl.java | 197 ++++++++++++++++++ 4 files changed, 488 insertions(+) create mode 100644 src/main/java/spypunk/tetris/guice/TetrisModule2.java create mode 100644 src/main/java/spypunk/tetris/ui/controller/gameloop/TetrisControllerGameLoopImpl2.java create mode 100644 src/main/java/spypunk/tetris/ui/view/Tetris2PlayerView.java create mode 100644 src/main/java/spypunk/tetris/ui/view/TetrisMainView2Impl.java diff --git a/src/main/java/spypunk/tetris/guice/TetrisModule2.java b/src/main/java/spypunk/tetris/guice/TetrisModule2.java new file mode 100644 index 0000000..60c478a --- /dev/null +++ b/src/main/java/spypunk/tetris/guice/TetrisModule2.java @@ -0,0 +1,120 @@ +/* + * Copyright © 2016-2017 spypunk + * + * This work is free. You can redistribute it and/or modify it under the + * terms of the Do What The Fuck You Want To Public License, Version 2, + * as published by Sam Hocevar. See the COPYING file for more details. + */ + +package spypunk.tetris.guice; + +import java.io.IOException; +import java.io.InputStream; +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; +import java.net.URI; +import java.util.Properties; + +import javax.inject.Inject; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.inject.AbstractModule; +import com.google.inject.BindingAnnotation; +import com.google.inject.Provides; + +import spypunk.tetris.Main; +import spypunk.tetris.exception.TetrisException; +import spypunk.tetris.factory.ShapeFactory; +import spypunk.tetris.factory.ShapeFactoryImpl; +import spypunk.tetris.model.Tetris; +import spypunk.tetris.service.TetrisService; +import spypunk.tetris.service.TetrisServiceImpl; +import spypunk.tetris.sound.cache.SoundClipCache; +import spypunk.tetris.sound.cache.SoundClipCacheImpl; +import spypunk.tetris.sound.service.SoundService; +import spypunk.tetris.sound.service.SoundServiceImpl; +import spypunk.tetris.ui.cache.ImageCache; +import spypunk.tetris.ui.cache.ImageCacheImpl; +import spypunk.tetris.ui.controller.TetrisController; +import spypunk.tetris.ui.controller.TetrisControllerImpl; +import spypunk.tetris.ui.controller.command.cache.TetrisControllerCommandCache; +import spypunk.tetris.ui.controller.command.cache.TetrisControllerCommandCacheImpl; +import spypunk.tetris.ui.controller.event.TetrisControllerTetrisEventHandler; +import spypunk.tetris.ui.controller.event.TetrisControllerTetrisEventHandlerImpl; +import spypunk.tetris.ui.controller.gameloop.TetrisControllerGameLoop; +import spypunk.tetris.ui.controller.gameloop.TetrisControllerGameLoopImpl; +import spypunk.tetris.ui.controller.input.TetrisControllerInputHandler; +import spypunk.tetris.ui.controller.input.TetrisControllerInputHandlerImpl; +import spypunk.tetris.ui.font.cache.FontCache; +import spypunk.tetris.ui.font.cache.FontCacheImpl; +import spypunk.tetris.ui.view.TetrisMainView; +import spypunk.tetris.ui.view.TetrisMainView2Impl; +import spypunk.tetris.ui.view.TetrisMainViewImpl; + +public class TetrisModule2 extends AbstractModule { + + private static final Logger LOGGER = LoggerFactory.getLogger(Main.class); + + private static final String NAME_KEY = "name"; + + private static final String VERSION_KEY = "version"; + + private static final String URL_KEY = "url"; + + private static final String TETRIS_PROPERTIES = "/tetris.properties"; + + private final Tetris tetris; + + + public TetrisModule2() { + String name; + String version; + URI uri; + + try (InputStream inputStream = TetrisModule.class.getResource(TETRIS_PROPERTIES).openStream()) { + final Properties properties = new Properties(); + + properties.load(inputStream); + + name = properties.getProperty(NAME_KEY); + version = properties.getProperty(VERSION_KEY); + uri = URI.create(properties.getProperty(URL_KEY)); + } catch (final IOException e) { + LOGGER.error(e.getMessage(), e); + throw new TetrisException(e); + } + + tetris = new Tetris(name, version, uri); + + } + + @Override + protected void configure() { + bind(TetrisService.class).to(TetrisServiceImpl.class); + bind(ShapeFactory.class).to(ShapeFactoryImpl.class); + bind(TetrisController.class).to(TetrisControllerImpl.class); + bind(ImageCache.class).to(ImageCacheImpl.class); + bind(FontCache.class).to(FontCacheImpl.class); + bind(TetrisControllerCommandCache.class).to(TetrisControllerCommandCacheImpl.class); + bind(SoundService.class).to(SoundServiceImpl.class); + bind(SoundClipCache.class).to(SoundClipCacheImpl.class); + bind(TetrisControllerInputHandler.class).to(TetrisControllerInputHandlerImpl.class); + bind(TetrisControllerTetrisEventHandler.class).to(TetrisControllerTetrisEventHandlerImpl.class); + bind(TetrisControllerGameLoop.class).to(TetrisControllerGameLoopImpl.class); + bind(TetrisMainView.class).to(TetrisMainView2Impl.class); + } + + @Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD }) + @BindingAnnotation + public @interface TetrisProvider { + } + + @Provides + @TetrisProvider + @Inject + public Tetris getTetris() { + return tetris; + } +} diff --git a/src/main/java/spypunk/tetris/ui/controller/gameloop/TetrisControllerGameLoopImpl2.java b/src/main/java/spypunk/tetris/ui/controller/gameloop/TetrisControllerGameLoopImpl2.java new file mode 100644 index 0000000..fad3809 --- /dev/null +++ b/src/main/java/spypunk/tetris/ui/controller/gameloop/TetrisControllerGameLoopImpl2.java @@ -0,0 +1,106 @@ +/* +package spypunk.tetris.ui.controller.gameloop; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import spypunk.tetris.service.TetrisService; +import spypunk.tetris.ui.controller.event.TetrisControllerTetrisEventHandler; +import spypunk.tetris.ui.controller.input.TetrisControllerInputHandler; +import spypunk.tetris.ui.view.TetrisMainView; + +import javax.inject.Inject; +import javax.swing.*; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class TetrisControllerGameLoopImpl2 implements TetrisControllerGameLoop, Runnable{ + + + private static final Logger LOGGER = LoggerFactory.getLogger(TetrisControllerGameLoopImpl.class); + + private static final int TICKS_PER_SECOND = 60; + + private static final int SKIP_TICKS = 1000 / TICKS_PER_SECOND; + + private final ExecutorService executorService; + + private final TetrisControllerInputHandler tetrisControllerInputHandler; + + private final TetrisControllerTetrisEventHandler tetrisControllerTetrisEventHandler; + + private final TetrisService tetrisService; + //todo tetrismainvievimpl2 yu bindliyecekisn 2 kisilik icin. + private final TetrisMainView tetrisMainView; + + private final JPanel currentPanel; + + private volatile boolean running; + + @Inject + public TetrisControllerGameLoopImpl2(final TetrisService tetrisService, + final TetrisControllerInputHandler tetrisControllerInputHandler, + final TetrisControllerTetrisEventHandler tetrisControllerTetrisEventHandler, + final TetrisMainView tetrisMainView) { + + this.tetrisService = tetrisService; + this.tetrisControllerInputHandler = tetrisControllerInputHandler; + this.tetrisControllerTetrisEventHandler = tetrisControllerTetrisEventHandler; + this.tetrisMainView = tetrisMainView; + this.currentPanel = tetrisMainView.getJPanel(); + + executorService = Executors + .newSingleThreadExecutor(runnable -> new Thread(runnable, "TetrisControllerGameLoop")); + } + + @Override + public void start() { + running = true; + executorService.execute(this); + } + + @Override + public void stop() { + running = false; + executorService.shutdown(); + } + + @Override + public void run() { + tetrisMainView.show(); + + while (running) { + long currentTick = System.currentTimeMillis(); + + update(); + + for (final long nextTick = currentTick + SKIP_TICKS; currentTick < nextTick; currentTick = System + .currentTimeMillis()) { + waitMore(); + } + } + + tetrisMainView.hide(); + } + + private void update() { + tetrisControllerInputHandler.handleInputs(); + + tetrisService.update(); + + tetrisControllerTetrisEventHandler.handleEvents(); + + tetrisMainView.update(); + } + + private void waitMore() { + try { + Thread.sleep(1); + } catch (final InterruptedException e) { + LOGGER.error(e.getMessage(), e); + Thread.currentThread().interrupt(); + stop(); + } + } + +} +*/ diff --git a/src/main/java/spypunk/tetris/ui/view/Tetris2PlayerView.java b/src/main/java/spypunk/tetris/ui/view/Tetris2PlayerView.java new file mode 100644 index 0000000..82866df --- /dev/null +++ b/src/main/java/spypunk/tetris/ui/view/Tetris2PlayerView.java @@ -0,0 +1,65 @@ +package spypunk.tetris.ui.view; + +import spypunk.tetris.guice.TetrisModule; +import spypunk.tetris.guice.TetrisModule2; +import spypunk.tetris.model.Tetris; +import spypunk.tetris.ui.cache.ImageCache; +import spypunk.tetris.ui.controller.TetrisController; +import spypunk.tetris.ui.font.cache.FontCache; + +import javax.inject.Inject; +import javax.inject.Named; +import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import java.awt.*; + +public class Tetris2PlayerView extends AbstractView implements Runnable { + + private final JFrame frame = new JFrame("Tetris Co-op Mode"); + + + @Inject + public Tetris2PlayerView(final TetrisController tetrisController1, final TetrisController tetrisController2, + final FontCache fontCache, + final ImageCache imageCache, + final @TetrisModule.TetrisProvider Tetris tetris1 , final @TetrisModule.TetrisProvider Tetris tetris2) { + super(fontCache,imageCache,tetris1); + + frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + //frame.setResizable(false); + frame.setSize(1600,800); + + + frame.getContentPane().setLayout(new BorderLayout()); + frame.add(tetrisController1.getJPanel(),BorderLayout.EAST); + frame.add(tetrisController2.getJPanel(),BorderLayout.WEST); + + tetrisController1.start(); + tetrisController2.start(); + + frame.addWindowListener(new TetrisMainView2Impl.TetrisViewWindowListener(tetrisController1)); + frame.addKeyListener(new TetrisMainView2Impl.TetrisViewKeyAdapter(tetrisController1)); + + frame.addWindowListener(new TetrisMainView2Impl.TetrisViewWindowListener(tetrisController2)); + frame.addKeyListener(new TetrisMainView2Impl.TetrisViewKeyAdapter(tetrisController2)); + + frame.setVisible(true); + frame.setLocationRelativeTo(null); + + } + + + @Override + public void run() { + while (true) { + try { + Thread.sleep(10); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + frame.repaint(); + } + } +} diff --git a/src/main/java/spypunk/tetris/ui/view/TetrisMainView2Impl.java b/src/main/java/spypunk/tetris/ui/view/TetrisMainView2Impl.java new file mode 100644 index 0000000..40d4d0f --- /dev/null +++ b/src/main/java/spypunk/tetris/ui/view/TetrisMainView2Impl.java @@ -0,0 +1,197 @@ +/* + * Copyright © 2016-2017 spypunk + * + * This work is free. You can redistribute it and/or modify it under the + * terms of the Do What The Fuck You Want To Public License, Version 2, + * as published by Sam Hocevar. See the COPYING file for more details. + */ + +package spypunk.tetris.ui.view; + +import static spypunk.tetris.ui.constants.TetrisUIConstants.BLOCK_SIZE; +import static spypunk.tetris.ui.constants.TetrisUIConstants.DEFAULT_FONT_COLOR; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.net.URI; + +import javax.inject.Inject; +import javax.inject.Singleton; +import javax.swing.BorderFactory; +import javax.swing.ImageIcon; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.WindowConstants; + +import spypunk.tetris.guice.TetrisModule.TetrisProvider; +import spypunk.tetris.model.Tetris; +import spypunk.tetris.ui.cache.ImageCache; +import spypunk.tetris.ui.controller.TetrisController; +import spypunk.tetris.ui.font.cache.FontCache; +import spypunk.tetris.ui.icon.Icon; +import spypunk.tetris.ui.util.SwingUtils; + +@Singleton +public class TetrisMainView2Impl extends AbstractView implements TetrisMainView { + + private final JFrame frame; + + private final JLabel muteLabel; + + private final ImageIcon muteImageIcon; + + private final ImageIcon unmuteImageIcon; + + public static final class TetrisViewWindowListener extends WindowAdapter { + + private final TetrisController tetrisController; + + TetrisViewWindowListener(final TetrisController tetrisController) { + this.tetrisController = tetrisController; + } + + @Override + public void windowClosed(final WindowEvent e) { + tetrisController.onWindowClosed(); + } + } + + public static final class TetrisViewKeyAdapter extends KeyAdapter { + + private final TetrisController tetrisController; + + TetrisViewKeyAdapter(final TetrisController tetrisController) { + this.tetrisController = tetrisController; + } + + @Override + public void keyPressed(final KeyEvent e) { + tetrisController.onKeyPressed(e.getKeyCode()); + } + + @Override + public void keyReleased(final KeyEvent e) { + tetrisController.onKeyReleased(e.getKeyCode()); + } + } + + private static final class URLLabelMouseAdapter extends MouseAdapter { + + private final TetrisController tetrisController; + + private final JLabel urlLabel; + + URLLabelMouseAdapter(final TetrisController tetrisController, final JLabel urlLabel) { + this.tetrisController = tetrisController; + this.urlLabel = urlLabel; + } + + @Override + public void mouseClicked(final MouseEvent e) { + tetrisController.onProjectURLClicked(); + } + + @Override + public void mouseEntered(final MouseEvent e) { + urlLabel.setForeground(Color.CYAN); + } + + @Override + public void mouseExited(final MouseEvent e) { + urlLabel.setForeground(DEFAULT_FONT_COLOR); + } + } + + @Inject + public TetrisMainView2Impl(final TetrisController tetrisController, + final FontCache fontCache, + final ImageCache imageCache, + final @TetrisProvider Tetris tetris) { + super(fontCache, imageCache, tetris); + + final TetrisStatisticsView tetrisStatisticsView = new TetrisStatisticsView(fontCache, imageCache, tetris); + final TetrisInfoView tetrisInfoView = new TetrisInfoView(fontCache, imageCache, tetris); + final TetrisGridView tetrisGridView = new TetrisGridView(fontCache, imageCache, tetris); + + muteImageIcon = new ImageIcon(imageCache.getIcon(Icon.MUTE)); + unmuteImageIcon = new ImageIcon(imageCache.getIcon(Icon.UNMUTE)); + + final URI projectURI = tetris.getProjectURI(); + + muteLabel = new JLabel(unmuteImageIcon); + + final JLabel urlLabel = new JLabel(projectURI.getHost() + projectURI.getPath()); + + urlLabel.setFont(fontCache.getURLFont()); + urlLabel.setForeground(DEFAULT_FONT_COLOR); + urlLabel.addMouseListener(new URLLabelMouseAdapter(tetrisController, urlLabel)); + + final JPanel bottomPanel = new JPanel(new BorderLayout()); + + bottomPanel.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); + bottomPanel.setBackground(Color.BLACK); + + bottomPanel.add(muteLabel, BorderLayout.WEST); + bottomPanel.add(urlLabel, BorderLayout.EAST); + + final JPanel centerPanel = new JPanel(new BorderLayout(BLOCK_SIZE, 0)); + + centerPanel.setBackground(Color.BLACK); + centerPanel.setBorder(BorderFactory.createEmptyBorder(BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE)); + + centerPanel.add(tetrisGridView.getComponent(), BorderLayout.CENTER); + centerPanel.add(tetrisStatisticsView.getComponent(), BorderLayout.WEST); + centerPanel.add(tetrisInfoView.getComponent(), BorderLayout.EAST); + + frame = new JFrame(tetris.getName() + " " + tetris.getVersion()); + + frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + frame.setLayout(new BorderLayout(0, 0)); + frame.setResizable(false); + frame.addWindowListener(new TetrisViewWindowListener(tetrisController)); + frame.addKeyListener(new TetrisViewKeyAdapter(tetrisController)); + frame.setIconImage(imageCache.getIcon(Icon.ICON)); + frame.setIgnoreRepaint(true); + + frame.add(centerPanel, BorderLayout.CENTER); + frame.add(bottomPanel, BorderLayout.SOUTH); + frame.pack(); + + frame.setLocationRelativeTo(null); + } + + @Override + public void show() { + setVisible(true); + } + + @Override + public void hide() { + setVisible(false); + } + + @Override + public void update() { + frame.repaint(); + } + + @Override + public void setMuted(final boolean muted) { + SwingUtils.doInAWTThread(() -> muteLabel.setIcon(muted ? muteImageIcon : unmuteImageIcon)); + } + + private void setVisible(final boolean visible) { + SwingUtils.doInAWTThread(() -> frame.setVisible(visible)); + } + + public JPanel getJPanel() { + return null; + } +} From 427e794cd66db5d5e24290de11bec138a0067c6e Mon Sep 17 00:00:00 2001 From: MErenB Date: Sun, 11 Apr 2021 23:37:09 +0300 Subject: [PATCH 7/7] Overall adjustments --- .../java/spypunk/tetris/guice/TetrisModule.java | 3 +++ .../tetris/ui/controller/TetrisController.java | 4 ++++ .../ui/controller/TetrisControllerImpl.java | 15 ++++++++++++++- .../spypunk/tetris/ui/view/KeyConfigScreen.java | 8 ++++++-- .../spypunk/tetris/ui/view/TetrisMainView.java | 4 ++++ .../tetris/ui/view/TetrisMainViewImpl.java | 4 ++++ 6 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/main/java/spypunk/tetris/guice/TetrisModule.java b/src/main/java/spypunk/tetris/guice/TetrisModule.java index a9f4d87..de4fef5 100644 --- a/src/main/java/spypunk/tetris/guice/TetrisModule.java +++ b/src/main/java/spypunk/tetris/guice/TetrisModule.java @@ -50,6 +50,7 @@ import spypunk.tetris.ui.font.cache.FontCache; import spypunk.tetris.ui.font.cache.FontCacheImpl; import spypunk.tetris.ui.view.TetrisMainView; +import spypunk.tetris.ui.view.TetrisMainView2Impl; import spypunk.tetris.ui.view.TetrisMainViewImpl; public class TetrisModule extends AbstractModule { @@ -66,6 +67,7 @@ public class TetrisModule extends AbstractModule { private final Tetris tetris; + public TetrisModule() { String name; String version; @@ -85,6 +87,7 @@ public TetrisModule() { } tetris = new Tetris(name, version, uri); + } @Override diff --git a/src/main/java/spypunk/tetris/ui/controller/TetrisController.java b/src/main/java/spypunk/tetris/ui/controller/TetrisController.java index 01f965d..0a2dd5d 100644 --- a/src/main/java/spypunk/tetris/ui/controller/TetrisController.java +++ b/src/main/java/spypunk/tetris/ui/controller/TetrisController.java @@ -8,6 +8,8 @@ package spypunk.tetris.ui.controller; +import javax.swing.*; + public interface TetrisController { void start(); @@ -19,4 +21,6 @@ public interface TetrisController { void onKeyPressed(int keyCode); void onKeyReleased(int keyCode); + + JPanel getJPanel(); } diff --git a/src/main/java/spypunk/tetris/ui/controller/TetrisControllerImpl.java b/src/main/java/spypunk/tetris/ui/controller/TetrisControllerImpl.java index 15245f4..b7e94e6 100644 --- a/src/main/java/spypunk/tetris/ui/controller/TetrisControllerImpl.java +++ b/src/main/java/spypunk/tetris/ui/controller/TetrisControllerImpl.java @@ -10,9 +10,11 @@ import javax.inject.Inject; import javax.inject.Singleton; +import javax.swing.*; import spypunk.tetris.ui.controller.gameloop.TetrisControllerGameLoop; import spypunk.tetris.ui.controller.input.TetrisControllerInputHandler; +import spypunk.tetris.ui.view.TetrisMainView; @Singleton public class TetrisControllerImpl implements TetrisController { @@ -21,12 +23,17 @@ public class TetrisControllerImpl implements TetrisController { private final TetrisControllerInputHandler tetrisControllerInputHandler; + private TetrisMainView mainView; + @Inject public TetrisControllerImpl(final TetrisControllerGameLoop tetrisControllerGameLoop, - final TetrisControllerInputHandler tetrisControllerInputHandler) { + final TetrisControllerInputHandler tetrisControllerInputHandler, + final TetrisMainView mainView) { this.tetrisControllerGameLoop = tetrisControllerGameLoop; this.tetrisControllerInputHandler = tetrisControllerInputHandler; + this.mainView = mainView; + } @Override @@ -53,4 +60,10 @@ public void onKeyPressed(final int keyCode) { public void onKeyReleased(final int keyCode) { tetrisControllerInputHandler.onKeyReleased(keyCode); } + + @Override + public JPanel getJPanel() { + return this.mainView.getJPanel(); + } + } diff --git a/src/main/java/spypunk/tetris/ui/view/KeyConfigScreen.java b/src/main/java/spypunk/tetris/ui/view/KeyConfigScreen.java index d64ba94..ccd020b 100644 --- a/src/main/java/spypunk/tetris/ui/view/KeyConfigScreen.java +++ b/src/main/java/spypunk/tetris/ui/view/KeyConfigScreen.java @@ -2,6 +2,10 @@ //import sun.text.resources.cldr.ext.FormatData_ia; +import com.google.inject.Guice; +import com.google.inject.Injector; +import spypunk.tetris.guice.TetrisModule2; + import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -98,8 +102,8 @@ public void actionPerformed(ActionEvent e) { keysForPlayer2 = keys2; //tetrisControllerInputHandler classinda key bindingleri. - //todo key configlerini yap. - //todo 2 kisilik oyunu ac. + final Injector injector = Guice.createInjector(new TetrisModule2()); + injector.getInstance(Tetris2PlayerView.class); mainFrame.dispose(); } else { diff --git a/src/main/java/spypunk/tetris/ui/view/TetrisMainView.java b/src/main/java/spypunk/tetris/ui/view/TetrisMainView.java index b668109..abb9033 100644 --- a/src/main/java/spypunk/tetris/ui/view/TetrisMainView.java +++ b/src/main/java/spypunk/tetris/ui/view/TetrisMainView.java @@ -8,6 +8,8 @@ package spypunk.tetris.ui.view; +import javax.swing.*; + public interface TetrisMainView { void show(); @@ -17,4 +19,6 @@ public interface TetrisMainView { void update(); void setMuted(boolean muted); + + JPanel getJPanel(); } diff --git a/src/main/java/spypunk/tetris/ui/view/TetrisMainViewImpl.java b/src/main/java/spypunk/tetris/ui/view/TetrisMainViewImpl.java index 245c98e..956944a 100644 --- a/src/main/java/spypunk/tetris/ui/view/TetrisMainViewImpl.java +++ b/src/main/java/spypunk/tetris/ui/view/TetrisMainViewImpl.java @@ -190,4 +190,8 @@ public void setMuted(final boolean muted) { private void setVisible(final boolean visible) { SwingUtils.doInAWTThread(() -> frame.setVisible(visible)); } + + public JPanel getJPanel() { + return null; + } }