1

私は現在、素晴らしい (心の中で) ゾンビ ゲームを作成していて、カメラを作成する良い方法を知る必要があります。Java用のMarteEngineとともにSlick2dライブラリを使用しています。

私は Java が初めてで、swing などに深く入る前にライブラリに直接飛び込んだので、おそらくグラフィックスの知識が不足しています。チュートリアルで、ゲームのウィンドウをマップ上で実際に移動することはできないため、代わりにマップとオブジェクトを移動して、カメラが動いているように見せる必要があると読みました。

このようにすると、リソースを大量に消費するように思えます。座標を移動するには、すべてのゾンビ、サバイバー、オブジェクト、ヒットボックスなどをループする必要があります。私はすでにこの方法を一度試しましたが、物事は実際には同じ速度で動いていませんでした. それは、異なる更新速度で処理したことが原因である可能性があります。

graphics.translate の使用についていくつか見てきましたが、よくわかりません。だから..カメラを動かすための提案は素晴らしいでしょう! 前もって感謝します。

4

2 に答える 2

11

確かにカメラを動かすことができます。カメラを移動する方法、そのカメラを基準にして世界をレンダリングする方法、およびこれを行う方法と、カメラが移動するときに画面にを描画するかを決定する方法に関するその他の役立つヒントを説明する、この質問に対する私の回答を参照してください。

を使用することは完全に可能ですがtranslate(x, y)、それだけではクリッピングの問題 (画面に何を描画するかを知る方法) は解決されません。また、考えてみると、サーフェスを平行移動することとカメラを移動することにはほとんど違いがありません。それはすべて相対的であり、ピクセルが正しい方向に移動している限り、「カメラを世界に対して相対的に動かす」か「カメラに対して世界を相対的に動かす」かは実際には問題ではありません。基本的に同じ操作。

Swing に関する限り、そこから始めなくてよかったと思っています。Swing は、ウィンドウ、メニュー、ボタン、複雑なイベント システムなどを備えたデスクトップ アプリケーション向けに設計されています。Swing がゲームに適していない理由はいくつかありますが、そのうちの 1 つとして、Swing でレンダリング パイプラインが機能する方法が挙げられます。デスクトップ アプリには問題ありませんが、ゲームや、リアルタイムでグラフィックスを多用する必要があるほとんどの種類のレンダリングには絶望的です。とにかく、Swing はゲーム開発者の問題を解決するために構築されたわけではないので、これで問題ありません。

于 2012-05-12T12:06:46.577 に答える
2

おそらく、クラスのtranslate(x, y)メソッドを探しているでしょう。Graphicsこのメソッドは、標準の Java Swing/AWTGraphicsクラスと Slick2D バージョンの両方から利用できるため、これは Slick2D 固有の機能ではないことに注意してください。

translate が行うことは、今後のすべての描画操作の原点を移動することです。これは何を意味するのでしょうか?通常、原点は (0, 0) にあることに注意してください。そのため、位置 (40, 50) にポイントを描画すると、画面の位置 (40, 50) に描画されます。ただし、translate()この基準点を移動すると、他のすべての描画操作に影響します。

たとえば、 を実行translate(50, 60)すると、原点が x 軸で右に 50 ピクセル移動し、y 軸で 60 ピクセル下に移動します (コンピューター プログラマーでは、y の値が大きいほど画面の下に表示されるため)。次に、(40, 50) にポイントを描画すると、実際には画面の (40 + 50, 50 + 60) または (90, 110) に描画されます。これが使う力ですtranslate()

通常は、描画が終わったら原点を (0, 0) に戻すことをお勧めします。そうしないと、問題が発生する可能性があります。ただし、実行してtranslate(0, 0)もこのタスクは達成されず、実際にはまったく何もしません。これは、translate メソッドが原点を相対点に移動するためです。代わりに、すべての呼び出しtranslate(x, y)に対して、別の呼び出しがあることを確認してくださいtranslate(-x, -y)。これにより、原点が手に負えなくなります。

この方法を使用してカメラをエンティティの 1 つに追従させたい場合は、そのエンティティの位置のネガを使用して原点を変換する必要があることに注意してください。たとえば、位置ベクトル 'pos' を使用してプレーヤーを追跡するには、次のようにします。

g.translate(-player.pos.x, -player.pos.y);

// Render everything

g.translate(player.pos.x, player.pos.y);

これは、プレイヤーが右に移動したときに背景を左に移動させたいためです。そうしないと、すべてがプレイヤーに追従してしまいます。

于 2012-05-12T04:55:27.283 に答える