Reputation: 49
I know this question has been answered elsewhere, but none of them seem to work. I don't know if the solution is different depending on the code, but that's what I'm guessing. Anyway, all I want to do is take this simple Applet (a Pong game) and change it to an Application. That's possible right? Thank you in advance! :)
package net.laserball.src;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.WindowEvent;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import javax.swing.JApplet;
import javax.swing.JComponent;
public class LaserBallMain extends JApplet
{
private static final long serialVersionUID = 1L;
public static final int WIDTH = 400;
public static final int HEIGHT = 400;
private PaintSurface canvas;
public void init()
{
this.setSize(WIDTH, HEIGHT);
canvas = new PaintSurface();
this.add(canvas, BorderLayout.CENTER);
ScheduledThreadPoolExecutor executor =
new ScheduledThreadPoolExecutor(3);
executor.scheduleAtFixedRate(
new AnimationThread(this),
0L, 20L, TimeUnit.MILLISECONDS);
}
}
class AnimationThread implements Runnable
{
JApplet c;
public AnimationThread(JApplet c)
{
this.c = c;
}
public void run()
{
c.repaint();
}
}
class PaintSurface extends JComponent
{
private static final long serialVersionUID = 1L;
int paddle_x = 0;
int paddle_y = 360;
int score = 0;
float english = 1.0F;
Ball ball;
Color[] color = {Color.RED, Color.ORANGE,
Color.MAGENTA, Color.ORANGE,
Color.CYAN, Color.BLUE};
int colorIndex;
public PaintSurface()
{
addMouseMotionListener(new MouseMotionAdapter()
{
public void mouseMoved(MouseEvent e)
{
if(e.getX() - 30 - paddle_x > 5)
english = -1.5F;
else if (e.getX() - 30 - paddle_x < -5)
english = -1.5F;
else
english = 1.0F;
paddle_x = e.getX() - 30;
}
});
ball = new Ball(20);
}
public void paint(Graphics g)
{
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
Shape paddle = new Rectangle2D.Float(
paddle_x, paddle_y, 60, 8);
g2.setColor(color[colorIndex % 6]);
if(ball.intersects(paddle_x, paddle_y, 60, 8)
&& ball.y_speed > 0)
{
ball.y_speed = -ball.y_speed;
ball.x_speed = (int)(ball.x_speed * english);
if(english != 1.0F)
colorIndex++;
score += Math.abs(ball.x_speed * 10);
}
if(ball.getY() + ball.getHeight()
>= LaserBallMain.HEIGHT)
{
ball = new Ball(20);
score -= 1000;
colorIndex = 0;
}
ball.move();
g2.fill(ball);
g2.setColor(Color.BLACK);
g2.fill(paddle);
g2.drawString("Score: " + score, 250, 20);
}
}
class Ball extends Ellipse2D.Float
{
private static final long serialVersionUID = 1L;
public int x_speed, y_speed;
private int d;
private int width = LaserBallMain.WIDTH;
private int height = LaserBallMain.HEIGHT;
public Ball(int diameter)
{
super((int)(Math.random() * (LaserBallMain.WIDTH - 20) + 1),
0, diameter, diameter);
this.d = diameter;
this.x_speed = (int)(Math.random() * 5 + 5);
this.y_speed = (int)(Math.random() * 5 + 5);
}
public void move()
{
if(super.x < 0 || super.x > width - d)
x_speed = -x_speed;
if(super.y < 0 || super.y > height - d)
y_speed = -y_speed;
super.x += x_speed;
super.y += y_speed;
}
}
Upvotes: 1
Views: 1621
Reputation: 1084
LaserBallMain laserBallMain = new LaserBallMain();
JFrame frame = new JFrame();
frame.setLayout(new GridLayout(1, 1));
frame.add(laserBallMain);
// Set frame size and other properties
...
// Call applet methods
laserBallMain.init();
laserBallMain.start();
frame.setVisible(true);
Upvotes: 0
Reputation: 347184
Main
Main
called public static void main(String args[])
main
method use EventQueue.invokeLater
and pass it a Runnable
to execute the initial program logic within the Event Dispatching Thread...For example...
EventQueue.invokeLater(new Runnable() {
public void run() {
}
});
JFrame
.init
method within the run
method as well, but instead of adding canvas
to the applet, add it to the frame (you created in the previous step).You will probably need to override getPreferredSize
of the PaintSurface
class, returning an appropriate size of the game surface.
You should also take a look at Performing Custom Painting and you might find How to use Swing Timers interesting as well.
Personally, I would move the entire program logic to some other class, may be a JPanel
for example, then you would only need to add this component to whatever container you wanted
Upvotes: 2