質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Javaアプレット

Javaアプレットは、Webページに組み込まれて実行されるJavaアプリケーションの形式です。Java SE 11で廃止となりました。

Q&A

2回答

439閲覧

落下処理がうまくいかない

Alpa

総合スコア80

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Javaアプレット

Javaアプレットは、Webページに組み込まれて実行されるJavaアプリケーションの形式です。Java SE 11で廃止となりました。

0グッド

3クリップ

投稿2017/10/24 18:11

以下のようなコードを書いたのですが
初期描画はうまくいったのですが
そのあとの下に落ちる処理ができません
どのようにしたらいいのでしょうか?

java

1import java.applet.Applet; 2 3import java.awt.Graphics; 4import java.awt.Image; 5import java.awt.Dimension; 6import java.awt.event.KeyListener; 7import java.awt.event.KeyEvent; 8 9import java.net.URL; 10 11public class action extends Applet implements Runnable, KeyListener{ 12 13 Thread thread = null; 14 15 Image MapChip1; 16 Image CharaChip1; 17 18 int MapChip1X; 19 int MapChip1Y; 20 21 int CharaChip1X; 22 int CharaChip1Y; 23 24 Dimension size; 25 Image back; 26 Graphics buffer; 27 28 public void init(){ 29 30 thread = new Thread(this); 31 thread.start(); 32 33 URL urlCode = getCodeBase(); 34 URL urlDoc = getDocumentBase(); 35 36 MapChip1 = getImage(getCodeBase(), "../アクションゲーム/MapChip1.png"); 37 CharaChip1 = getImage(getCodeBase(), "../アクションゲーム/CharaChip1.png"); 38 39 size = getSize(); 40 back = createImage(size.width, size.height); 41 42 buffer = back.getGraphics(); 43 44 addKeyListener(this); 45 46 } 47 48 public void paint(Graphics g){ 49 50 MapChip1X = 20; 51 MapChip1Y = 480; 52 53 CharaChip1X = 10; 54 CharaChip1Y = 20; 55 56 buffer.drawImage(MapChip1, MapChip1X - 20, MapChip1Y, this); 57 buffer.drawImage(MapChip1, MapChip1X * 1, MapChip1Y, this); 58 buffer.drawImage(MapChip1, MapChip1X * 2, MapChip1Y, this); 59 buffer.drawImage(MapChip1, MapChip1X * 3, MapChip1Y, this); 60 buffer.drawImage(MapChip1, MapChip1X * 4, MapChip1Y, this); 61 buffer.drawImage(MapChip1, MapChip1X * 5, MapChip1Y, this); 62 buffer.drawImage(MapChip1, MapChip1X * 6, MapChip1Y, this); 63 buffer.drawImage(MapChip1, MapChip1X * 7, MapChip1Y, this); 64 buffer.drawImage(MapChip1, MapChip1X * 8, MapChip1Y, this); 65 buffer.drawImage(MapChip1, MapChip1X * 9, MapChip1Y, this); 66 buffer.drawImage(MapChip1, MapChip1X * 10, MapChip1Y, this); 67 buffer.drawImage(MapChip1, MapChip1X * 11, MapChip1Y, this); 68 buffer.drawImage(MapChip1, MapChip1X * 12, MapChip1Y, this); 69 buffer.drawImage(MapChip1, MapChip1X * 13, MapChip1Y, this); 70 buffer.drawImage(MapChip1, MapChip1X * 14, MapChip1Y, this); 71 buffer.drawImage(MapChip1, MapChip1X * 15, MapChip1Y, this); 72 buffer.drawImage(MapChip1, MapChip1X * 16, MapChip1Y, this); 73 buffer.drawImage(MapChip1, MapChip1X * 17, MapChip1Y, this); 74 buffer.drawImage(MapChip1, MapChip1X * 18, MapChip1Y, this); 75 buffer.drawImage(MapChip1, MapChip1X * 19, MapChip1Y, this); 76 buffer.drawImage(MapChip1, MapChip1X * 20, MapChip1Y, this); 77 buffer.drawImage(MapChip1, MapChip1X * 21, MapChip1Y, this); 78 buffer.drawImage(MapChip1, MapChip1X * 22, MapChip1Y, this); 79 buffer.drawImage(MapChip1, MapChip1X * 23, MapChip1Y, this); 80 buffer.drawImage(MapChip1, MapChip1X * 24, MapChip1Y, this); 81 buffer.drawImage(MapChip1, MapChip1X * 25, MapChip1Y, this); 82 buffer.drawImage(MapChip1, MapChip1X * 26, MapChip1Y, this); 83 buffer.drawImage(MapChip1, MapChip1X * 27, MapChip1Y, this); 84 buffer.drawImage(MapChip1, MapChip1X * 28, MapChip1Y, this); 85 buffer.drawImage(MapChip1, MapChip1X * 29, MapChip1Y, this); 86 buffer.drawImage(MapChip1, MapChip1X * 30, MapChip1Y, this); 87 buffer.drawImage(MapChip1, MapChip1X * 31, MapChip1Y, this); 88 buffer.drawImage(MapChip1, MapChip1X * 32, MapChip1Y, this); 89 buffer.drawImage(MapChip1, MapChip1X * 33, MapChip1Y, this); 90 buffer.drawImage(MapChip1, MapChip1X * 34, MapChip1Y, this); 91 buffer.drawImage(MapChip1, MapChip1X * 35, MapChip1Y, this); 92 buffer.drawImage(MapChip1, MapChip1X * 36, MapChip1Y, this); 93 buffer.drawImage(MapChip1, MapChip1X * 37, MapChip1Y, this); 94 buffer.drawImage(MapChip1, MapChip1X * 38, MapChip1Y, this); 95 buffer.drawImage(MapChip1, MapChip1X * 39, MapChip1Y, this); 96 97 buffer.drawImage(CharaChip1, CharaChip1X, CharaChip1Y, this); 98 99 g.drawImage(back, 0, 0, this); 100 101 requestFocusInWindow(); 102 103 } 104 105 public void run(){ 106 107 while(true){ 108 109 if(CharaChip1Y <= MapChip1Y){ 110 111 CharaChip1Y += 1; 112 repaint(); 113 114 } 115 116 if(CharaChip1Y <= MapChip1Y && CharaChip1X >= 0 && 117 CharaChip1X <= MapChip1X * 39){ 118 119 CharaChip1Y = MapChip1Y; 120 repaint(); 121 122 } 123 124 } 125 126 } 127 128 public void keyPressed(KeyEvent e){ 129 130 int Keycode = e.getKeyCode(); 131 if(Keycode == KeyEvent.VK_UP){ 132 CharaChip1Y -= 40; 133 CharaChip1Y += 40; 134 repaint(); 135 } 136 137 } 138 139 public void keyReleased(KeyEvent e){ 140 141 } 142 143 public void keyTyped(KeyEvent e){ 144 145 } 146 147}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

