Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>//Joris, this is the full code. No SSCCE. It's right out of the book. This code has your edit included which matches the book, but if you change it to match my previous error which you corrected you will notice that p2 will move, but when p1 collides with a wall p2 will collide and that p2 goes right through walls.</p> <pre><code>import javax.swing.*; import javax.swing.event.*; import java.awt.*; import java.awt.event.*; public class Collision extends JFrame { final int WIDTH = 900, HEIGHT = 650; double p1Speed = .5, p2Speed = .5; </code></pre> <p>//these are the ints that represent directions</p> <pre><code>final int UP = 0, RIGHT = 1, DOWN = 2, LEFT = 3; </code></pre> <p>//these will keep track of the players directions(default = up)</p> <pre><code>int p1Direction = UP; int p2Direction = UP; Rectangle left = new Rectangle(0, 0, WIDTH / 9, HEIGHT); Rectangle right = new Rectangle((WIDTH / 9) * 8, 0, WIDTH / 9, HEIGHT); Rectangle top = new Rectangle(0, 0, WIDTH, HEIGHT / 9); Rectangle bottom = new Rectangle(0, (HEIGHT / 9) * 8, WIDTH, HEIGHT / 9); Rectangle center = new Rectangle((int) ((WIDTH / 9) * 2.5), (int) ((HEIGHT / 9) * 2.5), (int) ((WIDTH / 9) * 5), (HEIGHT / 9) * 4); Rectangle obstacle = new Rectangle(WIDTH / 2, (int) ((HEIGHT / 9) * 7), WIDTH / 10, HEIGHT / 9); Rectangle obstacle2 = new Rectangle(WIDTH / 3, (int) ((HEIGHT / 9) * 5), WIDTH / 10, HEIGHT / 4); Rectangle obstacle3 = new Rectangle(2 * (WIDTH / 3), (int) ((HEIGHT / 9) * 5), WIDTH / 10, HEIGHT / 4); Rectangle obstacle4 = new Rectangle(WIDTH / 3, HEIGHT / 9, WIDTH / 30, HEIGHT / 9); Rectangle obstacle5 = new Rectangle(WIDTH / 2, (int) ((HEIGHT / 9) * 1.5), WIDTH / 30, HEIGHT / 4); Rectangle finish = new Rectangle(WIDTH / 9, (HEIGHT / 2) - HEIGHT / 9, (int) ((WIDTH / 9) * 1.5), HEIGHT / 70); Rectangle p1 = new Rectangle(WIDTH / 9, HEIGHT / 2, WIDTH / 30, WIDTH / 30); Rectangle p2 = new Rectangle(((WIDTH / 9) + ((int) ((WIDTH / 9) * 1.5) / 2)), (HEIGHT / 2) + (HEIGHT / 10), WIDTH / 30, WIDTH / 30); public Collision() { </code></pre> <p>//the following code creates the JFrame</p> <pre><code> super("Radical Racing"); setSize(WIDTH, HEIGHT); setDefaultCloseOperation(EXIT_ON_CLOSE); setVisible(true); </code></pre> <p>//start the inner class (which works on it's own because it is a thread)</p> <pre><code> Move1 m1 = new Move1(); Move2 m2 = new Move2(); m1.start(); m2.start(); } public void paint(Graphics g) { super.paint(g); </code></pre> <p>//draw the bckround for the racetrack</p> <pre><code> g.setColor(Color.DARK_GRAY); g.fillRect(0, 0, WIDTH, HEIGHT); </code></pre> <p>//When we drawthe border will be green</p> <pre><code> g.setColor(Color.GREEN); </code></pre> <p>//the following rectangle is the start line for the outer player</p> <pre><code> Rectangle lineO = new Rectangle(WIDTH / 9, HEIGHT / 2, (int) ((WIDTH / 9) * 1.5) / 2, HEIGHT / 140); </code></pre> <p>//the following rctangle is the start line for the inner player</p> <pre><code> Rectangle lineI = new Rectangle(((WIDTH / 9) + ((int) ((WIDTH / 9) * 1.5) / 2)), (HEIGHT / 2) + (HEIGHT / 10), (int) ((WIDTH / 9) * 1.5) / 2, HEIGHT / 140); </code></pre> <p>//now using the rectangles, draw it</p> <pre><code> g.fillRect(left.x, left.y, left.width, left.height); g.fillRect(right.x, right.y, right.width, right.height); g.fillRect(top.x, top.y, top.width, top.height); g.fillRect(bottom.x, bottom.y, bottom.width, bottom.height); g.fillRect(center.x, center.y, center.width, center.height); g.fillRect(obstacle.x, obstacle.y, obstacle.width, obstacle.height); g.fillRect(obstacle2.x, obstacle2.y, obstacle2.width, obstacle2.height); g.fillRect(obstacle3.x, obstacle3.y, obstacle3.width, obstacle3.height); g.fillRect(obstacle4.x, obstacle4.y, obstacle4.width, obstacle4.height); g.fillRect(obstacle5.x, obstacle5.y, obstacle5.width, obstacle5.height); </code></pre> <p>//set the starting line color</p> <pre><code> g.setColor(Color.WHITE); </code></pre> <p>//the draw the starting line</p> <pre><code> g.fillRect(lineO.x, lineO.y, lineO.width, lineO.height); g.fillRect(lineI.x, lineI.y, lineI.width, lineI.height); </code></pre> <p>//set the color of the finish line to yellow</p> <pre><code> g.setColor(Color.YELLOW); g.fillRect(finish.x, finish.y, finish.width, finish.height); </code></pre> <p>//set the color to blue for p1</p> <pre><code> g.setColor(Color.BLUE); </code></pre> <p>//now draw the actual player</p> <pre><code> g.fill3DRect(p1.x, p1.y, p1.width, p1.height, true); </code></pre> <p>//set the color to red for p2</p> <pre><code> g.setColor(Color.red); </code></pre> <p>//now draw the actual player</p> <pre><code> g.fill3DRect(p2.x, p2.y, p2.width, p2.height, true); } private class Move1 extends Thread implements KeyListener { public void run() { </code></pre> <p>//add the code to make the KeyListener "wake up"</p> <pre><code> addKeyListener(this); </code></pre> <p>//now, put the code should all be in an infinite loop, so the process repeats.</p> <pre><code> while (true) { </code></pre> <p>//now this should be in a "try" block. This will let the program exit if there is an error.</p> <pre><code> try { </code></pre> <p>//first refresh the screen:</p> <pre><code> repaint(); </code></pre> <p>//check to see if the car hits the outside of the walls. //If so make it slow it's speed by setting it's speed to .4.</p> <pre><code> if (p1.intersects(left) || p1.intersects(right) || p1.intersects(top) || p1.intersects(bottom) || p1.intersects(obstacle) || p1.intersects(obstacle2) || p1.intersects(p2) || p1.intersects(obstacle3) || p1.intersects(obstacle4) || p1.intersects(obstacle5)) { p1Speed = -4; } </code></pre> <p>//if the car hits the center, do the same as above but make the speed -2.5.</p> <pre><code> if (p1.intersects(center)) { p1Speed = -2.5; } </code></pre> <p>//increase speed a bit</p> <pre><code> if (p1Speed &lt;= 5) { p1Speed += .2; } </code></pre> <p>//these will move the player based on direction</p> <pre><code> if (p1Direction == UP) { p1.y -= (int) p1Speed; } if (p1Direction == DOWN) { p1.y += (int) p1Speed; } if (p1Direction == LEFT) { p1.x -= (int) p1Speed; } if (p1Direction == RIGHT) { p1.x += (int) p1Speed; } </code></pre> <p>//This delays the refresh rate</p> <pre><code> Thread.sleep(75); } catch (Exception e) { </code></pre> <p>//if there is an exception (an error), exit the loop</p> <pre><code> break; } } } </code></pre> <p>//You must also implement this method from Key Listener</p> <pre><code> public void keyPressed(KeyEvent event) { } </code></pre> <p>//You must also implement this method from key listener</p> <pre><code> public void keyReleased(KeyEvent event) { } </code></pre> <p>//You must also implement this method from key listener</p> <pre><code> public void keyTyped(KeyEvent event) { if (event.getKeyChar() == 'a') { p1Direction = LEFT; } if (event.getKeyChar() == 's') { p1Direction = DOWN; } if (event.getKeyChar() == 'd') { p1Direction = RIGHT; } if (event.getKeyChar() == 'w') { p1Direction = UP; } } } private class Move2 extends Thread implements KeyListener { public void run() { </code></pre> <p>//add the code to make the key listener wake up</p> <pre><code> addKeyListener(this); </code></pre> <p>//now this should all be in an infinite loop so that the process repeats</p> <pre><code> while (true) { </code></pre> <p>//now put the code in a try block. This will let the program exit if there is an error</p> <pre><code> try { </code></pre> <p>//first refresh the screen</p> <pre><code> repaint(); </code></pre> <p>//check to see if the car hits the outside walls. //if so make it slow its speed by setting it's speed to -4.</p> <pre><code> if (p2.intersects(left) || p2.intersects(right) || p2.intersects(top) || p2.intersects(bottom) || p2.intersects(obstacle) || p2.intersects(obstacle2)) { p2Speed = -4; } </code></pre> <p>//if the car hits the center, do the same as above but make the speed -2.5.</p> <pre><code> if (p2.intersects(center)) { p2Speed = -2.5; } </code></pre> <p>//increase speed a bit</p> <pre><code> if (p2Speed &lt;= 5) { p2Speed = .2; } </code></pre> <p>//these will move the player based off direction</p> <pre><code> if (p2Direction == UP) { p2.y-= (int) p2Speed; } if (p2Direction == DOWN) { p2.y+= (int) p2Speed; } if (p2Direction == LEFT) { p2.x-= (int) p2Speed; } if (p2Direction == RIGHT) { p2.x+= (int) p2Speed; } </code></pre> <p>//this delays the refresh rate:</p> <pre><code> Thread.sleep(75); } catch (Exception e) { </code></pre> <p>//if there is an exception, exit the loop.</p> <pre><code> break; } } } </code></pre> <p>//you must also implement this method from key listener</p> <pre><code> public void keyPressed(KeyEvent event) { } public void keyReleased(KeyEvent event) { } public void keyTyped(KeyEvent event) { if (event.getKeyChar() == 'j') { p2Direction = LEFT; } if (event.getKeyChar() == 'k') { p2Direction = DOWN; } if (event.getKeyChar() == 'l') { p2Direction = RIGHT; } if (event.getKeyChar() == 'i') { p2Direction = UP; } } } </code></pre> <p>//This starts the program by calling the constructor:</p> <pre><code>public static void main(String[] args) { new Collision(); } </code></pre> <p>}</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload