Advertisement
Teonnyn

Untitled

Aug 19th, 2020
2,022
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 10.93 KB | None | 0 0
  1. using FE;
  2. using UnityEngine;
  3.  
  4. public class Pong: Game
  5. {
  6.     private enum PongStates
  7.     {
  8.         TitleScreen,
  9.         Game,
  10.         Win,
  11.         GameOver
  12.     }
  13.  
  14.     private FuseEngine fe;
  15.     public int playerAScore = 0;
  16.     public int playerBScore = 0;
  17.  
  18.     int scoreToWin = 5;
  19.  
  20.     public int centerX = 0;
  21.     public int centerY = 0;
  22.  
  23.     public PongPaddle paddleA;
  24.     public PongPaddle paddleB;
  25.  
  26.     public float ballX = 0;
  27.     public float ballY = 0;
  28.  
  29.     float ballVX = 0;
  30.     float ballVY = 0;
  31.  
  32.     public int ballSize = 4;
  33.     int ballSpeed = 40;
  34.  
  35.     bool ballServed = false;
  36.  
  37.     int cursorX, cursorY = 0;
  38.  
  39.     private PongStates pongState = PongStates.TitleScreen;
  40.  
  41.     bool isReady = false;
  42.  
  43.     CPU cpu;
  44.  
  45.     public Pong(FuseEngine _fe, CPU _cpu)
  46.     {
  47.         fe = _fe;
  48.         cpu = _cpu;
  49.         fe.setFrameRate(60);
  50.         centerY = fe.height / 2;
  51.         centerX = fe.width / 2;
  52.         cursorX = centerX;
  53.         cursorY = centerY;
  54.         ballReset();
  55.        
  56.         fe.clear();
  57.         fe.display();
  58.         paddleA = new PongPaddle(fe, this);
  59.         paddleB = new PongPaddle(fe, this);
  60.         paddleA.setPosition(new Vector2Int(5, centerY - (paddleA.paddleHeight / 2)));
  61.         paddleB.setPosition(new Vector2Int(fe.width - paddleB.paddleWidth - 5, centerY - (paddleB.paddleHeight / 2)));
  62.  
  63.         isReady = true;
  64.     }
  65.  
  66.     // Update is called once per frame
  67.     public override void Update()
  68.     {
  69.         if (isReady)
  70.         {
  71.             if (!fe.nextFrame()) return;
  72.             fe.clear();
  73.             handleStates();
  74.             // REQUIRED for Input //
  75.             handleInput();
  76.             fe.display();
  77.         }
  78.     }
  79.  
  80.  
  81.     private void handleStates()
  82.     {
  83.         switch(pongState)
  84.         {
  85.             case PongStates.TitleScreen:
  86.                 titleScreen();
  87.                 break;
  88.             case PongStates.Game:
  89.                 gameScreen();
  90.                 break;
  91.             case PongStates.Win:
  92.                 GameWinScreen();
  93.                
  94.                 break;
  95.             case PongStates.GameOver:
  96.                 GameLoseScreen();
  97.                
  98.                 break;
  99.         }
  100.     }
  101.  
  102.     public void cursorMovement()
  103.     {
  104.         cursorX += Controls.Horizontal * 2;
  105.         cursorY -= Controls.Vertical * 2;
  106.  
  107.         if (cursorX <= 0)
  108.         {
  109.             cursorX = 0;
  110.         }
  111.  
  112.         if (cursorX >= fe.width - 1)
  113.         {
  114.             cursorX = fe.width - 1;
  115.         }
  116.  
  117.         if (cursorY >= 144)
  118.         {
  119.             cursorY = 144;
  120.         }
  121.  
  122.         if (cursorY <= 0)
  123.         {
  124.             cursorY = 0;
  125.         }
  126.  
  127.         drawCursor();
  128.     }
  129.  
  130.     public void drawCursor()
  131.     {
  132.         int cX = cursorX;
  133.         int cY = cursorY;
  134.  
  135.         fe.drawFastHLine(cX, cY + 1, 2, Color.blue);
  136.         fe.drawFastHLine(cX, cY - 1, 2, Color.blue);
  137.         fe.drawFastVLine(cX + 1, cY, 2, Color.blue);
  138.         fe.drawFastVLine(cX - 1, cY - 1, 3, Color.blue);
  139.     }
  140.     private void titleScreen()
  141.     {
  142.         drawTitleText();
  143.     }
  144.  
  145.     private void gameScreen()
  146.     {
  147.         field();
  148.         drawBall();
  149.         paddleA.drawPaddle();
  150.         paddleB.drawPaddle();
  151.         ballPaddleCollision(paddleA);
  152.         ballPaddleCollision(paddleB);
  153.         paddleControls();
  154.     }
  155.  
  156.     private void GameWinScreen()
  157.     {
  158.         int ngPY = 64;
  159.         int gymOvr = 90;
  160.         Point cursorPoint = new Point(cursorX, cursorY);
  161.         cursorMovement();
  162.         Rect NGRect = new Rect(30, ngPY, 100, 20);
  163.         Rect QURect = new Rect(30, gymOvr, 100, 20);
  164.  
  165.         fe.writeString(35, 25, "You Win!", 2);
  166.         fe.writeString((int)NGRect.x + 2, ngPY + 2, "New Game", 2);
  167.         fe.writeString((int)QURect.x + 2, gymOvr + 3, "Quit", 2);
  168.  
  169.         if (fe.collide(cursorPoint, NGRect))
  170.         {
  171.             if (fe.everyXFrames(3))
  172.             {
  173.                 fe.drawRect((int)NGRect.x, (int)NGRect.y - 2, (int)NGRect.width, (int)NGRect.height, Color.blue);
  174.             }
  175.  
  176.             if (Controls.buttonADown)
  177.             {
  178.                 resetGame();
  179.             }
  180.         }
  181.         else
  182.         {
  183.             fe.drawRect((int)NGRect.x, (int)NGRect.y - 2, (int)NGRect.width, (int)NGRect.height, Color.blue);
  184.         }
  185.  
  186.  
  187.         if (fe.collide(cursorPoint, QURect))
  188.         {
  189.             if (fe.everyXFrames(3))
  190.             {
  191.                 fe.drawRect((int)QURect.x, (int)QURect.y, (int)QURect.width, (int)QURect.height, Color.blue);
  192.             }
  193.  
  194.             if (Controls.buttonADown)
  195.             {
  196.                 isReady = false;
  197.                 quitGame();
  198.             }
  199.         }
  200.         else
  201.         {
  202.             fe.drawRect((int)QURect.x, (int)QURect.y, (int)QURect.width, (int)QURect.height, Color.blue);
  203.         }
  204.     }
  205.  
  206.  
  207.     private void resetGame()
  208.     {
  209.         ballReset();
  210.         pongState = PongStates.Game;
  211.         playerAScore = 0;
  212.         playerBScore = 0;
  213.     }
  214.  
  215.     private void drawTitleText()
  216.     {
  217.         int ngPY = 64;
  218.         int gymOvr = 90;
  219.         Point cursorPoint = new Point(cursorX, cursorY);
  220.         Rect NGRect = new Rect(30, ngPY, 100, 20);
  221.         Rect QURect = new Rect(30, gymOvr, 100, 20);
  222.         cursorMovement();
  223.         fe.writeString(28, 20, "Bead Ball", 2);
  224.         fe.writeString((int)NGRect.x + 2, ngPY + 2, "New Game", 2);
  225.         fe.writeString((int)QURect.x + 2, gymOvr + 3, "Quit", 2);
  226.  
  227.         if (fe.collide(cursorPoint, NGRect))
  228.         {
  229.             if (fe.everyXFrames(3))
  230.             {
  231.                 fe.drawRect((int)NGRect.x, (int)NGRect.y - 2, (int)NGRect.width, (int)NGRect.height, Color.blue);
  232.             }
  233.  
  234.             if (Controls.buttonADown)
  235.             {
  236.                 resetGame();
  237.             }
  238.         }
  239.         else
  240.         {
  241.             fe.drawRect((int)NGRect.x, (int)NGRect.y - 2, (int)NGRect.width, (int)NGRect.height, Color.blue);
  242.         }
  243.  
  244.  
  245.         if (fe.collide(cursorPoint, QURect))
  246.         {
  247.             if (fe.everyXFrames(3))
  248.             {
  249.                 fe.drawRect((int)QURect.x, (int)QURect.y, (int)QURect.width, (int)QURect.height, Color.blue);
  250.             }
  251.  
  252.             if (Controls.buttonADown)
  253.             {
  254.                 isReady = false;
  255.                 quitGame();
  256.             }
  257.         }
  258.         else
  259.         {
  260.             fe.drawRect((int)QURect.x, (int)QURect.y, (int)QURect.width, (int)QURect.height, Color.blue);
  261.         }
  262.     }
  263.  
  264.     private void GameLoseScreen()
  265.     {
  266.         int ngPY = 64;
  267.         int gymOvr = 90;
  268.         Point cursorPoint = new Point(cursorX, cursorY);
  269.  
  270.         cursorMovement();
  271.  
  272.         Rect NGRect = new Rect(30, ngPY, 100, 20);
  273.         Rect QURect = new Rect(30, gymOvr, 100, 20);
  274.  
  275.         fe.writeString(29, 25, "Game Over", 2);
  276.         fe.writeString((int)NGRect.x + 2, ngPY + 2, "New Game", 2);
  277.         fe.writeString((int)QURect.x + 2, gymOvr + 3, "Quit", 2);
  278.  
  279.         if (fe.collide(cursorPoint, NGRect))
  280.         {
  281.             if (fe.everyXFrames(3))
  282.             {
  283.                 fe.drawRect((int)NGRect.x, (int)NGRect.y - 2, (int)NGRect.width, (int)NGRect.height, Color.blue);
  284.             }
  285.  
  286.             if (Controls.buttonADown)
  287.             {
  288.                 resetGame();
  289.             }
  290.         }
  291.         else
  292.         {
  293.             fe.drawRect((int)NGRect.x, (int)NGRect.y - 2, (int)NGRect.width, (int)NGRect.height, Color.blue);
  294.         }
  295.  
  296.  
  297.         if (fe.collide(cursorPoint, QURect))
  298.         {
  299.             if (fe.everyXFrames(3))
  300.             {
  301.                 fe.drawRect((int)QURect.x, (int)QURect.y, (int)QURect.width, (int)QURect.height, Color.blue);
  302.             }
  303.  
  304.             if (Controls.buttonADown)
  305.             {
  306.                 isReady = false;
  307.                 quitGame();
  308.             }
  309.         }
  310.         else
  311.         {
  312.             fe.drawRect((int)QURect.x, (int)QURect.y, (int)QURect.width, (int)QURect.height, Color.blue);
  313.         }
  314.     }
  315.  
  316.     public void drawBall()
  317.     {
  318.         if (ballServed)
  319.         {
  320.             moveBall();
  321.         } else {
  322.             fe.writeString(30, 30, "Press A to Serve", 1);
  323.             ballReset(0);
  324.  
  325.             if (Controls.buttonADown)
  326.             {
  327.                 ballReset(1);
  328.                 ballServed = true;
  329.             }
  330.         }
  331.  
  332.         int x = Mathf.RoundToInt(ballX);
  333.         int y = Mathf.RoundToInt(ballY);
  334.         fe.drawRect(x, y, ballSize, ballSize, Color.white);
  335.         fe.fillRect(x, y, ballSize, ballSize, Color.white);
  336.     }
  337.  
  338.     public void ballReset(int direction = 0)
  339.     {
  340.         ballX = centerX;
  341.         ballY = centerY;
  342.         ballVX = direction;
  343.         ballVY = 0;
  344.     }
  345.  
  346.     public void moveBall()
  347.     {
  348.         if (ballY <= 1 || ballY >= fe.height - ballSize - 1)
  349.         {
  350.             ballVY = -ballVY;
  351.         }
  352.  
  353.         if (ballX <= 1 || ballX >= fe.width - ballSize - 1)
  354.         {
  355.  
  356.             if (ballX <= 1)
  357.             {
  358.                 playerBScore++;
  359.             }
  360.  
  361.  
  362.             if (ballX >= fe.width - ballSize - 1)
  363.             {
  364.                 playerAScore++;
  365.             }
  366.  
  367.             if (playerAScore > scoreToWin)
  368.             {
  369.                 pongState = PongStates.Win;
  370.             }
  371.  
  372.             if (playerBScore > scoreToWin)
  373.             {
  374.                 pongState = PongStates.GameOver;
  375.             }
  376.  
  377.             ballServed = false;
  378.         }
  379.  
  380.         ballX = ballX + ballVX * ballSpeed * Time.deltaTime;
  381.         ballY = ballY + ballVY * ballSpeed * Time.deltaTime;
  382.     }
  383.  
  384.     int numDetections = 0;
  385.  
  386.  
  387.  
  388.     public void ballPaddleCollision(PongPaddle paddle)
  389.     {
  390.         float bx = paddle.position.x - ballX - ballSize;
  391.         float by = paddle.position.y - ballY - ballSize;
  392.        
  393.         int pw = paddle.paddleWidth + ballSize;
  394.         int ph = paddle.paddleHeight + ballSize;
  395.  
  396.         if (bx <= 0 && bx + pw >= 0 && by <= 0 && by + ph >= 0)
  397.         {
  398.             float pW = paddle.position.x + (paddle.paddleWidth / 2);
  399.             float pH = paddle.position.y + (paddle.paddleHeight / 2);
  400.             Vector2 position = new Vector2(ballX, ballY);
  401.             Vector2 paddleCenter = new Vector2(pW, pH);
  402.            
  403.             ballVX = 1 - 2 * (paddleCenter.x - position.x) / paddle.paddleWidth;
  404.             ballVY = 1 - 2 * (paddleCenter.y - position.y) / paddle.paddleWidth;
  405.         }
  406.     }
  407.  
  408.     void paddleControls()
  409.     {
  410.         paddleA.move_implicit(Controls.Vertical);
  411.         paddleB.move_implicit();
  412.         paddleA.update();
  413.         paddleB.update();
  414.     }
  415.  
  416.     private void field()
  417.     {
  418.         fe.drawRect(0, 0, fe.width - 1, fe.height, Color.blue);
  419.         fe.writeString(centerX - 15, 5, playerAScore.ToString(), 1);
  420.         fe.writeString(centerX + 10, 5, playerBScore.ToString(), 1);
  421.         fe.drawFastVLine(fe.width / 2, 0, fe.height, Color.white);
  422.         fe.drawCircle(centerX, centerY, 14, Color.green);
  423.     }
  424.  
  425.     public void quitGame()
  426.     {
  427.         fe.clear();
  428.         Unload();
  429.         cpu.reloadSystem();
  430.     }
  431. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement