Untitled
unknown
plain_text
2 years ago
7.9 kB
3
Indexable
import javax.swing.*; 2 import java.awt.*; 3 import java.awt.event.*; 4 5 public class Panel00 extends JPanel { 6 Timer t = new Timer(1, new Listener()); 7 int ctr = 0; 8 double G = 0.1; //Gravitational Constant 9 10 final int xpos = 280; 11 12 double[] p2d = {280, 200}; 13 double[] v2d = {0, 0}; 14 15 int points = 0; 16 int lives = 0; 17 int sides = 13; 18 19 double snorm = 400; 20 double sd = 450; 21 double sv = 0; 22 boolean setlock = false; 23 boolean rdown, ldown; 24 double paddle = 130; 25 double rtheta = 0; 26 double ltheta = 0; 27 28 int preset[][] = { 29 {0, 400, 135, 450,1}, //right paddle 30 {135, 450, 270, 400,1}, //left paddle 31 {270, 0, 300, 20, 1}, //first bouncey thingy 32 {291, 0, 291, 500, 1}, //right wall 33 {-1, 0, 270, 0, 1}, //top wall 34 {0, -1, 0, 500, 1} //left wall 35 }; 36 37 int[][] balls = { 38 {80, 80, 30, 50}, 39 {230, 280, 20, 200}, 40 {50, 200, 25, 100}, 41 {200, 100, 10, 500} 42 }; 43 int lines[][] = new int[100][5]; 44 45 public Panel00(){ 46 super(); 47 t.start(); 48 addKeyListener(new Key()); 49 setFocusable(true); 50 51 for(int i = 0; i < preset.length; i++){ 52 lines[i] = preset[i]; 53 } 54 55 int plen = preset.length; 56 57 int ct = 0; 58 for(int k = 0; k < balls.length; k++){ 59 int px = balls[k][0], py = balls[k][1], radius = balls[k][2]; 60 for(double i = 0; i < 2 * Math.PI; i+= 2 * Math.PI/ sides){ 61 ct++; 62 lines[plen + ct][0] = px + (int) (radius * Math.cos(i)); 63 lines[plen + ct][1] = py + (int) (radius * Math.sin(i)); 64 lines[plen + ct][2] = px + (int) (radius * Math.cos(i - 2 *Math.PI / sides)); 65 lines[plen + ct][3] = py + (int) (radius * Math.sin(i - 2 * Math.PI / sides)); 66 } 67 } 68 69 } 70 71 private class Listener implements ActionListener { 72 public void actionPerformed(ActionEvent e){ 73 repaint(); 74 } 75 } 76 77 public void paintComponent(Graphics g){ 78 super.paintComponent(g); 79 v2d[1] += G; 80 p2d[1] += v2d[1]; 81 p2d[0] += v2d[0]; 82 83 84 85 if(p2d[1] > 1000){ 86 p2d[0] = 280; 87 p2d[1] = 200; 88 v2d[0] = 0; 89 v2d[1] = 0; 90 lives++; 91 } 92 if(p2d[0] == 280 && p2d[1] > sd){ 93 p2d[1] = sd; 94 v2d[1] = Math.min(v2d[1], sv); 95 } 96 97 if(setlock == false){ 98 sv *= 0.95; //the dampening coefficient for the springiness 99 sv -= (sd - snorm)/30; 100 sd += sv; 101 } 102 double rc = 0.1; 103 if(rdown){ 104 rtheta = Math.max(-0.5, rtheta - rc); 105 }else{ 106 rtheta = Math.min(0.5, rtheta + rc); 107 } 108 if(ldown){ 109 ltheta = Math.max(-0.5, ltheta - rc); 110 }else{ 111 ltheta = Math.min(0.5, ltheta + rc); 112 } 113 114 lines[0][2] = lines[0][0] + (int) (Math.cos(ltheta) * paddle); 115 lines[0][3] = lines[0][1] + (int) (Math.sin(ltheta) * paddle); 116 lines[1][0] = lines[1][2] + (int) (-Math.cos(rtheta) * paddle); 117 lines[1][1] = lines[1][3] + (int) (Math.sin(rtheta) * paddle); 118 int rX = (int) p2d[0]; 119 int rY = (int) p2d[1]; 120 int r = 10; 121 g.setColor(Color.blue); 122 g.drawArc(rX - r, rY - r, 2 * r, 2 * r, 0, 360); 123 g.setColor(Color.black); 124 for(int i = 0; i < lines.length; i++){ 125 int x1 = lines[i][0], 126 y1 = lines[i][1], 127 x2 = lines[i][2]; 128 double y2 = lines[i][3] + 0.0001; 129 if(i > preset.length){ 130 g.setColor(Color.red); 131 } 132 g.drawLine(x1, y1, x2, (int) Math.round(y2)); 133 134 double bmag = Math.sqrt(v2d[0] * v2d[0] + v2d[1] * v2d[1]); 135 double lineslope = ((double)(x2 - x1))/((double)(y2 - y1)); 136 double ballslope = v2d[0] / v2d[1]; 137 //System.out.println(ballslope + " " + lineslope); 138 //xpos * ballslope + p2d[1] = xpos * lineslope + y1; 139 double binter = p2d[0] - ballslope * p2d[1]; 140 double linter = x1 - lineslope * y1; 141 142 double y = (binter - linter)/(lineslope - ballslope); 143 double sx = y * ballslope + binter; 144 //double qx = y * lineslope + linter; 145 double la = Math.atan2(y2 - y1, x2 - x1); 146 double ba = Math.atan2(v2d[1], v2d[0]); 147 148 double da = 2 * la - ba; 149 150 //System.out.println(sx + " " + y); 151 /* 152 g.drawLine((int)sx, (int)y, (int)p2d[0], (int)p2d[1]); 153 g.fillRect((int)sx - 2, (int)y - 2, 4, 4); 154 g.drawLine((int)p2d[0], (int)p2d[1], (int) (p2d[0] + Math.cos(da) * 100), (int)(p2d[1] + Math.sin(da) * 100)); 155 //*/ 156 if(sx >= Math.min(x2, x1) && sx <= Math.max(x1, x2) && 157 Math.min(y1, y2) <= y && Math.max(y1, y2) >= y){ 158 double interdist = Math.sqrt(Math.pow(sx - p2d[0],2) + Math.pow(y - p2d[1],2)); 159 double tiny = 0.0001; 160 double futuredist = Math.sqrt(Math.pow(sx - (p2d[0] + Math.cos(ba) * tiny),2) + Math.pow(y - (p2d[1] + Math.sin(ba) * tiny),2)); 161 162 if(interdist <= bmag + r && futuredist < interdist){ 163 //System.out.println("Carl Sagan" + i); //this is a pun because he wrote a book called Contact 164 if(i > preset.length){ 165 int ball = (int) Math.floor((i - preset.length)/sides); 166 //System.out.println(balls[ball][2]); 167 points += balls[ball][3] * bmag; 168 } 169 v2d[0] = Math.cos(da) * bmag; 170 v2d[1] = Math.sin(da) * bmag; 171 } 172 } 173 } 174 g.setColor(Color.black); 175 //System.out.println(sx + " " + qx); 176 //System.out.println(ballslope + " " + lineslope); 177 //double slope = Math.atan2(v2d[1], v2d[0]); 178 //g.drawLine((int) p2d[0], (int) p2d[1], (int) (p2d[0]+10*v2d[0]), (int) (p2d[1]+10*v2d[1])); 179 180 g.fillRect(xpos - 5, (int)sd + 10, 10, 20); 181 182 g.drawString("Score: " + points + " Resets: " + lives, 10, 15); 183 184 } 185 186 private class Key extends KeyAdapter { 187 public void keyPressed(KeyEvent e){ 188 if(e.getKeyCode() == KeyEvent.VK_DOWN){ 189 setlock = true; 190 sd += 2; 191 } 192 if(e.getKeyCode() == KeyEvent.VK_LEFT){ 193 ldown = true; 194 } 195 if(e.getKeyCode() == KeyEvent.VK_RIGHT){ 196 rdown = true; 197 } 198 } 199 public void keyReleased(KeyEvent e){ 200 setlock = false; 201 if(e.getKeyCode() == KeyEvent.VK_LEFT){ 202 ldown = false; 203 } 204 if(e.getKeyCode() == KeyEvent.VK_RIGHT){ 205 rdown = false; 206 } 207 } 208 } 209 }
Editor is loading...