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