Reputation: 263
I know there are a lot of answers for this but they don't seem to work. I don't know whether I am somehow using a different version of Java or the code for applet's is different but here's my code:
Snippet from HUD class:
public void paint (Graphics g)
{
if(g instanceof Graphics2D)
{
Graphics2D g2d = (Graphics2D)g;
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2d.drawString("This is gona be awesome", 200, 200);
}
Main Class:
import java.applet.Applet; (more, they just glitched with the code block)
public class Main extends Applet implements Runnable, KeyListener {
static ArrayList<Block> all_blocks = new ArrayList<Block>();
Player player;
HUD hud;
static int amount = 0;
public void init(){
setSize(700, 500);
addKeyListener(this);
}
public void start(){
player = new Player(100, 100);
HUD hud = new HUD();
for (int i = 0; i < 75; i++){
new Grass(i*30, 400);
}
new Spikes(250, 370);
Thread thread = new Thread(this);
thread.start();
}
@Override
public void run() {
while (true){
player.update();
repaint();
camera_scroll(this.amount);
try {
Thread.sleep(17);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void stop(){
}
public void camera_scroll(int amount){
int new_amount;
if (amount > 30){
new_amount = 30;
this.amount -= 30;
} else {
new_amount = amount;
this.amount = 0;
}
for (Block b: all_blocks){
b.x += new_amount;
b.update();
}
player.x += new_amount;
}
public void paint(Graphics g){
for (Block block: all_blocks){
block.paint(g);
}
hud.paint(g);
player.paint(g);
}
@Override
public void keyPressed(KeyEvent e) {
switch(e.getKeyCode()){
case KeyEvent.VK_LEFT:
case KeyEvent.VK_A:
player.moveLeft();
break;
case KeyEvent.VK_RIGHT:
case KeyEvent.VK_D:
player.moveRight();
break;
case KeyEvent.VK_UP:
case KeyEvent.VK_W:
player.moveUp();
break;
}
}
@Override
public void keyReleased(KeyEvent e) {
switch(e.getKeyCode()){
case KeyEvent.VK_LEFT:
case KeyEvent.VK_A:
player.stopLeft();
break;
case KeyEvent.VK_RIGHT:
case KeyEvent.VK_D:
player.stopRight();
break;
case KeyEvent.VK_UP:
case KeyEvent.VK_W:
player.stopUp();
break;
}
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
}
Drawing of the player and blocks work fine and their paint method is identical to HUD's but they draw images instead. Let me know if you need anything else. Thanks!
Upvotes: 0
Views: 490
Reputation: 347234
There are two main issues...
You are creating instance of objects within the start
method, when they should be created in your init
method.
start
can be called multiple times (normally after stop
is called) to get the applet to continue. This is not a good place to try and initialize the state of your underlying applet, instead, it would be better used to restart the Thread
(assuming you also stop it when stop
is called)...
So, instead of...
public void init(){
setSize(700, 500);
addKeyListener(this);
}
public void start(){
player = new Player(100, 100);
HUD hud = new HUD();
for (int i = 0; i < 75; i++){
new Grass(i*30, 400);
}
new Spikes(250, 370);
Thread thread = new Thread(this);
thread.start();
}
you should be using something like...
public void init(){
setSize(700, 500);
addKeyListener(this);
player = new Player(100, 100);
HUD hud = new HUD();
for (int i = 0; i < 75; i++){
new Grass(i*30, 400);
}
new Spikes(250, 370);
}
public void start(){
Thread thread = new Thread(this);
thread.start();
}
You are creating a local instance of your objects, shadowing your instance fields, which is causing a NullPointerException
(for me it was in paint
...
So instead of
public void init(){
setSize(700, 500);
addKeyListener(this);
player = new Player(100, 100);
HUD hud = new HUD();
for (int i = 0; i < 75; i++){
new Grass(i*30, 400);
}
new Spikes(250, 370);
}
You should be using...
public void init(){
setSize(700, 500);
addKeyListener(this);
player = new Player(100, 100);
hud = new HUD();
// Notice that HUD has not been re-declared...
for (int i = 0; i < 75; i++){
new Grass(i*30, 400);
}
new Spikes(250, 370);
}
JApplet
instead...JFrame
as you core, top level container.JPanel
and override it's paintComponent
method to perform custom painting. This is recommended for a number of reasons, including the fact that painting is actually quite involved and complicated and it is very easy to break the paint chain and top level containers aren't double buffered, which will cause flickering. Swing components (apart from there top level counterparts) are double buffered by default. Take a look at Painting in AWT and Swing and Performing Custom Painting for more detailsKeyListener
s are notorious for having issues related to focus. If you move to the Swing API, it is best to use the Key Bindings APIUpvotes: 2