落書きノート

ふと自分が気になった事を書いてます

Javaアプレット シューティングゲームを作成 途中経過

Macで、Javaのデスクトップゲームを作成しようと思いましたが、BufferStrategyを使って、JFrameのウィンドウに図形を描画出来なかったため、アプレットで作成することにしました。アプレットでゲームを作成している人は結構多くて、参考になるサイトも多いです。簡単に学ぶには最適なのではと思いました。

当初、タスクシステムをJavaで実装すればどうなるかと気になって、色々と調べていると、Javaではマルチスレッドを使って簡単に出来るということが分かりました。タスクシステムかタイマーか、この二つをよく使っていた私ですが、いざプログラムを作っていると便利だと実感できました。

とりあえず途中経過を記録しておきます。ゲームを作るにあたって参考にしたサイトは以下のサイトです。

Javaでシューティングゲームを作ろう - ポンクソフト

今日は、デスクトップゲームで試行錯誤していて、時間がなくなってきたため、画像を表示するところまでしか完成しませんでした。また後日、作りこんで行きたいと思います。参考にしたサイトでは、縦スクロールシューティングですが、今回作ろうとしているのは横スクロールシューティングです。

以前、DXライブラリでも作ったゲームと同じような感じになりそうですが、Javaにおけるプログラミングではどうなるか…というところに焦点を当てています。プログラミング言語によっては、作り方が異なる場合もあるため、それを学ぼうというわけです。ロジック部分がわかっていれば、プログラミング言語の文法を試せるチャンスです。

package shooting_game_applet_ver;

import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class Shooting extends Applet implements Runnable, KeyListener {
    private int jx = 100;
    private int jy = 200;
    private Image player;
    private Image bullet;
    private Thread gameThread;
    private int tx, ty;
    private boolean tflag;
    private boolean keyLeft, keyRight, keySpace;
    
    public void init(){
        tflag = false;
        setBackground(Color.black);
        setForeground(Color.white);
        
        player = getImage(getDocumentBase(), "./shooting_game_applet_ver/player1_jiki.png");
        bullet = getImage(getDocumentBase(), "./shooting_game_applet_ver/player1_bullet.png");
        
        addKeyListener(this);
        requestFocus();
    }
    
    public void start(){
        gameThread = new Thread(this);
        gameThread.start();
    }
    
    public void stop(){
        gameThread = null;
    }
    
    public void run(){
        while(gameThread == Thread.currentThread()){
            try {
                Thread.sleep(20);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            
            if(keyLeft) jx -= 8;
            if(keyRight) jx += 8;
            
            if(jx < 0) jx = 0;
            if(jx > 300 - 32) jx = 300 - 32;
            
            if(keySpace){
                if(!tflag){
                    tx = jx + 12;
                    ty = jy;
                    tflag = true;
                }
            }
            
            if(tflag){
                if(ty < 0) tflag = false;
                else ty -= 8;
            }
            repaint();
        }
    }
    
    public void keyPressed(KeyEvent e){

    }
    
    public void keyReleased(KeyEvent e){
        
    }
    
    public void keyTyped(KeyEvent e){
        
    }
    
    public void paint(Graphics g){
        g.drawImage(player, jx, jy, this);
        
        if(tflag) g.drawImage(bullet, tx, ty, this);
    }
}

中途半端にロジックが書かれていますが、後で修正しますので、今回は、画像の表示方法はこんな感じだよ…と見ていただければ良いと思います。上記のコードは、Javaアプレットにおけるプログラムの雛形としても捉えることが出来ると思います。

20160116223741

アプレットは枯れた技術ではありますが、勉強には使える技術だと思います。それに加えてセキュリティ面を除けば、ウェブサイトに公開して遊んでもらう…というのが気軽に出来ます。

かつて枯れた技術であると言われていたJavaScriptも同様です。今ではウェブアプリケーションに積極的に使われていますが、ゲームプログラミングも出来ます。JavaScriptのライブラリである、Enchant.jsで手軽にゲームプログラミングすることも出来ますね。ただ、JavaScriptは、Javaに比べて機能が少ないというのが欠点であると個人的に思います。

今ではゲームエンジンであるUnity, Unreal Engine等の選択肢もあります。Unreal EngineFFVIIのリメイク版で使われるということで、一躍有名になりました。このようなゲームエンジンで、ゲームを作成するのも、随分と楽になりました。DirectXOpenGLを使って、一から作成しなくてもいいわけですからね。2Dと3Dのゲームが作れますが、みなさんが作りたいと思うのは恐らく3Dゲームでしょうね。

私はこの道の専門家ではないので、詳しくは言えませんが、2Dと3Dはちょっと勝手が違うというのが率直な感想でした。まあ、こう言えるのは色々と試した結果なのですが、QiitaにUnityを使った3Dゲーム作成についての記事を投稿していますので、興味があれば覗いてみてください。このブログにもリンクが貼ってある記事を投稿しています。

長々と書きましたが、途中経過はこんなところです。