2

タイトルがこの投稿をこれまで以上に混乱させていないことを願っています. 私がこれまでに行ったことを正確に伝えると、私が抱えている問題をよりよく説明できるかもしれません。

ゲーム

私は非常に単純な 2D ゲームを作成しました。基本は、プレーヤーがキーボード入力 (上、下、左、右矢印) で 2D マップを移動することです。このゲームは、ビューが上からあるポケモン ビューのようなものです。この速度は、キーボード入力ごとに次のコードを使用するだけで設定できます。

 if(input.isKeyDown(Input.KEY_DOWN)){
    bucky = movingDown;
    buckyPositionY -= 2;
    if(buckyPositionY<-550){//this is used to stop player from leaving the map
        buckyPositionY += 2;}}

他の 3 つのキーボード入力についても同じことが行われます。

問題

プレイヤーが動き回れるゲームを作成しましたが、問題はマップ上にオブジェクトがあり、その瞬間にプレイヤーがそれらを通り抜けるだけなので、衝突を設定する必要があります。長方形を使用して衝突を設定する方法を知っていますメソッドですが、問題は実際に長方形を作ることです。簡単な作業であることはわかっていますが、このゲームでは Rectangle を下に置くと、プレーヤーを移動すると移動します。次のコードで四角形を描画して、これをテストしました。

g.fillRect(0,0,100,100);

これは、マップ上の障害物の座標です。長方形を描画すると、画面の左上隅に表示され、プレーヤーを移動すると、そこにとどまります (左上隅にとどまるように移動し続けます)。私の長方形が動いている場合、私の衝突はどのように機能するはずなので、私にとって大きな問題です。これが起こっている理由は、私のマップが非常に大きいためだと思います。つまり、完全なものを表示するのではなく、プレーヤーを画面の中央に配置し、プレーヤーが移動すると、画面も一緒に移動して残りの部分を表示するためです。地図。

コード

これが私のゲームクラスのコードです。これにはrender、init、updateなどのメソッドがありますが、この問題を修正するために必要なコードはrenderメソッドと変数だけだと思う​​ので、ここにあります(完全なコードが必要な場合)教えてください)

変数

 Animation bucky, movingUp, movingDown, movingLeft, movingRight
Image worldMap;
boolean quit = false;
int[] duration = {200, 200};
int buckyPositionX = 0;
int buckyPositionY = 0;
int shiftX = buckyPositionX + 320;
int shiftY = buckyPositionY + 160;

render メソッド

public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws SlickException{
worldMap.draw(buckyPositionX, buckyPositionY);//position 0,0
bucky.draw(shiftX, shiftY);//makes him appear at center of map

if(quit==true){
    g.drawString("Resume(R)", 250, 100);
    g.drawString("Main(M)", 250, 150);
    g.drawString("Quit Game(Q)", 250, 200);      
    if(quit==false){
        g.clear();
    }}}

このスレッドが非常に長くなって申し訳ありませんが、時間を割いて私を助け、私の質問に答えていただければ幸いです。

ありがとうございました。

4

2 に答える 2

2

Javaの2次元描画方法は、マップではなく、画面を基準にして描画します。

http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/Graphics.html#fillRect

マップの位置を基準にして描画する場合は、マップ上のプレーヤーの位置に基づいて長方形の位置をオフセットする必要があります。キャラクターアニメーションは常に画面の中央にあるため、バッキーがマップ上のどこにあるかに基づいて、他のアニメーションをオフセットする必要があります。したがって、長方形の描画は次のようになる必要があります。

g.fillRect(0 + buckyPositionX, 0 + buckyPositionY, 100, 100);

より良い解決策は、マップ上のカメラの位置を追跡してから、キャラクターを含む、カメラに関連するすべてのものを描画することです。これにより、ゲームのカットシーンなどで自由に行うことができます。

于 2012-12-29T18:08:13.777 に答える
1

先ほど言ったように、描画座標はゲームマップではなく画面を基準にして定義されているため、長方形(障害物)が移動しています。つまり、キャラクターが移動してゲームマップを再描画すると、長方形はまだ(0,0)、つまり画面の左上に描画されます。

ここにいくつかの提案があります。

  • Imageゲームマップには別のオフスクリーンを使用してください。画像サイズはゲームマップと同じサイズになります。
  • 長方形(障害物)および文字を除くその他のものは、この画像のグラフィックコンテキストを使用して取得することにより、この画像に描画する必要があります。getGraphics
  • 最後に、キャラクターが動いたら、メソッドを使用して画面に画像の一部をペイントしますdrawImage(Image img, int dstx1, int dsty1, int dstx2, int dsty2, int srcx1, int srcy1, int srcx2, int srcy2, ImageObserver observer)。この方法の説明はここで利用できます。キャラクターの位置から、画像のどの部分をペイントするかを計算する必要があります

覚えておくべきことは、キャラクターはゲームマップではなく、画面上にのみ描画する必要があるということImageです。ゲームマップ画像を描いた後、画面上にキャラクターを描く必要があります。

于 2012-12-29T17:50:35.313 に答える