Hi,
This is my 1st post here for a few years, i have just returned to java.
I am working through a java gaming book, and the "The method clone() from the type Object is not visible" appears, preventing the program from running. I understand "clone" as making a new copy of an object, allowing multiple different copies to be made.
The error occurs here
public Object clone() {
// use reflection to create the correct subclass
Constructor constructor = getClass().getConstructors()[0];
try {
return constructor.newInstance(new Object[] {
(Animation)left.clone(),
(Animation)right.clone(),
(Animation)deadLeft.clone(),
(Animation)deadRight.clone()
});
}
catch (Exception ex) {
// should never happen
ex.printStackTrace();
return null;
}
}
The whole code for this class is here
package tilegame.sprites;
import java.lang.reflect.Constructor;
import graphics.*;
/**
A Creature is a Sprite that is affected by gravity and can
die. It has four Animations: moving left, moving right,
dying on the left, and dying on the right.
*/
public abstract class Creature extends Sprite {
/**
Amount of time to go from STATE_DYING to STATE_DEAD.
*/
private static final int DIE_TIME = 1000;
public static final int STATE_NORMAL = 0;
public static final int STATE_DYING = 1;
public static final int STATE_DEAD = 2;
private Animation left;
private Animation right;
private Animation deadLeft;
private Animation deadRight;
private int state;
private long stateTime;
/**
Creates a new Creature with the specified Animations.
*/
public Creature(Animation left, Animation right,
Animation deadLeft, Animation deadRight)
{
super(right);
this.left = left;
this.right = right;
this.deadLeft = deadLeft;
this.deadRight = deadRight;
state = STATE_NORMAL;
}
public Object clone() {
// use reflection to create the correct subclass
Constructor constructor = getClass().getConstructors()[0];
try {
return constructor.newInstance(new Object[] {
(Animation)left.clone(),
(Animation)right.clone(),
(Animation)deadLeft.clone(),
(Animation)deadRight.clone()
});
}
catch (Exception ex) {
// should never happen
ex.printStackTrace();
return null;
}
}
/**
Gets the maximum speed of this Creature.
*/
public float getMaxSpeed() {
return 0;
}
/**
Wakes up the creature when the Creature first appears
on screen. Normally, the creature starts moving left.
*/
public void wakeUp() {
if (getState() == STATE_NORMAL && getVelocityX() == 0) {
setVelocityX(-getMaxSpeed());
}
}
/**
Gets the state of this Creature. The state is either
STATE_NORMAL, STATE_DYING, or STATE_DEAD.
*/
public int getState() {
return state;
}
/**
Sets the state of this Creature to STATE_NORMAL,
STATE_DYING, or STATE_DEAD.
*/
public void setState(int state) {
if (this.state != state) {
this.state = state;
stateTime = 0;
if (state == STATE_DYING) {
setVelocityX(0);
setVelocityY(0);
}
}
}
/**
Checks if this creature is alive.
*/
public boolean isAlive() {
return (state == STATE_NORMAL);
}
/**
Checks if this creature is flying.
*/
public boolean isFlying() {
return false;
}
/**
Called before update() if the creature collided with a
tile horizontally.
*/
public void collideHorizontal() {
setVelocityX(-getVelocityX());
}
/**
Called before update() if the creature collided with a
tile vertically.
*/
public void collideVertical() {
setVelocityY(0);
}
/**
Updates the animaton for this creature.
*/
public void update(long elapsedTime) {
// select the correct Animation
Animation newAnim = anim;
if (getVelocityX() < 0) {
newAnim = left;
}
else if (getVelocityX() > 0) {
newAnim = right;
}
if (state == STATE_DYING && newAnim == left) {
newAnim = deadLeft;
}
else if (state == STATE_DYING && newAnim == right) {
newAnim = deadRight;
}
// update the Animation
if (anim != newAnim) {
anim = newAnim;
anim.start();
}
else {
anim.update(elapsedTime);
}
// update to "dead" state
stateTime += elapsedTime;
if (state == STATE_DYING && stateTime >= DIE_TIME) {
setState(STATE_DEAD);
}
}
}
Any advice? Is it "protected"? Is the code out-of-date?
thankyou,
Lance 28