2012-03-06 30 views
1

即時製作一個側面滾動,我不知道如何側滾動和im試圖在x和y軸滾動 這是一個學校項目,所以我希望儘快幫助possablejava編程:如何移動顯示

繼承人一些我的代碼,如果你有問題就問。歡迎任何建議。

源代碼http://www.mediafire.com/?fi1f9lv6qc2t5d7

gameCanvas.java

package Game; 
import java.awt.*; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.awt.image.BufferStrategy; 


@SuppressWarnings("serial") 
public abstract class GameCanvas extends Canvas implements Runnable,KeyListener{ 
public static final long ONE_SECOND_MILI = 1000; 
protected int frameW; 
protected int frameH; 
protected long fps; 
private long period = 15; 
private BufferStrategy buff; 
private Graphics graph; 
private Color bckGround=(Color.GRAY); 
private Image bckGround_img; 
private Thread t; 
boolean left; 
boolean right; 
boolean up; 
boolean down; 
int lastpressed; 
int newlastpressed; 

private String drawFps = "0"; 
    public GameCanvas(int w,int h){ 
     this.frameW=w; 
     this.frameH=h; 
     this.setIgnoreRepaint(true); 
     this.setBounds(0,0,frameW,frameH); 
     this.setBackground(Color.GREEN); 
     this.setVisible(true); 
    } 

    public GameCanvas(int w,int h,Color bck){ 
     this.frameW=w; 
     this.frameH=h; 
     this.bckGround=bck; 
     this.setIgnoreRepaint(true); 
     this.setBounds(0,0,frameW,frameH); 
     this.setBackground(bckGround); 
     this.setVisible(true); 
    } 

    public void addNotify(){ 
     super.addNotify(); 
     this.createBufferStrategy(2); 
     this.buff=this.getBufferStrategy(); 
     requestFocus(); 
     startGame(); 
    } 
    public void startGame(){ 
     if (t==null){ 
      t=new Thread(this); 
      t.start(); 
     } 
    } 
    public void run(){ 
     while(true){ 
      long beginTime=System.currentTimeMillis(); 
//   try { 
//    Thread.sleep(25); 
//   } catch (InterruptedException e1) { 
//    // TODO Auto-generated catch block 
//    e1.printStackTrace(); 
//   } 
      Update(); 
      Render(); 
      Draw(); 
      fps=System.currentTimeMillis() - beginTime ; 
      long sleepTime=period-fps; 
      if (sleepTime == 30) sleepTime = -1; 
      fps= ONE_SECOND_MILI/((period * 2) - sleepTime); 
      try{ 
       if (sleepTime > 0){ 
        Thread.sleep(sleepTime); 

       } 
      } 
      catch(Exception e){ 
      } 
     } 
    } 
    public void Render(){ 
     graph = buff.getDrawGraphics(); 

     if (!HasImgBackground()){ 
      graph.setColor(bckGround); 
      graph.fillRect(0, 0, frameW, frameH); 
     }else{ 
      graph.drawImage(bckGround_img, 0, 0, frameW, frameH,null); 
     } 
     graph.setColor(new Color(255,255,255)); 
     graph.drawString("FPS: " + fps , 10, 15); 
     Paint(graph); 
    } 
    private void Draw(){ 
     if(!buff.contentsLost()){ 
      buff.show(); 
      if(graph != null){ 
       graph.dispose(); 
      } 
     } 
    } 
    private boolean HasImgBackground(){ 
     if (bckGround_img==null){ 
      return false; 
     } 
     return true; 
    } 
    public void setBackgroundImg(Image image){ 
     this.bckGround_img=image; 
    } 
    public void deleteBackground(){ 
     this.bckGround_img=null; 
    } 
    public void keyPressed(KeyEvent e) { 
     if(e.getKeyCode()==KeyEvent.VK_LEFT){ 
      left=true; 
      if(lastpressed!=4) 
       newlastpressed=lastpressed; 
      lastpressed=4; 
     } 
     if(e.getKeyCode()==KeyEvent.VK_UP){ 
      up=true; 
      if(lastpressed!=1) 
       newlastpressed=lastpressed; 
      lastpressed=1; 
     } 
     if(e.getKeyCode()==KeyEvent.VK_RIGHT){ 
      right=true; 
      if(lastpressed!=2) 
       newlastpressed=lastpressed; 
      lastpressed=2; 
     } 
     if(e.getKeyCode()==KeyEvent.VK_DOWN){ 
      down=true; 
      if(lastpressed!=3) 
       newlastpressed=lastpressed; 
      lastpressed=3; 
     } 

    } 
    public void keyReleased(KeyEvent e) { 
     if(e.getKeyCode()==KeyEvent.VK_LEFT){ 
      left=false; 
      if(up||right||down) 
       if(newlastpressed!=0) 
       lastpressed=newlastpressed; 
     } 
     if(e.getKeyCode()==KeyEvent.VK_UP){ 
      up=false; 
      if(left||right||down) 
       if(newlastpressed!=0) 
       lastpressed=newlastpressed; 
     } 
     if(e.getKeyCode()==KeyEvent.VK_RIGHT){ 
      right=false; 
      if(up||left||down) 
       if(newlastpressed!=0) 
       lastpressed=newlastpressed; 
     } 
     if(e.getKeyCode()==KeyEvent.VK_DOWN){ 
      down=false; 
      if(up||right||left) 
       if(newlastpressed!=0) 
       lastpressed=newlastpressed; 
     } 

    } 
    public void keyTyped(KeyEvent e) { 
    } 
    abstract void Update(); 
    abstract void Paint(Graphics g); 
} 

main.java

package Game; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.Rectangle; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.util.ArrayList; 


import javax.swing.JFrame; 


public class Mainth extends GameCanvas{ 

