Потеря this в конструкторе - Java
Формулировка задачи:
Доброго времени суток
Имеется 5 файлов кода :
В классе Block Нетбинс пишет ошибку "потеря this в конструкторе" на строках:
А в классе LevelData пишет "использование статических неокончательных переменных при инициализации"
Посоветуйте как сделать так чтоб заработало.
Заранее спасибо всем кто откликнулся.
import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import java.util.ArrayList;
import java.util.HashMap;
public class Game extends Application {
public static ArrayList<Block> platforms = new ArrayList<>(); //храним платформы
private HashMap<KeyCode,Boolean> keys = new HashMap<>(); //’раник коды кнопок.
Image backgroundImg = new Image(getClass().getResourceAsStream("background.png"));
public static final int BLOCK_SIZE = 45;
public static final int MARIO_SIZE = 40;
public static Pane appRoot = new Pane();
public static Pane gameRoot = new Pane();
public Character player;
int levelNumber = 0;
private int levelWidth;
private void initContent(){
ImageView backgroundIV = new ImageView(backgroundImg);
backgroundIV.setFitHeight(14*BLOCK_SIZE);
backgroundIV.setFitWidth(212*BLOCK_SIZE);
levelWidth = LevelData.levels[levelNumber][0].length()*BLOCK_SIZE;
for(int i = 0; i < LevelData.levels[levelNumber].length; i++){
String line = LevelData.levels[levelNumber][i];
for(int j = 0; j < line.length();j++){
switch (line.charAt(j)){
case '0':
break;
case '1':
Block platformFloor = new Block(Block.BlockType.PLATFORM, j * BLOCK_SIZE, i * BLOCK_SIZE);
break;
case '2':
Block brick = new Block(Block.BlockType.BRICK,j*BLOCK_SIZE,i*BLOCK_SIZE);
break;
case '3':
Block bonus = new Block(Block.BlockType.BONUS,j*BLOCK_SIZE,i*BLOCK_SIZE);
break;
case '4':
Block stone = new Block(Block.BlockType.STONE,j * BLOCK_SIZE, i * BLOCK_SIZE);
break;
case '5':
Block PipeTopBlock = new Block(Block.BlockType.PIPE_TOP,j * BLOCK_SIZE, i * BLOCK_SIZE);
break;
case '6':
Block PipeBottomBlock = new Block(Block.BlockType.PIPE_BOTTOM,j * BLOCK_SIZE, i * BLOCK_SIZE);
break;
case '*':
Block InvisibleBlock = new Block(Block.BlockType.INVISIBLE_BLOCK,j * BLOCK_SIZE, i * BLOCK_SIZE);
break;
}
}
}
player =new Character();
player.setTranslateX(0);
player.setTranslateY(400);
player.translateXProperty().addListener((obs,old,newValue)->{
int offset = newValue.intValue();
if(offset>640 && offset<levelWidth-640){
gameRoot.setLayoutX(-(offset-640));
backgroundIV.setLayoutX(-(offset-640));
}
});
gameRoot.getChildren().add(player);
appRoot.getChildren().addAll(backgroundIV,gameRoot);
}
private void update(){
if(isPressed(KeyCode.UP) && player.getTranslateY()>=5){
player.jumpPlayer();
}
if(isPressed(KeyCode.LEFT) && player.getTranslateX()>=5){
player.setScaleX(-1);
player.animation.play();
player.moveX(-5);
}
if(isPressed(KeyCode.RIGHT) && player.getTranslateX()+40 <=levelWidth-5){
player.setScaleX(1);
player.animation.play();
player.moveX(5);
}
if(player.playerVelocity.getY()<10){ //гравитаци¤
player.playerVelocity = player.playerVelocity.add(0,1);
}
player.moveY((int)player.playerVelocity.getY());
}
private boolean isPressed(KeyCode key){
return keys.getOrDefault(key,false);
}
@Override
public void start(Stage primaryStage) throws Exception {
initContent();
Scene scene = new Scene(appRoot,1200,620);
scene.setOnKeyPressed(event-> keys.put(event.getCode(), true));
scene.setOnKeyReleased(event -> {
keys.put(event.getCode(), false);
player.animation.stop();
});
primaryStage.setTitle("Mini Mario");
primaryStage.setScene(scene);
primaryStage.show();
AnimationTimer timer = new AnimationTimer() {
@Override
public void handle(long now) {
update();
}
};
timer.start();
}
public static void main(String[] args) {
launch(args);
}
}import javafx.geometry.Point2D;
import javafx.geometry.Rectangle2D;
import javafx.scene.Node;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.Pane;
import javafx.util.Duration;
public class Character extends Pane{
Image marioImg = new Image(getClass().getResourceAsStream("mario.png"));
ImageView imageView = new ImageView(marioImg);
int count = 3;
int columns = 3;
int offsetX = 96;
int offsetY = 33;
int width = 16;
int height = 16;
public SpriteAnimation animation;
public Point2D playerVelocity = new Point2D(0,0);
private boolean canJump = true;
public Character(){
imageView.setFitHeight(40);
imageView.setFitWidth(40);
imageView.setViewport(new Rectangle2D(offsetX,offsetY,width,height));
animation = new SpriteAnimation(this.imageView,Duration.millis(200),count,columns,offsetX,offsetY,width,height);
getChildren().addAll(this.imageView);
}
public void moveX(int value){
boolean movingRight = value > 0;
for(int i = 0; i<Math.abs(value); i++) {
for (Node platform : Game.platforms) {
if(this.getBoundsInParent().intersects(platform.getBoundsInParent())) {
if (movingRight) {
if (this.getTranslateX() + Game.MARIO_SIZE == platform.getTranslateX()){
this.setTranslateX(this.getTranslateX() - 1);
return;
}
} else {
if (this.getTranslateX() == platform.getTranslateX() + Game.BLOCK_SIZE) {
this.setTranslateX(this.getTranslateX() + 1);
return;
}
}
}
}
this.setTranslateX(this.getTranslateX() + (movingRight ? 1 : -1));
}
}
public void moveY(int value){
boolean movingDown = value >0;
for(int i = 0; i < Math.abs(value); i++){
for(Block platform :Game.platforms){
if(getBoundsInParent().intersects(platform.getBoundsInParent())){
if(movingDown){
if(this.getTranslateY()+ Game.MARIO_SIZE == platform.getTranslateY()){
this.setTranslateY(this.getTranslateY()-1);
canJump = true;
return;
}
}
else{
if(this.getTranslateY() == platform.getTranslateY()+ Game.BLOCK_SIZE){
this.setTranslateY(this.getTranslateY()+1);
playerVelocity = new Point2D(0,10);
return;
}
}
}
}
this.setTranslateY(this.getTranslateY() + (movingDown?1:-1));
if(this.getTranslateY()>640){
this.setTranslateX(0);
this.setTranslateY(400);
Game.gameRoot.setLayoutX(0);
}
}
}
public void jumpPlayer(){
if(canJump){
playerVelocity = playerVelocity.add(0,-30);
canJump = false;
}
}
}import javafx.animation.Animation;
import javafx.animation.Interpolator;
import javafx.animation.Transition;
import javafx.geometry.Rectangle2D;
import javafx.scene.image.ImageView;
import javafx.util.Duration;
/**
* Created by ¬ладислав on 20.08.2015.
*/
public class SpriteAnimation extends Transition{
private final ImageView imageView;
private final int count;
private final int columns;
private int offsetX;
private int offsetY;
private final int width;
private final int height;
public SpriteAnimation(
ImageView imageView,
Duration duration,
int count, int columns,
int offsetX, int offsetY,
int width, int height
){
this.imageView = imageView;
this.count = count;
this.columns = columns;
this.offsetX = offsetX;
this.offsetY = offsetY;
this.width = width;
this.height = height;
setCycleDuration(duration);
setCycleCount(Animation.INDEFINITE);
setInterpolator(Interpolator.LINEAR);
this.imageView.setViewport(new Rectangle2D(offsetX, offsetY, width, height));
}
public void setOffsetX(int x){
this.offsetX = x;
}
public void setOffsetY(int y){
this.offsetY = y;
}
protected void interpolate(double frac) {
final int index = Math.min((int)Math.floor(count*frac), count-1);
final int x = (index%columns)*width+offsetX;
final int y = (index/columns)*height+offsetY;
imageView.setViewport(new Rectangle2D(x, y, width, height));
}
}public class LevelData {
static String[] LEVEL1 =new String[]{
"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"00000000000000000000003000000000000000000000000000000000000000000000000000000000222222220002223000000000000003000000000002220000233200000000000000000000000000000000000000000000000000000000440000000000000000000000",
"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004440000000000000000000000",
"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044440000000000000000000000",
"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000444440000000000000000000000",
"00000000000000002000232320000000000000000000005*0000000005*000000000000000000232000000000000002000002200003003003000002000000000022000000400400000000004400400000000000022320000000000004444440000000000000000000000",
"000000000000000000000000000000000000005*0000006*0000000006*000000000000000000000000000000000000000000000000000000000000000000000000000004400440000000044400440000000000000000000000000044444440000000000000000000000",
};
public static String[][] levels= new String[][]{
LEVEL1
};
}import javafx.geometry.Rectangle2D;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.Pane;
public class Block extends Pane {
Image blocksImg = new Image(getClass().getResourceAsStream("1.png"));
ImageView block;
public enum BlockType {
PLATFORM, BRICK, BONUS, PIPE_TOP, PIPE_BOTTOM, INVISIBLE_BLOCK, STONE
}
public Block(BlockType blockType, int x, int y) {
block = new ImageView(blocksImg);
block.setFitWidth(Game.BLOCK_SIZE);
block.setFitHeight(Game.BLOCK_SIZE);
setTranslateX(x);
setTranslateY(y);
switch (blockType) {
case PLATFORM:
block.setViewport(new Rectangle2D(0, 0, 16, 16));
break;
case BRICK:
block.setViewport(new Rectangle2D(16, 0, 16, 16));
break;
case BONUS:
block.setViewport(new Rectangle2D(384, 0, 16, 16));
break;
case PIPE_TOP:
block.setViewport(new Rectangle2D(0, 128, 32, 16));
block.setFitWidth(Game.BLOCK_SIZE * 2);
break;
case PIPE_BOTTOM:
block.setViewport(new Rectangle2D(0, 145, 32, 14));
block.setFitWidth(Game.BLOCK_SIZE * 2);
break;
case INVISIBLE_BLOCK:
block.setViewport(new Rectangle2D(0, 0, 16, 16));
block.setOpacity(0);
break;
case STONE:
block.setViewport(new Rectangle2D(0, 16, 16, 16));
break;
}
getChildren().add(block);
Game.platforms.add(this);
Game.gameRoot.getChildren().add(this);
}
} Game.platforms.add(this);
Game.gameRoot.getChildren().add(this);Решение задачи: «Потеря this в конструкторе»
textual
Листинг программы
public class Block extends Pane {
private Image blocksImg = new Image(getClass().getResourceAsStream("1.png"));
private ImageView block;
public static enum BlockType {
PLATFORM, BRICK, BONUS, PIPE_TOP, PIPE_BOTTOM, INVISIBLE_BLOCK, STONE
}
public static Block create(BlockType blockType, int x, int y) {
Block b = new Block(blockType, x, y);
Game.platforms.add(b);
try {
Game.gameRoot.getChildren().add(b);
} catch (RuntimeException e) {
Game.platforms.remove(b);
throw e;
}
return b;
}
protected Block(BlockType blockType, int x, int y) {
block = new ImageView(blocksImg);
block.setFitWidth(Game.BLOCK_SIZE);
block.setFitHeight(Game.BLOCK_SIZE);
setTranslateX(x);
setTranslateY(y);
switch (blockType) {
case PLATFORM:
block.setViewport(new Rectangle2D(0, 0, 16, 16));
break;
case BRICK:
block.setViewport(new Rectangle2D(16, 0, 16, 16));
break;
case BONUS:
block.setViewport(new Rectangle2D(384, 0, 16, 16));
break;
case PIPE_TOP:
block.setViewport(new Rectangle2D(0, 128, 32, 16));
block.setFitWidth(Game.BLOCK_SIZE * 2);
break;
case PIPE_BOTTOM:
block.setViewport(new Rectangle2D(0, 145, 32, 14));
block.setFitWidth(Game.BLOCK_SIZE * 2);
break;
case INVISIBLE_BLOCK:
block.setViewport(new Rectangle2D(0, 0, 16, 16));
block.setOpacity(0);
break;
case STONE:
block.setViewport(new Rectangle2D(0, 16, 16, 16));
break;
}
getChildren().add(block);
}
}