2

ゲームに射撃を追加しようとしていますが、Playerクラスを抽象に変更できないか、正しく機能しないため、実行できる操作に制限があります。

私はこれにアプローチするために何百万もの異なる方法を試しましたが、どれもうまくいきませんでした。私は無駄にビデオチュートリアルを検索し、検索し、見ました。これが私の最後の手段です。誰かが私を助けてくれると確信しています。

これは私の最初のアプレットですが、Javaは初めてではありません。これは2Dゲームではありません。これは私が取り組んできた基本的な実験にすぎません。

MainClass.java

/**
 *
 * @author Alexander Benoit
 */
import java.applet.*;
import java.awt.*;

public class MainClass extends Applet implements Runnable {

    private static final long serialVersionUID = 1L;
    Thread thread = new Thread(this);
    boolean running = true;
    Player p;
    Enemy e;
    Image dbImage;
    Graphics dbg;
    int xpos;
    int ypos;
    int mousex;
    int mousey;

    @Override
    public void init() {
        setSize(400, 400);
        p = new Player(this);
        e = new Enemy(this);
    }

    @Override
    public void start() {
        thread.start();
    }

    @Override
    public void destroy() {
        running = false;
    }

    @Override
    public void stop() {
        running = false;
    }


    @Override
    public void run() {
        while (running) {
            repaint();
            p.update(this);
            e.update(this, p);
            try {
                Thread.sleep(20);
            } catch (InterruptedException e) {
                System.out.print("Error occured");
            }
        }

    }

    @Override
    public void update(Graphics g) {
        dbImage = createImage(getWidth(), getHeight());
        dbg = dbImage.getGraphics();
        paint(dbg);
        g.drawImage(dbImage, 0, 0, this);
    }

    @Override
    public void paint(Graphics g) {
        g.drawString("Game", 180, 20);
        p.paint(g, this);
        e.paint(g, this);
    }
}

Player.java

/**
 *
 * @author Alexander Benoit
 */
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.net.URL;

public class Player implements KeyListener {

    private int x = 200, y = 200, velX = 0, velY = 0;
    private URL url;
    private Image player;
    private Image playerimg;
    private Image Image;
    public boolean isShooting;


    public Player(MainClass mc) {
        url = mc.getDocumentBase();
        player = mc.getImage(url, "http://i563.photobucket.com/albums/ss75/belhelmiel/player-1.png");
    }

    public void update(MainClass mc) {
        mc.addKeyListener(this);
        x += velX;
        y += velY;
    }

    public void paint(Graphics g, MainClass mc) {
        g.drawImage(player, x, y, mc);
        g.drawString("X:" + x + " Y:" + y, 10, 10);
        //g.drawRect(x, y, 50, 50);
    }

    @Override
    public void keyTyped(KeyEvent e) {
        //throw new UnsupportedOperationException("Not supported yet.");
    }


    @Override
    public void keyPressed(KeyEvent e) {
        switch (e.getKeyCode()) {

            case KeyEvent.VK_SPACE: {
                //This should make the player start shooting
                //I've tried a million different things
                //each one gave me some kind of problem primarily
                //because I can't set this class to abstract
                break;
            }

            case KeyEvent.VK_RIGHT: {
                if (x >= 430) {
                    x = -40;
                }
                velX = 2;
                break;
            }
            case KeyEvent.VK_LEFT: {
                if (x <= -40) {
                    x = 430;
                }
                velX = -2;
                break;
            }
            case KeyEvent.VK_UP: {
                if (y <= -35) {
                    y = 430;
                }
                velY = -2;
                break;
            }
            case KeyEvent.VK_DOWN: {
                if (y >= 400) {
                    y = -30;
                }
                velY = 2;
                break;
            }
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        switch (e.getKeyCode()) {
            case KeyEvent.VK_SPACE: {
                //This should make the player stop shooting
                break;
            }

            case KeyEvent.VK_RIGHT: {
                velX = 0;
                break;
            }
            case KeyEvent.VK_LEFT: {
                velX = 0;
                break;
            }
            case KeyEvent.VK_UP: {
                velY = 0;
                break;
            }
            case KeyEvent.VK_DOWN: {
                velY = 0;
                break;
            }
        }
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    void restart() {
        x = 200 - 38 / 2;
        y = 200 - 38 / 2;
    }
}

Enemy.java

import java.awt.Graphics;
import java.awt.Image;
import java.net.URL;

/**
 *
 * @author Alexander Benoit
 */
public class Enemy {

    private int x = 50, y = 50, Speed=3;
    private URL url;
    private Image enemy;

    public Enemy(MainClass mc) {
        url = mc.getDocumentBase();
        enemy = mc.getImage(url, "http://i563.photobucket.com/albums/ss75/belhelmiel/enemy.png");
    }

    public void update(MainClass mc, Player p) {
        x+=Speed;
        if(x<=0){
            Speed=3;
        }else if(x>=mc.getWidth()-33){
            Speed=-3;
        }

        Collision(p);
    }

    public void paint(Graphics g, MainClass mc) {
        g.drawImage(enemy, x, y, mc);
    }

    private void Collision(Player p) {
        int PX = p.getX();
        int PY = p.getY();

        if(PX-38 <= x && PX+38 >= x && PY-38 <= y && PY+38 >= y) {
            p.restart();
            System.out.print("Collision Detected");
        }
    }
}

十分な情報を提供できない場合は申し訳ありませんが、長い間これを理解しようとした後、オンラインで役立つ情報が見つからないため、私自身も情報が不足しています。

要約:スペースバーがプレイヤーによって押されたときに、ある種の弾丸を発射させる必要があります。keylistenerの使用方法は知っていますが、Playerクラスをabstractに設定しないと、「Graphics g」でkeylistenerを使用できません。これは、実行できないか、ゲームが機能しません。私はこれを行う方法を見つけようと永遠に検索しましたが、役に立ちませんでした。これがちょっと奇妙に思えるなら申し訳ありませんが、私は再起動したほうがいいかもしれませんが、私はこれに何時間も取り組んできました。

4

1 に答える 1

2

プレーヤークラスを抽象に設定しなくても、キーリスナーとグラフィックスを確実に操作できます。インターフェイスで宣言されているすべてのメソッドを実装する必要があります。ここで抽象クラスについて、ここAWT/Swingペインティングについて学ぶことができます。

于 2012-09-10T20:32:26.777 に答える