KSwordOHasteさんがすでに原因と解決法は解説されているので補足しておきます。

Swingの画面描画(というより世間一般のGUIの画面描画)は、「絵を書き終わったら相手に見せる」という仕組みで動いています。例えば裏返すことのできるホワイトボードを想像してください。そして、以下のような位置関係に立ったとします。

描く人→ホワイトボード←見る人

描く人は裏面に絵を書きます。いろいろなパーツを描くので少し時間がかかりますが、見る人は反対側の真っ白な状態のホワイトボードを見ているので、作業中の様子はわかりません。描く人は**描くものを全て書き終わったらホワイトボードをひっくり返します。**すると見る人は「出来上がった絵」だけを見ることができます。描く人は裏返し終わったら次の絵を描き始めます。描き終えたらひっくり返します。これを繰り返すことで、絵が更新されていきます。

この考え方をダブルバッファリングといいます。なぜこのようなことをするかというと、描く人と見る人が同じ向きに立っていた場合、見る人はぐちゃぐちゃの描きかけを見せられることになり、非常に見づらい状態になってしまうからです。

さて、ここで考えをSwingに戻しましょう。描く人はGraphicsクラス、ホワイトボードはApplet、見る人はディスプレイの前のあなたです。paintメソッドは「描く」処理で、paintが終わるとホワイトボードをひっくり返すように画面を更新します。いまのコードは「ひっくり返す前に全部落ちていくコマを描いてしまっている」ので、ひっくり返ったら残像のように絵が下に伸びている状態になっていることでしょう。

ではどうすればいいか、それがKSwordOfHasteさんの回答です。ひっくり返すという行為を一定間隔で繰り返し、その都度絵の座標を更新することで、パラパラ漫画のように少しずつ移動しているように見せることができます。

投稿2017/10/25 00:31

masaya_ohashi

総合スコア9206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSwordOfHaste

2017/10/25 00:59

とても分かり易い解説ですね。(swingでなくても)GUIを始めたばかりの方にとても参考になると思いました。
fuzzball

2017/10/25 01:03

ダブルバッファの説明で「ホワイトボードをひっくり返す」という例えは初めて見ましたが、すごく良い例えですね。PCや端末の「中の人」が必死で描いているのを想像すると面白いです。 >>見る人はぐちゃぐちゃの描きかけを見せられることになり それが面白いってこともw
masaya_ohashi

2017/10/25 01:08

OpenGLとかを直接触っていると、ダブルバッファリング無しでやるとぐちゃぐちゃっぷりがよく見えます。ああ、こういうところも管理してくれるなんてGUIプログラミングは便利だなぁ、と思うのです。
guest

0

paintメソッドで少しずつ描画位置をずらしながらImageをdrawImageで描画としていますが、この方法ではアニメーションにはなりません。

Graphics#drawXxxは無条件・即座に描画を行うというものではありません。やりかたによりますが少なくとも同一のメソッドで連続して描画すると画面上「最後に描画した結果しか見えない」という結果になります。

swing/awtの再描画メカニズムは(プログラミング上の注意点をはっきりさせるために若干誇張して表現すると)以下のようになっています。

  1. ある領域の表示内容をrepaintメソッドで再描画が必要という状態にする
  2. 一呼吸おいて(ある程度の時間が経ってから)ランタイムが自動的にpaintメソッドを起動
  3. 起動されたpaint/paintComponentの中で*再描画が必要な部分を描画
  4. 一呼吸おいて(ある程度の時間が経ってから)3.の結果が画面に反映される

アニメーションさせるためには通常は以下のように考えます。

(1) javax.swing.Timerを用いて一定時間ごとある処理を起動させる
(2) その処理の中でImageの描画位置を変更し、repaintメソッドを呼び出す
(3) paint/paintComponentで描画位置に従って描画する

javax.swing.Timerの使用例を過去の質問(以下)に書いたことがあるのでMyComponentクラスの定義内容に注目してみてください。

https://teratail.com/questions/78033

投稿2017/10/24 23:16

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問