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

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

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

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

Q&A

2回答

1295閲覧

java キャラクターをジャンプさせるプログラムの作成について

gurimarukin

総合スコア0

Java

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

0グッド

0クリップ

投稿2023/01/20 08:03

javaでキャラクターをジャンプさせるタイルベースゲームを作っているのですが、思うようにいきません。
ジャンプキーを押したらboyJumpメソッドを実行し、キャラクターが滑らかにジャンプして見えるようにしたいと考えています。

現時点では以下のようにしているのですが、これを滑らかに動かそうとするとtaskを無数に作る事になってしまうため別の方法にしようとしています。

ですが、taskを繰り返し文で繰り返したり、ネットで見つけたthread.sleepを使ってみたりしても上手く動きません。どんな形でもいいので、改善方法を教えていただきたいですm(__)m

ソースコード

java

1 2 public void boyJump() { 3 SimpleDateFormat sdf = new SimpleDateFormat(); 4 Timer timer = new Timer(false); 5 TimerTask task1 = new TimerTask() { 6 @Override 7 public void run() { 8   //boyYはキャラクターのY座標を表す変数 9 boyY -= 0.2; 10 } 11 }; 12 TimerTask task2 = new TimerTask() { 13 @Override 14 public void run() { 15 boyY -= 0.1; 16 } 17 }; 18 19 TimerTask task3 = new TimerTask() { 20 @Override 21 public void run() { 22 boyY += 0.1; 23 } 24 }; 25 26 TimerTask task4 = new TimerTask() { 27 @Override 28 public void run() { 29 boyY += 0.2; 30 timer.cancel(); 31 } 32 }; 33 timer.schedule(task1, 500); 34 timer.schedule(task2, 1000); 35 timer.schedule(task3, 1500); 36 timer.schedule(task4, 2000); 37 38 } 39

(別の部分に描画用の関数があります)

試したこと

taskを繰り返し文で実行する→同じtaskを繰り返そうとするとエラー
timertaskの代わりにthread.sleepをつけて実行する→見た目上はキャラクターが動かない

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

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

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

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

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

jimbe

2023/01/21 10:45 編集

アニメーションの基本的な作り方を考えては如何でしょう。 他言語ですが、考え方などは参考になるかも知れません。 [気持ちのいいジャンプを目指して] https://qiita.com/odanny/items/297f32a334c41410cc5d
guest

回答2

0

現状のコードをベースに考えると、Timer#scheduleAtFixedRate() で繰り返し呼ばれるタスクを1つ作って、その中で経過時間から計算して座標を求めるほうがシンプルだとは思います。


ゲームだと画面中の色々なものが同時に動いているのが普通なので、たとえば 1/60 秒毎に「現在時刻の座標を計算して画像の種類を決めて描画せよ」という処理を全ての動くオブジェクトに対して呼ぶようになるかもしれません。

投稿2023/01/23 22:36

int32_t

総合スコア20884

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

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

0

気持ちのいいジャンプを目指して の最初のを java - swing にしてみました。スペースキーでジャンプします。

ひよこ画像 80×80,PNG
※ひよこ画像は odanny さんの著作物…かもしれません。

java

1import java.awt.*; 2import java.awt.event.KeyEvent; 3import java.awt.event.KeyListener; 4import java.io.File; 5import java.io.IOException; 6 7import javax.imageio.ImageIO; 8import javax.swing.*; 9 10public class MainFrame extends JFrame { 11 public static void main(String[] args) { 12 SwingUtilities.invokeLater(() -> new MainFrame().setVisible(true)); 13 } 14 15 private Timer timer; 16 private GamePanel gamePanel; 17 18 MainFrame() { 19 super("じゃんぴんぐひよこ"); 20 setDefaultCloseOperation(EXIT_ON_CLOSE); 21 22 try { 23 gamePanel = new GamePanel(); 24 add(gamePanel); 25 start(); 26 } catch(IOException e) { 27 e.printStackTrace(); 28 } 29 pack(); 30 } 31 32 private void start() { 33 timer = new Timer(1000/30, v -> gamePanel.updateHiyoko()); 34 timer.start(); 35 } 36 37 private class GamePanel extends JPanel { 38 private static int Y_GROUND = 450; //地面のy座標 39 private Image hiyoko; 40 41 private final int acc = 1; 42 private int vel = 0, y = Y_GROUND-80; 43 private boolean canJump = false; 44 45 GamePanel() throws IOException { 46 super(null); 47 setSize(600, 600); 48 setPreferredSize(getSize()); 49 setBackground(Color.WHITE); 50 setFocusable(true); 51 52 hiyoko = ImageIO.read(new File("hiyoko.png")); //80px × 80px 53 54 addKeyListener(new KeyListener() { 55 @Override 56 public void keyTyped(KeyEvent ignore) {} 57 @Override 58 public void keyPressed(KeyEvent e) { 59 if(e.getKeyCode() == KeyEvent.VK_SPACE) jump(); 60 } 61 @Override 62 public void keyReleased(KeyEvent ignore) {} 63 }); 64 } 65 66 synchronized private void jump() { 67 if(canJump) { 68 canJump = false; 69 vel = -20; //初速を与える 70 } 71 } 72 73 synchronized private void updateHiyoko() { 74 if(canJump) return; 75 vel += acc; 76 y += vel; 77 if(y > Y_GROUND-80) { //地面についたら 78 y = Y_GROUND-80; 79 canJump = true; 80 } 81 repaint(); 82 } 83 84 @Override 85 protected void paintComponent(Graphics g) { 86 super.paintComponent(g); 87 88 g.setColor(Color.RED); 89 g.drawLine(0, Y_GROUND, getWidth(), Y_GROUND); 90 91 g.drawImage(hiyoko, 300-40, y, null); 92 } 93 } 94}

投稿2023/01/21 12:01

jimbe

総合スコア12648

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問