    private long timeDown = 0; 
// private StopWatch t = new StopWatch(); 
    static Collision coll=new Collision(); 
    Character character=new Character(); 
    static Image wallImage=ImageLoader.getImg().getImage("data/images/objects/brick_wall.png"); 
    static Image bushImage=ImageLoader.getImg().getImage("data/images/objects/hedge_ver.png"); 
    static ArrayList<Image> wallArray=new ArrayList<Image>(); 
    static ArrayList<Image> wall2Array=new ArrayList<Image>(); 
    static Sprite wallSprite; 
    static Sprite wall2Sprite; 
    static IndexCounter devIndex; 
    static Dude dev; 
    static Wall wall; 
    static Wall bush; 
    static Wall wall2; 
    /**not used*/ 
    int x=0,y=0; 
    static ArrayList objects=new ArrayList<Entity>(); 
    static ArrayList chars=new ArrayList<Dude>(); 
    static ArrayList projectiles=new ArrayList<>(); 

    public static void main(String[] args){ 
     Mainth Canvas=new Mainth(1500,1000); 
     JFrame frame=new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setResizable(false); 
     frame.add(Canvas); 
     frame.pack(); 
     frame.setSize(750, 400); 
     frame.setVisible(true); 
     Mainth.chars.add(dev); 
     Mainth.objects.add(wall); 
     Mainth.objects.add(bush); 
     Mainth.objects.add(wall2); 
    } 
    public Mainth(int w,int h){ 
     super(w,h); 
     this.addKeyListener(this); 
     CharacterCreation(); 
    } 
    public void CharacterCreation(){ 
     wallArray.add(wallImage); 
     wall2Array.add(bushImage); 
     wallSprite=new Sprite(wallArray,1); 
     wall2Sprite=new Sprite(wall2Array,1); 
     dev=new Dude(character.LinkStandingDown,character.LinkStandingDown.getID(),100,300); 
     devIndex=new IndexCounter(character.LinkWalkingDownArray.size(),3); 
     wall=new Wall(wallSprite,1,100,50){}; 
     bush=new Wall(wall2Sprite,1,185,55){}; 
     wall2=new Wall(wallSprite,1,100,225){}; 
     bush.setHardness(1); 
    } 
    Movement movem=new Movement(); 
    void Update() { 
     movem.movement(dev, character, left, right, up, down, lastpressed, devIndex); 
     dev.move(); 
     coll.objectCollision(chars,objects); 
     devIndex.Counter(); 
    } 
    void Paint(Graphics g) { 
     bush.Draw(g,0); 
     wall.Draw(g,0); 
     wall2.Draw(g,0); 
     dev.Draw(g,devIndex.getIndex()); 
     Graphics2D g2d= (Graphics2D) g; 
    } 
    public void animation(){ 
     String[] animationSprites=dev.getImgs("walk_down"); 
     int aniTime=0; 
     aniTime++; 
    } 
    public ArrayList<Entity> exportObjects(){ 
     return objects; 
    } 
    public ArrayList<Dude> getMainChar(){ 
     return chars; 
    } 
} 
+1

*「..我希望儘快提供幫助..歡迎任何建議。」* 1)儘快啓動您的項目。 (並且不要告訴我們你的時間表)2)添加家庭作業標籤到作業問題。 3)在每個句子的第一個字母以及I中使用大寫字母。4)爲了更快地獲得更好的幫助,請發佈[SSCCE](http://sscce.org/)。 – 2012-03-06 08:46:44

回答

2

究竟是不是在遊戲中的工作是什麼?

基本的側面滾動邏輯包括移動背景,角色和障礙物的一定增量,因爲移動鍵被按下。如果屏幕「向右移動」,我們實際上將所有這些元素移動到左側。如果屏幕「向左移動」,那麼我們正在做相反的事情。另外,如果實體正在移動且具有特定目標點,請確保在滾動時更新此點的座標,否則該實體將繼續移動,直至達到其原始屏幕上的目標。你也應該實現代碼來阻止屏幕滾動太遠(從而失去遊戲)。

有許多方法可以使用橫向滾動,例如當角色從屏幕中心移動一定距離時進行滾動,或者使屏幕與角色獨立移動(例如在一個角色在地圖上滾動)。一個更簡單的方法可能是始終讓玩家在屏幕的中心,並讓背景和其他實體在他周圍來回滾動。

+0

沒有什麼是壞的我只是不知道側滾動,因爲我剛剛開始編程1個半月前我只是想製作一個滾動系統,所以我可以有一個漂亮的RPG在我的學校演示 我的源代碼來自eclipse http://www.mediafire.com/?fi1f9lv6qc2t5d7 – user1251225 2012-03-06 05:54:30

1

您需要的座標系:

  • 世界座標 - 始終不變
  • (本地)框座標 - 在對象應該在自己的窗口中顯示現在

每個對象都有唯一世界座標。你在這個大世界有一扇窗戶。這個窗口的座標是世界座標。要在窗口中滾動視圖,只需要更改它的世界座標。

當然,您需要一個代碼,將您窗口中的所有對象渲染爲可移動窗口的任何正確位置。它可以是這樣的:

void renderFrame(Rectangle frame) { 
    for(GameObject go : gameObjects) { 
     if(frame.contains(go.getGlobalCoordinates())) { 
      Rectangle windowCoordinates = new Rectangle(); 
      windowCoordinates.x = go.getGlobalCoordinates().x - frame.x; 
      windowCoordinates.x = go.getGlobalCoordinates().y - frame.y; 
      windowCoordinates.x = go.getGlobalCoordinates().width - frame.width; 
      windowCoordinates.x = go.getGlobalCoordinates().height - frame.height; 

      go.paint(g2, windowCoordinates); 
     } 
    } 
}