Потеря 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); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д