YauhenMardan

Untitled

May 21st, 2019
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.77 KB | None | 0 0
  1. package com.company;
  2.  
  3. import javax.imageio.ImageIO;
  4. import javax.swing.*;
  5. import java.awt.*;
  6. import java.awt.event.*;
  7. import java.util.Collections;
  8.  
  9. public class Controller {
  10.  
  11. public final int TIMER_SPEED=90;
  12. public final int BALL_ADDING_TIMER_SPEED=(int) (TIMER_SPEED*13.5);
  13. public final int BALL_FLYING_TIMER_SPEED=(int) (TIMER_SPEED*0.2);
  14.  
  15.  
  16. public int width;
  17. public int height;
  18. public int ballRadius;
  19. public int radius;
  20.  
  21. private int ballTotalNum=30;
  22.  
  23. Timer timer;
  24. Timer ballAddingTimer;
  25. Timer ballFlyingTimer;
  26. Timer ballBacktrackingTimer;
  27. Model model;
  28. View view;
  29.  
  30. Point putinPaneCenter;
  31. Point windowCenter;
  32.  
  33. double phi=0.1;
  34. double phiBack=0;
  35.  
  36. Dimension ballDim;
  37. Dimension backgroundDim;
  38.  
  39. double tethaFlying;
  40.  
  41. int num;
  42. int numOfDeleted;
  43.  
  44. boolean isFlying;
  45.  
  46. AudioPlayer player;
  47. AudioPlayer menuPlayer;
  48. AudioPlayer winPlayer;
  49. AudioPlayer losePlayer;
  50.  
  51. Controller(){
  52. //MVC
  53. model=new Model();
  54. view=new View(model);
  55. view.setVisible(true);
  56.  
  57. //
  58. //game pane
  59. //
  60.  
  61. //add music
  62. try {
  63. player = new AudioPlayer("song.wav");
  64. menuPlayer = new AudioPlayer("med.wav");
  65. winPlayer=new AudioPlayer("soviet-anthem.wav");
  66. losePlayer = new AudioPlayer("sax.wav");
  67. menuPlayer.play();
  68. } catch (Exception e){
  69. System.out.println(e.getMessage());
  70. }
  71. //points
  72. putinPaneCenter=new Point(view.gamePane.putinPane.getX()+ImageParser.getPutinDim().width/2,view.gamePane.putinPane.getY()+ImageParser.getPutinDim().height/2);
  73. windowCenter=new Point(view.gamePane.getWidth()/2,view.gamePane.getHeight()/2);
  74. //dims
  75. ballDim = ImageParser.getBallDim();
  76. backgroundDim=ImageParser.getBackgroundDim();
  77.  
  78. width=view.getWidth();
  79. height=view.getHeight();
  80. ballRadius=ImageParser.getBallRadius();
  81. radius=Math.min(width,height)/2-ballRadius;
  82.  
  83. //flying ball
  84. isFlying=true;
  85.  
  86. //ballFlying timer
  87. ballFlyingTimer=new Timer(BALL_FLYING_TIMER_SPEED, new ActionListener() {
  88. Point currPos;
  89. @Override
  90. public void actionPerformed(ActionEvent e) {
  91. currPos=model.balls.get(0).getLocation();
  92. //is out
  93. if(currPos.x<-ballDim.width || currPos.y<-ballDim.height || currPos.x>backgroundDim.width || currPos.y>backgroundDim.height ){
  94. //stop
  95. model.removeBall(0);
  96. model.addBall(0,windowCenter.x-ballDim.width/2,windowCenter.y-ballDim.height/2);
  97. isFlying=false;
  98. ballFlyingTimer.stop();
  99. } else {
  100. model.setBallPos(0, (int) (currPos.x + 10 * (Math.cos(tethaFlying))), (int) (currPos.y + 10 * (Math.sin(tethaFlying))));
  101. for(int i=1;i<model.size();i++){ //intersection of flying ball and ball in the line
  102. if(intersects(model.balls.get(0),model.balls.get(i))){
  103.  
  104. Ball ball=new Ball(model.balls.get(0));
  105. //add ball to the line
  106. model.addBall(i,ball);
  107. //stop
  108. model.removeBall(0);
  109. model.addBall(0,windowCenter.x-ballDim.width/2,windowCenter.y-ballDim.height/2);
  110. isFlying=false;
  111. ballFlyingTimer.stop();
  112. //delete if match
  113. boolean trigger=false;
  114. numOfDeleted=0;
  115.  
  116. //backward
  117. while (i+1<model.size()){
  118. if(model.get(i).getColor().getRGB()==model.get(i+1).getColor().getRGB()){
  119. model.removeBall(i+1);
  120. numOfDeleted++;
  121. trigger=true;
  122. } else{
  123. break;
  124. }
  125. }
  126. //forward
  127. while (i-1>0){
  128. if(model.get(i).getColor().getRGB()==model.get(i-1).getColor().getRGB()){
  129. model.removeBall(i-1);
  130. numOfDeleted++;
  131. i--;
  132. trigger=true;
  133. } else{
  134. break;
  135. }
  136. }
  137. if(trigger) {
  138. //one
  139. model.removeBall(i);
  140. numOfDeleted++;
  141. view.gamePane.repaint();
  142. }
  143. //check
  144. if(i==model.size()){
  145. trigger=false;
  146. System.out.println(model.size());
  147. }
  148. if(model.size()==1){
  149. showWinPane();
  150. }
  151. //backtrack
  152. if(trigger){
  153. num=i;
  154. phiBack=phi;
  155. ballBacktrackingTimer.start();
  156. }
  157. }
  158. }
  159. }
  160. }
  161. });
  162.  
  163. //ballAdding timer
  164. ballAddingTimer=new Timer(BALL_ADDING_TIMER_SPEED, new ActionListener() {
  165. int i=0;
  166. @Override
  167. public void actionPerformed(ActionEvent e) {
  168. if(i<ballTotalNum) {
  169. model.addBall(-40, -40);
  170. i++;
  171. }
  172. }
  173. });
  174.  
  175. //add ball to putin
  176. model.addBall(windowCenter.x-ballDim.width/2,windowCenter.y-ballDim.height/2);
  177.  
  178. num=1;
  179.  
  180. //timer
  181. timer=new Timer(TIMER_SPEED, new ActionListener() {
  182.  
  183. double delta=0.12;
  184. double alpha;
  185.  
  186. @Override
  187. public void actionPerformed(ActionEvent e) {
  188. for(int i=num;i<model.size();i++){
  189. alpha=phi-(i+numOfDeleted)*(delta);
  190. if(alpha<0.1){
  191. model.setBallPos(i, -40,-40);
  192. } else {
  193. model.setBallPos(i, getX(alpha), getY(alpha));
  194. }
  195. }
  196. phi+=0.01;
  197.  
  198. if(phi>2*Math.PI+0.05){
  199. showLosePane();
  200. }
  201. }
  202. });
  203. //ball backtracking timer
  204. ballBacktrackingTimer=new Timer(TIMER_SPEED, new ActionListener() {
  205. double delta=0.12;
  206.  
  207. @Override
  208. public void actionPerformed(ActionEvent e) {
  209. for(int i=1;i<num;i++){
  210. model.setBallPos(i,getX(phiBack-i*delta),getY(phiBack-i*delta));
  211. }
  212. phiBack-=0.01;
  213. if(intersects(model.balls.get(num-1),model.balls.get(num))){
  214. num=1;
  215. phi=phiBack;
  216. numOfDeleted=0;
  217. ballBacktrackingTimer.stop();
  218. }
  219. }
  220. });
  221.  
  222. view.addMouseMotionListener(new MouseMotionListener() {
  223. @Override
  224. public void mouseDragged(MouseEvent e) {
  225.  
  226. }
  227.  
  228. @Override
  229. public void mouseMoved(MouseEvent e) {
  230. double tetha=-Math.atan2(e.getX()-putinPaneCenter.x,e.getY()-putinPaneCenter.y)+Math.PI/2;
  231. view.gamePane.putinPane.rotate(tetha);
  232. }
  233. });
  234.  
  235. view.addMouseListener(new MouseAdapter() {
  236. @Override
  237. public void mouseClicked(MouseEvent e) {
  238. if(!isFlying) {
  239. tethaFlying = -Math.atan2(e.getX() - putinPaneCenter.x, e.getY() - putinPaneCenter.y) + Math.PI / 2;
  240. ballFlyingTimer.start();
  241. isFlying=true;
  242. }
  243. }
  244. });
  245.  
  246. //
  247. //main menu
  248. //
  249.  
  250. view.menuPane.playButton.addMouseListener(new MouseAdapter() {
  251. @Override
  252. public void mouseClicked(MouseEvent e) {
  253. showGamePane();
  254. }
  255. });
  256. view.menuPane.exitButton.addMouseListener(new MouseAdapter() {
  257. @Override
  258. public void mouseClicked(MouseEvent e) {
  259. view.dispatchEvent(new WindowEvent(view,WindowEvent.WINDOW_CLOSING));
  260. }
  261. });
  262. view.winPane.exitButton.addMouseListener(new MouseAdapter() {
  263. @Override
  264. public void mouseClicked(MouseEvent e) {
  265. view.dispatchEvent(new WindowEvent(view,WindowEvent.WINDOW_CLOSING));
  266. }
  267. });
  268. view.losePane.exitButton.addMouseListener(new MouseAdapter() {
  269. @Override
  270. public void mouseClicked(MouseEvent e) {
  271. view.dispatchEvent(new WindowEvent(view,WindowEvent.WINDOW_CLOSING));
  272. }
  273. });
  274.  
  275. }
  276.  
  277. int getX(double phi){
  278. return (int)(radius*Math.cos(phi)+width/2-ballRadius);
  279. }
  280.  
  281. int getY(double phi){
  282. return (int)(radius*Math.sin(phi)+height/2-ballRadius);
  283. }
  284.  
  285. public boolean intersects(JLabel testa, JLabel testb){
  286. Rectangle rectB = testb.getBounds();
  287. Rectangle result = SwingUtilities.computeIntersection(testa.getX(), testa.getY(), testa.getWidth(), testa.getHeight(), rectB);
  288. return (result.getWidth() > 0 && result.getHeight() > 0);
  289. }
  290. public void showGamePane(){
  291. view.remove(view.menuPane);
  292. view.setContentPane(view.gamePane);
  293. player.play();
  294. menuPlayer.stop();
  295. isFlying=false;
  296. ballAddingTimer.start();
  297. timer.start();
  298. }
  299. public void showWinPane(){
  300. view.remove(view.gamePane);
  301. view.setContentPane(view.winPane);
  302. player.stop();
  303. winPlayer.play();
  304. isFlying=true;
  305. ballAddingTimer.stop();
  306. timer.stop();
  307. }
  308. public void showLosePane(){
  309. view.remove(view.gamePane);
  310. view.setContentPane(view.losePane);
  311. player.stop();
  312. losePlayer.play();
  313. isFlying=true;
  314. ballAddingTimer.stop();
  315. timer.stop();
  316. }
  317.  
  318.  
  319. }
Advertisement
Add Comment
Please, Sign In to add comment