1

ここ数日、私は Java でテキスト RPG ゲームをコーディングしました。世界での位置は、文字列の単純な 100x100 2D 配列によってほぼ制御されます。次に、プレイヤーが実際にグリッドに到達したときに、ストリングを実際のオブジェクトに変換します。

私が念頭に置いているのは、この 100x100 グリッドを表示するグラフィック ディスプレイを、グリッドの各セクションに配列の内容に対応する画像と共に表示することです。

たとえば、ブロック [10][15] の文字列が「岩」の場合、行 10、列 15 のグリッドのグラフィック表示セクションには岩の写真が表示されます。

do-while ループをループするたびに、このグラフィックが更新されるのが理想的です。奇妙なことに、私が念頭に置いているのは、初期のポケモン ゲームに非常によく似たものです。

私の説明が下手だったり、私の質問があまりにも曖昧だったりしたら、申し訳ありません。私はコンピュータ サイエンス コースで半学期しか Java を学んだことがないので、私の知識は 1 学期で学んだ基礎に限られています。私は (誇りを持って) コーディングしたテキスト チェス ゲームのように、クラスの外でさまざまなプロジェクトを追求するのが好きです。さまざまなライブラリを使用する前に基本を学ぶことができるように、すべてをゼロから作成することを好みます。

誰かが私が探しているものの正しい方向に私を向けてくれますか、またはこのディスプレイの後に進むためのより良い方法を提供してくれますか?

事前にどうもありがとうございました。私のコードへの参照が私の質問に答えるのに役立つかどうか教えてください。

4

3 に答える 3

0

私の個人的な経験では、このようなタスクに最も簡単に使用できるのはProcessingです。これは、物事を描画するためのシンプルな API を提供できる軽量のフレームワークです。

リファレンスと多くのチュートリアルがあるので、専門家でなくても始めるのは難しくありません。

余談ですが、ブロックの種類を格納するために文字列を使用するのはなぜですか? のようなもっと良いものを使用できますenumか?

于 2013-02-08T04:56:09.067 に答える
0

まず、上記のジャックが述べたように、文字列の代わりに列挙型を使用できます。例えば

private enum Objects{ Rock(1),Coin(8),Med(45)...など }

配列では、これらのオブジェクトを文字列ではなく数値として格納できます。

例えば:

     boolean stopFlag=false;    
do{  
  //check each element of your world array with the enum and draw it  
  for(int i=0;i<yourObjectsArray.length;i++)
   {
      for(int j=0;j<yourObjectsArray[i].length;j++){
        switch(yourObjectsArray[i][j])
        {
          case Objects.Rock: drawRock(i,j);
                             break;
          case Objects.Coin: drawCoin(i,j);
                             break;
          //and so on....
        }
     }
   }
  //you can also put this into a separate function as drawWorld() and pass the objects.

//Key press checking logic here. If user presses exit key [esc] then you set the stopFlag  as true
  if(keypress==KEY_ESC){ stopFlag=true;}  
}while(!stopFlag);

ドローロックの例:

private void drawRock(int i,int j){
      //i and j are the cols and row values so you need to resolve them to coordinates.
      //I am assuming u have a 800*600 screen and you mentioned that your world is 100x100 array. Then each of your object is 8*6 units in size so
     xCoord=i*8;
     yCoord=j*6; 
        //So if you have to draw a rock on [10][15] it will resolve as
        //xCoord=10*8-> 80
        //yCoord=15*6-> 90  so it will draw your rock in (80,90) on the screen

//Now you can either open the rock image from your disk now or u maintain one instance of rock at the beginning of the program so that you can use the same image later rather than opening it everytime you encounter a new Rock object in your array.For now I will open it here.

   String path = "C:\\YourGameDirectory\\rock.jpg";
    URL url = new File(path).toURI().toURL();
    BufferedImage rockImg = ImageIO.read(url);

   //draw it to the screen now if you have the graphics instance.
    yourUIPanel.getGraphics().drawImage(rockImg,xCoord,yCoord,yourUIPanel);

  // You may find many resources that teach you how to draw an image on the screen in         Java. You may repeat the same for all the objects.

 }

上記のコードがお役に立てば幸いです。そうでなければ、それは私の悪いことです。

開始するには、このチュートリアル シリーズを試すことができます。C ですが、上記のことを達成するのに役立つ概念があります。

于 2013-02-08T05:56:08.987 に答える
0

私の古いローグライク ゲーム Tyrant のソース コードをチェックしてみてください。

重要なアイデア:

  • Mapマップを表すデータの格納を担当するクラスがあります。Tyrant では、Mapは地形とマップ上のオブジェクトの場所の両方のストレージをカプセル化します。
  • GUI にMapPanelを表示するクラスがあります。Mapこれは、マップ自体とは別に保持されます。通常、GUI をコア エンジン データから分離することをお勧めします。
  • Thingマップ上のオブジェクトを表すクラスがあります。これには、モンスター、アイテム、木、煙の雲からプレイヤー キャラクター自体まですべてが含まれます。基本的に地形以外のもの。

更新に関して言えば、これが機能する方法は、MapPanel がマップのコンテンツを見てオンデマンドで再描画することです。MapPanel.paint(Graphics g)およびそれが呼び出すさまざまなメソッドを確認してください。

于 2013-02-08T06:11:38.603 に答える