2017-05-21 11 views
-1

私はマリオゲームに取り組んでいます。これまでは、背景、動き(重力を含む)のコードを作成し、レベルの始めに1つのヒゲを挿入しました。フレームは決して終わりのないループで繰り返されます。残念なことに、プログラムを実行すると、マリオの動きに合わせてマリオのキャラクターが残っています(マリオが右に動いているので、ヒキガエルは彼を追いかけます)。私は、マリオがスクリーンを離れたときにヒキガエルが残っていることを願っています。 Goombaを殺さないことを選択した場合、あなたが十分に右に移動した後、Goombaは画面に表示されません。これどうやってするの?ここでToadは画面上にマリオと一緒にいないようにする

は、私のコードの一部全体のレベルが3000であれば基本的に、私は、例えばマリオのゲーム - のようなフレームワークを作る方法を見つけることにこだわっています

import java.awt.Image; 
import javax.swing.ImageIcon; 

public class Toads { 
    int x, y, nx, nx2, distanceTraveled; 
    Image i; 
    ImageIcon redToad = new ImageIcon("images/toad2.png"); 

    public Toads() { 
     i = redToad.getImage();              //Give the player the image 
     x = 190;                     //The original x position of the player 
     y = 273;                    //The original y position of the player 
     nx = -0;                    //Repeating background 1 
     nx2 = -575;                   //Repeating background 2 
     distanceTraveled = 24; 
} 
public Image getImage() {return i;} 
    import java.awt.*;                   
    import java.awt.event.*;                   

import javax.swing.*; 

public class board extends JPanel implements ActionListener { 
     player p;                     
     Image background, menuBg;                 
     Timer time;                    
    private menu Menu; 
    private frame Frame; 
    private Toads toad; 

    public static enum STATE {MENU,HELP,GAME}; 

    public static STATE State = STATE.MENU; 

    public board() { 
      this.addMouseListener(new mouseInput()); 
      p = new player();                  
      Menu = new menu(); 
      toad = new Toads(); 
      addKeyListener(new AL());               //Listen for keys 
      setFocusable(true);                             //Allows movement   
      ImageIcon i = new ImageIcon("images/MarioMenu.jpg");     //Image for menu 
      menuBg = i.getImage(); 
      i = new ImageIcon("images/Mario_Background.png"); //Image for background 
      background = i.getImage();               //Give the background the image 
      time = new Timer(20,this);               //Timer set to update "this" class every 20 milliseconds(Approximately 50fps) 
      time.start();                  //Actually start the timer 
    } 

    public void actionPerformed(ActionEvent e) { 
      p.move();                   //Call the move method from the player class 
      repaint();                   //Repaint 
    } 

    public void paintComponent(Graphics g) {             //Graphics method 
      if(State==STATE.GAME) { 
        super.paintComponent(g); 
          Graphics2D g2d = (Graphics2D) g;            //casts 2d graphics(or however you would explain it) 

          g2d.drawImage(background, -p.nx, 0, null);         //Draw the background image 
          g2d.drawImage(background, -p.nx2, 0, null);         //Draw the background image 

          if(-p.nx<-575)                //If going forwards 
            p.nx=-575;                //Start placing forwards every 575px in front on the last one 
          else if(-p.nx>575)               //If going backwards 
            p.nx=575;                //Start placing backwards every 575px behind the last one 

          if(-p.nx2<-575)                //If going forwards 
            p.nx2=-575;                //Start placing forwards every 575px in front on the last one 
          else if(-p.nx2>575)               //If going backwards 
            p.nx2=575;                //Start placing backgrounds every 575px behind the last one 

          g2d.drawImage(p.getImage(), p.getX(), p.getY(), null);      //Draw the player at the position he is currently(Coordinate values taken from player class) 
          g2d.drawImage(toad.getImage(), toad.x, toad.y, null); 
      } 
      else if (State == STATE.HELP){ 

      } 
      else { 
        g.drawImage(menuBg, 0, 0, null); 
        Menu.render(g); 
      } 
    } 

    private class AL extends KeyAdapter {             //Action Listener extends key adapter 
      public void keyPressed(KeyEvent e) {             //On key press 
        p.keyPressed(e);                 //Send whatever key was pressed TO the keyPressed method in the player class 
      } 
      public void keyReleased(KeyEvent e) {            //On key release 
        p.keyReleased(e);                //Send whatever key was released TO the keyReleased method in the player class 
      } 
    } 

}

ですピクセルを3000ピクセルにすると、画面が500ピクセル×500ピクセルで、マリオが動きます(他の「スクリーン」のオブジェクトはマリオと一緒に動きません)。 ご協力いただきありがとうございます。

答えて

0

screenXとscreenYという変数を作成します。これは、ワールド全体の左上隅を基準にして、プレーヤにレンダリングされる画面の左上の座標です。レンダリングの際には、まず、単純な長方形の衝突チェックを実行して、オブジェクトが画面上にあるかどうかを確認します。画面上にある場合は、(actualX - screenX, actualY - screenY)にレンダリングします。それはあなたが必要とするものを正確に行うはずです。

関連する問題