2012-09-10 48 views
2

我試圖將拍攝添加到我的遊戲中,但我無法將我的Pl​​ayer類更改爲抽象類型,或者它無法正常工作,因此我僅限於我可以執行的操作。併發症將圖形添加到KeyListener

我試過一百萬種不同的方法來解決這個問題,但都沒有成功。我搜索並搜索並觀看視頻教程無濟於事。這是我的最後一招,我肯定有人可以幫助我。

這是我的第一個小程序,但我不是新來的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,但是我不能使用keylistener和「Graphics g」,而沒有將我的Pl​​ayer類設置爲抽象類型,這是我不能做的,或者我的遊戲無法工作。我一直在尋找如何做到這一點,但無濟於事。對不起,如果這看起來有點奇怪,它可能只是重新啓動,但我已經在這工作了幾個小時。

+8

第一個小程序..遊戲(動畫渲染)..觀看視頻教程.. - 組合和混合形成災難的食譜。你是否在一個框架或更好的面板中完成了遊戲渲染?我推薦在JFrame中交換'Applet',在'JPanel'中交換'paintComponent()'的'paint()',爲鍵綁定交換'KeyListener'。此外,爲了更快提供更好的幫助,請發佈[SSCCE](http://sscce.org/)。它是「Java小程序」,而不是「JAVA小程序」。 –

回答

2

你一定可以使用keylistener和圖形,而無需將你的播放器類設置爲抽象。你只需要實現在接口中聲明的所有方法。您可以瞭解抽象類here以及關於AWT/Swing繪畫here