LoginSignup
19
22

More than 5 years have passed since last update.

Javaでゲームを作るためのSwingの基礎サンプル

Last updated at Posted at 2016-08-30

概要

自分の確認用に製作したSwingの基礎を説明したサンプルコードです。Javaでゲームを作ろうとしている初心者(=俺)に向けて、少しでも参考になればと思った次第です。

プログラム自体は赤い矩形が大きくなったり小さくなったりする、ごく単純なプログラムなのですが、
JFrame や JPanel、Event取得やThread等、おおよそゲーム製作に必要になるであろう技術を可能な限り簡潔に詰め込みました。

BasicDrawing.java

/*
    javax.swing における 2D描画の基礎
*/

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.BorderLayout;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;

//JFrame を継承
public class BasicDrawing extends JFrame{
    public static void main(String args[]){
        BasicDrawing frame = new BasicDrawing("ゲーム画面");//引数はWindow Title
        frame.setVisible(true);
    }

    //constructor. フレームの設定関係を行う
    BasicDrawing(String title){
        setTitle(title);
        setSize(640,480);
        setLocationRelativeTo(null);//初期画面表示位置を中央に
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//CLOSEでプログラム終了

        Container CP = getContentPane();//getContentPane()はJFrameクラスに定義されている
        //CP.setLayout(null);//レイアウトマネージャを停止

        //上部の背景色を橙に設定する
        JPanel panel = new JPanel();
        panel.setBackground(Color.ORANGE);
        CP.add(panel, BorderLayout.NORTH);

        //Mainパネルの作成、フレームへのセット
        MainPanel MP = new MainPanel();
        CP.add(MP);
        //CP.remove(MP);//フレームを外す
        addKeyListener(MP);//KeyListenerをフレームにセット
        //CP.removeKeyListener(MP);//KeyListenerを外す
    }
}

class MainPanel extends JPanel implements Runnable, KeyListener{
    int x = 100, y = 100;
    boolean state = true;
    Thread t;

    MainPanel(){
        //setLayout(null);
        setBackground(Color.blue);//背景色を青に
        t = new Thread(this);//Thread instance
        t.start();//Thread Start
    }

    //Runnableによるrun() method
    public void run(){
        //無限ループでThreadが終了しないようにする
        while(true){
            //矩形の大きさを変更する
            if(x < 300 && state){
                x++;
                y++;
            }
            else if(x > 0 && !(state)){
                x--;
                y--;
            }

            try{
                t.sleep(100);//100ms毎に実施
            }catch(InterruptedException e){}

            repaint();
        }
    }

    //JComponentによるpaintComponent method
    //JPanel は JComponent を継承している
    public void paintComponent(Graphics g){
        //赤い矩形を描画する
        g.setColor(Color.red);
        g.fillRect(x, y, 20, 20);//引数は(X座標,Y座標,Width,height)
    }

    /**********************
        KeyEvent
    **********************/
    //Keyが押された場合
    public void keyPressed(KeyEvent e){
        switch(e.getKeyCode()){
            case KeyEvent.VK_SPACE:
            case KeyEvent.VK_A:
                System.out.println("KeyPressed");
                if(state)state = false;
                else state = true;
                break;
        }
    }

    //Keyが離された場合
    public void keyReleased(KeyEvent e){}

    //Keyが押された場合
    public void keyTyped(KeyEvent e){}
}

実行結果

image.png

追記

ご指摘いただいた実行結果の画像を追加。
ソース内keyReleasedとkeyTyped関数をコメントアウトするとエラーを吐くので訂正しました。

19
22
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
22