0

基本的なトップダウン シューターを作ろうとしていますが、敵のスポーンに少し問題があります。スポーンを正しく機能させることができましたが、衝突長方形を追加しようとすると、初期化時に静的になり、静的にすると、X と Y が静的になり、そうではありません。オプションです。

プレイ可能なキャラクターを表すプレイヤー クラスがあり、そのクラスでは四角形が正常に機能するため、クラス インスタンスと関係があると思います。

package com.space.shooter;

import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Image;
import org.newdawn.slick.Input;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.geom.Rectangle;

public class Enemy extends Entity{
int carPosX;
float carPosY;
static Rectangle enemyCollisionBox;
static Image car;

Enemy(int x, int y) {
    super(x, y);
    carPosX = x;
    carPosY = y;
}

static void init () throws SlickException{
    car = new Image ("src/data/Car.png");
    enemyCollisionBox = new Rectangle(carPosX, -36, car.getWidth(), car.getHeight());
}

boolean isDestroyed(){
    if (carPosY > Engine.height){
        return true;
    }
    return false;
}

static void spawn(int x) throws SlickException{

    switch (x){

    case (0):
        x = Engine.width/2-40;
        break;
    case (1):
        x = Engine.width/2-10;
        break;
    case (2):
        x = Engine.width/2+20;
        break;
    }

    Play.enemies.add(new Enemy(x, -36));
    //System.out.println(Play.enemies.size());
    init();
}

void update (GameContainer gc){
    Input input = gc.getInput();

    if (input.isKeyDown(Input.KEY_SPACE)){
        carPosY += 6 + (1 * Play.level);
    } else {
        carPosY += 0.95 + (1 * Play.level); // was 0.95;
    }
}

void render(GameContainer gc, Graphics g){
    g.drawImage(car, carPosX, carPosY);
}
}

私のコードをあまり厳しく判断しないでください。本格的なゲームを試すのはこれが初めてで、絶望からコードを追加していて、少し面倒です。この投稿では、コードに最後に手を加える必要があったため、少し間違っている可能性があります。

四角形の問題の解決策がわかりません。

ありがとう

4

1 に答える 1

0

init メソッドの内容を次のように変更します。

package com.space.shooter;

import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Image;
import org.newdawn.slick.Input;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.geom.Rectangle;

public class Enemy extends Entity{
    int carPosX;
    float carPosY;
    Rectangle enemyCollisionBox;
    static Image car=null;

    Enemy(int x, int y) {
        super(x, y);
        carPosX = x;
        carPosY = y;
        enemyCollisionBox = new Rectangle(carPosX, -36, car.getWidth(), car.getHeight());
    }

    static void init () throws SlickException{
        if(car==null)car = new Image ("src/data/Car.png");
    }

    boolean isDestroyed(){
        if (carPosY > Engine.height){
            return true;
        }
        return false;
    }

    static void spawn(int x) throws SlickException{

        switch (x){

        case (0):
            x = Engine.width/2-40;
            break;
        case (1):
            x = Engine.width/2-10;
            break;
        case (2):
            x = Engine.width/2+20;
            break;
        }

        init();
        Play.enemies.add(new Enemy(x, -36));
        //System.out.println(Play.enemies.size());
    }

    void update (GameContainer gc){
        Input input = gc.getInput();

        if (input.isKeyDown(Input.KEY_SPACE)){
            carPosY += 6 + (1 * Play.level);
        } else {
            carPosY += 0.95 + (1 * Play.level); // was 0.95;
        }
    }

    void render(GameContainer gc, Graphics g){
        g.drawImage(car, carPosX, carPosY);
    }
}

これにより、衝突ボックスが である必要があるという問題は解決しますがstatic、 に関する詳細は提供されていませんNullPointerExceptionImageまた、新しい敵を作成するたびに車をリロードしないようにするためのチェックも追加しました。多くのリソースがある場合は、ゲームの開始前にそれらをプリロードする必要があります。


staticキーワードの仕組みをよりよく説明するため。

staticメソッドと変数は(an )classのインスタンスではなくに属します。これは、アクセスが必要な場所ならどこからでもメソッド/変数にアクセスできることを意味します ( / / )。メソッドはオブジェクトに接続されていないため、インスタンス (非静的) 変数にアクセスするには、メソッドを に渡して、それを介してアクセスする必要があります。classobjectstaticprivatepublicprotectedstaticObjectObject

于 2013-08-09T10:16:13.430 に答える