「Java ミニゲームの実装」: 戦車戦 (続き)
前回のブログ記事「Java Mini Game Implementation」: Tank War では、戦車を 4 方向に移動する制御機能のみを紹介しました。今日は、これに基づいて小さな機能を 1 つずつ完成させていきます。
完成した機能: キーボードのキーに従って戦車を8方向に動かすように制御します
この機能を完了するには、いくつかのことを行う必要があります
1. キーボードのキーストロークを記録します。つまり、キーボードのキーを書き換えます。ダウンおよびアップリスニングイベント
<code>采用4个boolean变量来记录,按下为true,抬起为false </code>
の実装コードは次のとおりです:
<code class="hljs java"> //定义四个布尔类型变量来记录按键的情况,默认状态下为false,表示没有键按下 private boolean b_L,b_U,b_R,b_D; //记录键盘的按键情况 public void keyMonitor(KeyEvent e){ int key=e.getKeyCode(); switch(key){ case KeyEvent.VK_LEFT: b_L=true; break; case KeyEvent.VK_UP: b_U=true; break; case KeyEvent.VK_RIGHT: b_R=true; break; case KeyEvent.VK_DOWN: b_D=true; break; } //根据上面的按键情况,确定坦克即将要运行的方向,即第二步要完成的内容,具体实现看博文下面 moveDirection(); } //键盘按键松下时,也要进行记录 public void keyReleased(KeyEvent e) { int key=e.getKeyCode(); switch(key){ case KeyEvent.VK_LEFT: b_L=false; break; case KeyEvent.VK_UP: b_U=false; break; case KeyEvent.VK_RIGHT: b_R=false; break; case KeyEvent.VK_DOWN: b_D=false; break; } }</code>
2. 1で記録されたキーの押下に基づいて戦車の走行方向を決定します
<code class="hljs dos">8个运行方向采用一个枚举类型来保存。即 private enum Direction{ L,LU,U,RU,R,RD,D,LD,STOP } //例如:如果键盘的左键和下键被按下,则运行方向dir=Direction.LD. //定义一个变量来表示坦克要运行的方向,初始状态为STOP private Direction dir = Direction.STOP; //根据键盘的按键情况来确定坦克的运行方向 private void moveDirection() {//L,LU,U,RU,R,RD,D,LD,STOP if(b_L&&!b_U&&!b_R&&!b_D){ dir = Direction.L; } else if(b_L&&b_U&&!b_R&&!b_D){ dir = Direction.LU; } else if(!b_L&&b_U&&!b_R&&!b_D){ dir = Direction.U; } else if(!b_L&&b_U&&b_R&&!b_D){ dir = Direction.RU; } else if(!b_L&&!b_U&&b_R&&!b_D){ dir = Direction.R; } else if(!b_L&&!b_U&&b_R&&b_D){ dir = Direction.RD; } else if(!b_L&&!b_U&&!b_R&&b_D){ dir = Direction.D; } else if(b_L&&!b_U&&!b_R&&b_D){ dir = Direction.LD; } else{//其它所有情况,都是不动 dir = Direction.STOP; } } </code>
3。 in 2 走行速度とその他の条件。たとえば、左下方向に移動している場合、タンクの現在位置は (x, y) --> (x-XSPEED, y+YSPEED) になります。ここで、XSPEED と YSPEEDは、x 軸と y 軸の移動速度です。
<code class="hljs rust"> //上面有运行方向,但是还缺少具体的运行细节,例如:假设是按下了右键,则应该横坐标x+=XSPEED; private void move(){ if(dir==Direction.L){//L,LU,U,RU,R,RD,D,LD,STOP x -= XSPEED; } else if(dir==Direction.LU){ x -= XSPEED; y -= YSPEED; } else if(dir==Direction.U){ y -= YSPEED; } else if(dir==Direction.RU){ x += XSPEED; y -= YSPEED; } else if(dir==Direction.R){ x += XSPEED; } else if(dir==Direction.RD){ x += XSPEED; y += YSPEED; } else if(dir==Direction.D){ y += YSPEED; } else if(dir==Direction.LD){ x -= XSPEED; y += YSPEED; } else if(dir==Direction.STOP){ //... nothing } }</code>
上記の 3 つのステップの完全なコードは次のとおりです:
<code class="hljs java"> public class Tank { //坦克所在的位置坐标 private int x; private int y; //定义两个常量,表示运动的速度 private static final int XSPEED = 5; private static final int YSPEED = 5; //定义四个布尔类型变量来记录按键的情况,默认状态下为false,表示没有键按下 private boolean b_L,b_U,b_R,b_D; //定义一个枚举类型来表示运行的方向 private enum Direction{ L,LU,U,RU,R,RD,D,LD,STOP } //定义一个变量来表示坦克要运行的方向,初始状态为STOP private Direction dir = Direction.STOP; public Tank(int x, int y) { super(); this.x = x; this.y = y; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } public void draw(Graphics g){ Color c = g.getColor(); g.setColor(Color.RED); g.fillOval(x, y, 30, 30); g.setColor(c); move();//根据键盘按键的结果改变坦克所在的位置 } //记录键盘的按键情况 public void keyMonitor(KeyEvent e){ int key=e.getKeyCode(); switch(key){ case KeyEvent.VK_LEFT: b_L=true; break; case KeyEvent.VK_UP: b_U=true; break; case KeyEvent.VK_RIGHT: b_R=true; break; case KeyEvent.VK_DOWN: b_D=true; break; } //根据上面的按键情况,确定坦克即将要运行的方向 moveDirection(); } //键盘按键松下时,也要进行记录 public void keyReleased(KeyEvent e) { int key=e.getKeyCode(); switch(key){ case KeyEvent.VK_LEFT: b_L=false; break; case KeyEvent.VK_UP: b_U=false; break; case KeyEvent.VK_RIGHT: b_R=false; break; case KeyEvent.VK_DOWN: b_D=false; break; } } //根据键盘的按键情况来确定坦克的运行方向 private void moveDirection() {//L,LU,U,RU,R,RD,D,LD,STOP if(b_L&&!b_U&&!b_R&&!b_D){ dir = Direction.L; } else if(b_L&&b_U&&!b_R&&!b_D){ dir = Direction.LU; } else if(!b_L&&b_U&&!b_R&&!b_D){ dir = Direction.U; } else if(!b_L&&b_U&&b_R&&!b_D){ dir = Direction.RU; } else if(!b_L&&!b_U&&b_R&&!b_D){ dir = Direction.R; } else if(!b_L&&!b_U&&b_R&&b_D){ dir = Direction.RD; } else if(!b_L&&!b_U&&!b_R&&b_D){ dir = Direction.D; } else if(b_L&&!b_U&&!b_R&&b_D){ dir = Direction.LD; } else{//其它所有情况,都是不动 dir = Direction.STOP; } } //上面有运行方向,但是还缺少具体的运行细节,例如:假设是按下了右键,则应该横坐标x+=XSPEED; private void move(){ if(dir==Direction.L){//L,LU,U,RU,R,RD,D,LD,STOP x -= XSPEED; } else if(dir==Direction.LU){ x -= XSPEED; y -= YSPEED; } else if(dir==Direction.U){ y -= YSPEED; } else if(dir==Direction.RU){ x += XSPEED; y -= YSPEED; } else if(dir==Direction.R){ x += XSPEED; } else if(dir==Direction.RD){ x += XSPEED; y += YSPEED; } else if(dir==Direction.D){ y += YSPEED; } else if(dir==Direction.LD){ x -= XSPEED; y += YSPEED; } else if(dir==Direction.STOP){ //... nothing } } }</code>
そして、TarkClient.java ファイルの主な変更箇所で、ボタンのリフティング メソッドが書き換えられます。
rreee以上でタンクの8方向の制御が完了しました。
完全な機能: 戦車は弾を発射できます
戦車戦なので、弾を発射できなければなりませんね。そうでないと退屈です。
まず、弾丸クラスを作成します。この弾丸クラスには、描画メソッドと移動メソッドだけでなく、位置属性と方向属性も必要です。
コードは次のとおりです:
<code class="hljs java"> private class KeyMonitor extends KeyAdapter{ @Override public void keyPressed(KeyEvent e) { tk.keyMonitor(e); } @Override public void keyReleased(KeyEvent e) { tk.keyReleased(e); } }</code>
次に、インターフェースに制御されていない弾丸を描画してテストしてみましょう。
TankClientクラスにMissileオブジェクトがあり、ペイントでMissileの描画を呼び出すだけです。
<code class="hljs java"> public class Missile { //定义两个常量,表示运动的速度 private static final int XSPEED = 20; private static final int YSPEED = 20; //子弹所在的位置 private int x; private int y; //子弹的运行方向 private Direction dir; public Missile(int x, int y, Direction dir) { this.x = x; this.y = y; this.dir = dir; } public void draw(Graphics g){ Color c = g.getColor(); g.setColor(Color.YELLOW); g.fillOval(x, y, 5, 5); g.setColor(c); move(); } private void move() { if(dir==Direction.L){//L,LU,U,RU,R,RD,D,LD,STOP x -= XSPEED; } else if(dir==Direction.LU){ x -= XSPEED; y -= YSPEED; } else if(dir==Direction.U){ y -= YSPEED; } else if(dir==Direction.RU){ x += XSPEED; y -= YSPEED; } else if(dir==Direction.R){ x += XSPEED; } else if(dir==Direction.RD){ x += XSPEED; y += YSPEED; } else if(dir==Direction.D){ y += YSPEED; } else if(dir==Direction.LD){ x -= XSPEED; y += YSPEED; } } } </code>
ここで、Ctrl キーを押すと戦車から弾が発射されることを理解する必要があります。戦車は弾丸を発射するため、戦車クラスには fire() という名前の弾丸を発射するメソッドが存在する必要があり、戻り値は Bullet オブジェクトです。弾丸オブジェクトは戦車の現在の位置と方向で初期化されます。
<code class="hljs java"> public class TankClient extends Frame{ //....无关代码没有显示 private Missile ms =new Missile(50,50,Direction.D);//一个子弹对象 @Override public void paint(Graphics g) { //直接调用坦克至圣的draw方法 tk.draw(g); if(ms!=null){ ms.draw(g); } } //....无关代码没有显示 }</code>
Ctrl キーを押したときに弾を発射したいと考えています。
そこで、tankクラスのkeyPressedメソッドに、キー値がctrlの場合を追加します。 fire() によって返された Missile オブジェクトを使用して、TankClient クラスの Missile 参照を初期化する必要があるためです。したがって、Tank クラスで、TankClient の Missile 参照にアクセスするには、TankClient への参照を保持する必要があります。
<code class="hljs cs"> public Missile fire(){ Missile ms = new Missile(x,y,dir); return ms; } </code>
TankClient.java クラスのコードは次のとおりです:
<code class="hljs cs"> private TankClient tc; public Tank(int x, int y) { this.x = x; this.y = y; } public Tank(int x, int y, TankClient tc) { this(x,y); this.tc = tc; } //记录键盘的按键情况 public void keyPressed(KeyEvent e){ int key=e.getKeyCode(); //System.out.println(key); switch(key){ case 17: //按下Ctrl键时的处理情况,tc是一个TankClient对象,里面有一个子弹的引用 tc.setMs(fire()); break; case KeyEvent.VK_LEFT: b_L=true; break; case KeyEvent.VK_UP: b_U=true; break; case KeyEvent.VK_RIGHT: b_R=true; break; case KeyEvent.VK_DOWN: b_D=true; break; } //根据上面的按键情况,确定坦克即将要运行的方向 moveDirection();
上記は、Ctrl キーを押すと弾丸を発射する戦車を実装しています。
まだ終わってません! ! !
上記は「Java ミニゲームの実装」の内容です: 戦車戦 (続き) 関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。
