画像(logo)

HOME/[JAVA言語 入門]小学生でもわかるJAVA言語 目次/おまけ ゲームテクニック集

広告

[JAVA言語 入門 小学生でもわかるJAVA言語]
おまけ ゲームテクニック集

広告

↓発売日:2017年04月04日↓

Java 第2版 入門編 ゼロからはじめるプログラミング (プログラミング学習シリーズ)

新品価格
¥2,030から
(2018/10/8 23:34時点)

目次へ戻る

ゲームテクニック集

ひとまずの入門を終えた方に向けて簡単なゲーム制作に使えそうなテクニックをご紹介します。

こちらの内容と合わせれば、

JAVA言語 ブロックパズルの作り方

にあるようなごくささやかなゲームであれば作れるようになるかと思いますのでもしよかったら挑戦してみてください。

目次

  • 2Dゲームの土台
  • 乱数(ランダムな数)
  • セットで一つ(クラス)
  • 割った余り法
  • どこでも使える変数
  • 定まった数(定数)
  • 2Dゲームの土台

    import javafx.application.Application;
    import javafx.stage.Stage;
    import javafx.stage.Stage;
    import javafx.scene.Scene;
    import javafx.scene.layout.Pane;
    import javafx.scene.canvas.Canvas;
    import javafx.scene.canvas.GraphicsContext;
    import javafx.animation.AnimationTimer;
    import javafx.scene.paint.Color;
    import javafx.scene.input.KeyEvent;
    import javafx.scene.input.*;
    import javafx.event.EventHandler;
    import javafx.scene.text.Font;
    import javafx.scene.text.FontWeight;
    
    public class Test extends Application{
    	private TestThread testthread;
    	private Key key;
    
    	public static void main(String args[]){
    		launch(args);
    	}
    
    	@Override
    	public void start(Stage stage){
    		stage.setTitle("TEST");
    		Pane pane = new Pane();
    		Scene scene = new Scene(pane);
    		stage.setScene(scene);
    
    		Canvas canvas = new Canvas(640,480);
    		GraphicsContext gc = canvas.getGraphicsContext2D();
    		pane.getChildren().add(canvas);
    
    		key = new Key();
    
    		scene.setOnKeyPressed(
    			new EventHandler<KeyEvent>(){
    				public void handle(KeyEvent e){
    					key.key_pressed(e);
    				}
    			}
    		);
    
    		scene.setOnKeyReleased(
    			new EventHandler<KeyEvent>(){
    				public void handle(KeyEvent e){
    					key.key_released(e);
    				}
    			}
    		);
    
    		testthread = new TestThread(gc,key);
    		testthread.start();
    
    		stage.show();
    	}
    }
    
    class TestThread extends AnimationTimer{
    	private GraphicsContext gc;
    	private Key key;
    
    	/*変数の宣言などを書いていく*/
    
    	TestThread(GraphicsContext gc,Key key){
    		this.gc = gc;
    		this.key = key;
    
    		/*コンストラクタ*/
    		/*最初の1回だけ実行されるので初期化などを書く*/
    	}
    
    	@Override
    	public void handle(long time){
    		gc.clearRect(0,0,640,480);
    
    		/*ゲームループ*/
    		/*この部分がすごい速さで繰り返される*/
    		/*メインプログラムを書く*/
    
    		key.calc_key_count();
    
    		gc.fillText("key_code = " + key.get_key_code(),450,430);
    		gc.fillText("左 = " + key.get_left(),450,450);
    		gc.fillText("右 = " + key.get_right(),450,470);
    	}
    
    	/*この後に追加の自作メソッドなどを書いていく*/
    }
    
    class Key{
    	private boolean left,right,up,down,z;
    	private int left_count,right_count,up_count,down_count,z_count;
    	private KeyCode key_code;
    
    	Key(){
    		left = false;
    		right = false;
    		up = false;
    		down = false;
    		z = false;
    		left_count = 0;
    		right_count = 0;
    		up_count = 0;
    		down_count = 0;
    		z_count = 0;
    		key_code = null;
    	}
    
    	void key_pressed(KeyEvent e){
    		switch(e.getCode()){
    		case LEFT:
    			left = true;
    			break;
    		case RIGHT:
    			right = true;
    			break;
    		case UP:
    			up = true;
    			break;
    		case DOWN:
    			down = true;
    			break;
    		case Z:
    			z = true;
    			break;
    		default:
    			break;
    		}
    		key_code = e.getCode();
    	}
    
    	void key_released(KeyEvent e){
    		switch(e.getCode()){
    		case LEFT:
    			left = false;
    			break;
    		case RIGHT:
    			right = false;
    			break;
    		case UP:
    			up = false;
    			break;
    		case DOWN:
    			down = false;
    			break;
    		case Z:
    			z = false;
    			break;
    		default:
    			break;
    		}
    		key_code = null;
    	}
    	
    	void calc_key_count(){
    		if(left)left_count++;
    		else left_count = 0;
    
    		if(right)right_count++;
    		else right_count = 0;
    
    		if(up)up_count++;
    		else up_count = 0;
    
    		if(down)down_count++;
    		else down_count = 0;
    
    		if(z)z_count++;
    		else z_count = 0;
    	}
    
    	int get_left(){
    		return left_count;
    	}
    	int get_right(){
    		return right_count;
    	}
    	int get_up(){
    		return up_count;
    	}
    	int get_down(){
    		return down_count;
    	}
    	int get_z(){
    		return z_count;
    	}
    	KeyCode get_key_code(){
    		return key_code;
    	}
    }
    

    ■実行結果■

    画像(jb_15_1)

    ■説明■

    2Dゲームの土台

    高速描画にキーボード入力などを加えた簡単な2Dゲームの土台になります。

    使い道

    2Dゲーム

    使い方

    コメントの場所に適切に変数、初期化部分、メソッドなどを配置していきます。

    サンプルでは矢印キーの入力状態を数値化したもの、並びにキーコードを表示しております。

    矢印キーは押された分だけ値が上昇するような仕組みになっておりますので

    if(key.get_left() > 0){
    	/*左が押された時の処理*/
    }
    

    のようにすればキーが押されれば即時に反応しますし、

    if(key.get_left() > 100){
    	/*左が押された時の処理*/
    }
    

    長押しした時

    if(key.get_left() > 10 && key.get_left() < 30){
    	/*左が押された時の処理*/
    }
    

    ちょい押しした時

    のように細かく入力を処理できます。

    他にも描画メソッドの一部を紹介させて頂くと

    塗りつぶしの四角

    fillRect(x座標,y座標,横幅,縦幅);
    

    外枠の四角

    strokeRect(x座標,y座標,横幅,縦幅);
    

    塗りつぶしの円

    fillOval(x座標,y座標,横幅,縦幅);
    

    外枠の円

    strokeOval(x座標,y座標,横幅,縦幅);
    

    色の変更

    塗りつぶし

    setFill(Color.RED);
    

    外枠

    setStroke(Color.RED);
    

    などがあります。

    こちらのサンプルで使う時は「gc.fillRect(x座標,y座標,横幅,縦幅);」などのように「gc.」を先頭につけてコメントのゲームループと書いてあるトコロに設置すれば使えます。

    もちろん他にもありますので詳しく知りたい方は「JavaFX GraphicsContext2D メソッド」などでインターネット検索してみてください!

    あとは当サイトでもこちらの土台を用いた簡易なゲームも作成しておりますのでもしよろしければそちらも参考にしてみてください!

    [JAVA言語]ブロックパズルの作り方

    [JAVA言語]ブロック崩しの作り方

    乱数(ランダムな数)

    import java.util.Random;
    
    class Test{
    	public static void main(String args[]){
    		Random rnd = new Random();
    		int ransu;
    
    		for(int kazu=0;kazu<10;kazu++){
    			ransu = rnd.nextInt(10);
    			System.out.print(ransu + " ");
    		}
    
    		System.out.print("\n");
    	}
    }
    

    ■実行結果■

    画像(jb_15_2)

    ■説明■

    乱数(らんすう)

    乱数(ランダムな数)を発生させます!

    使い道

    確率によって起こる事全てに使います。

    使い方

    プログラムの先頭に

    import java.util.Random;
    

    こちらを加えて

    Random rnd = new Random();
    

    乱数を使う為の変数を用意

    そして

    ransu = rnd.nextInt(10);
    

    こちらで乱数を発生させます。

    「rnd.nextInt(10)」この()カッコ内の数字が乱数の範囲になります。

    「rnd.nextInt(10)」だと「0~9」まで

    「rnd.nextInt(50)」だと「0~49」まで

    のようになります。

    セットで一つ(クラス)

    class AddressBook{
    	public String name;
    	public String tel;
    	public int age;
    }
    
    class Test{
    	public static void main(String args[]){
    		AddressBook tarou = new AddressBook();
    		AddressBook hanako = new AddressBook();
    
    		AddressBook kumi6_3[] = new AddressBook[10];
    		for(int i = 0;i < 10;i++){
    			kumi6_3[i] = new AddressBook();
    		}
    
    		tarou.name = "山田太郎";
    		tarou.tel = "09011112222";
    		tarou.age = 18;
    		
    		hanako.name = "山田花子";
    		hanako.tel = "09033334444";
    		hanako.age = 20;
    
    		kumi6_3[0].name = "鈴木一郎";
    		kumi6_3[0].tel = "09012344321";
    		kumi6_3[0].age = 12;
    
    		kumi6_3[1].name = "田中二郎";
    		kumi6_3[1].tel = "09022334455";
    		kumi6_3[1].age = 12;
    
    		System.out.println(tarou.name + " "
    			 + tarou.tel + " " + tarou.age + "才");
    		System.out.println(hanako.name + " "
    			 + hanako.tel + " " + hanako.age + "才");
    		System.out.println(kumi6_3[0].name + " "
    			 + kumi6_3[0].tel + " " + kumi6_3[0].age + "才");
    	}
    }
    

    ■実行結果■

    画像(jb_15_3)

    ■説明■

    セットで一つ(クラス)

    クラスという機能を使えばいくつかの変数をまとめてセットのように使ったり、さらにはその変数の値を設定、変更、表示するなど動作に関する部分も一緒にセットにする事ができます。

    今回はその中の「いくつかの変数をまとめてセットのように使う」技術を紹介します。

    使い道

    電話帳などなど

    使い方

    1・セットの内容を決める

    まずはセットの内容を決めます。

    ・名前

    ・電話番号

    ・年令

    これを元に「クラス変数」を作ります。

    class AddressBook{
    	public String name;
    	public String tel;
    	public int age;
    }
    

    こちらが今決めた内容の構造体変数になります。

    「class」の後にその「セットの名前」

    電話帳→「AddressBook」

    セットの名前は普通の変数などと区別できるように頭文字と途中の単語の先頭は大文字でつけたりします。

    そして内容を中に書きます。

    これをいつも使っている「public static void main()」を含むクラスとは別に書いておきます。

    2・変数として宣言する

    あとは普通の変数のように名前を付けて使います。

    AddressBook tarou = new AddressBook();
    AddressBook hanako = new AddressBook();
    

    今作った「セットの名前」の後に使う時の「変数名」をつけて「new AddressBook()」のようにします。

    配列にしてたくさんのデータをいっきに管理する事もできます。

    AddressBook kumi6_3[] = new AddressBook[10];
    for(int i = 0;i < 10;i++){
    	kumi6_3[i] = new AddressBook();
    }
    

    配列の場合は少しややこしいですが、2段階に分けて宣言します。

    最初の「new AddressBook[10]」が「AddressBookという入れ物を10個使います!」みたいな意味でその後に同じように一つ一つに「new AddressBook()」のようにします。

    これ以上のきちんとした説明はちょっと小難しい話になるので別の機会にしたいと思います。

    そして一つ一つの内容を入れていきます。

    例えば「tarou」だったら

    tarou.name = "山田太郎";
    tarou.tel = "09011112222";
    tarou.age = 18;
    

    変数名の間を「.」コンマで区切ってその内容を書きます。

    配列の場合は

    kumi6_3[0].name = "鈴木一郎";
    kumi6_3[0].tel = "09012344321";
    kumi6_3[0].age = 12;
    

    配列番号をくっつけて後は同じように内容を書きます。

    そして使う時も同じように「kumi6_3[0].name」のように「.」で区切って使います。

    割った余り法

    class Test{
    	public static void main(String args[]){
    		for(int i = 0;i < 20;i++){
    			System.out.print(i + " ÷ 3 = " + (i / 3) + " 余り " + (i % 3) + "\n");
    		}
    	}
    }
    

    ■実行結果■

    画像(jb_15_4)

    ■説明■

    割った余りがぐるぐる回ります

    変数なんかで同じトコロをぐるぐる回したい場合ってあると思います。

    123401234012340123401234...

    みたいな感じでぐるぐる回したような結果が得られます。

    使い道

    いろいろ使えます。

    使い方

    とりあえずの変数とそれを割る数を決めて、その余りを使います。

    割る数が「3」だと「012012012...」「4」だと「012301230123...」みたいに回ります。

    System.out.print(i + " ÷ 3 = " + (i / 3) + " 余り " + (i % 3) + "\n");
    

    この計算はわかりやすいように割った結果もだしてますが、

    実際に使う時は

    余り = i % 3
    

    これだけで大丈夫です。

    あとはこれをインクリメントするなりしていけば「0123012...」のように同じトコロをぐるぐる回る結果が得られます。

    ただインクリメントしすぎてもとの変数がマイナスになったりすると少しおかしな結果になる事があるので、ある限界で元に戻すなどエラー対策が必要です。

    反対方向にぐるぐる

    class Test{
    	public static void main(String args[]){
    		for(int i = 0;i < 50;i+=3){
    			System.out.print(i + " ÷ 4 = " + (i / 4) + " 余り " + (i % 4) + "\n");
    		}
    	}
    }
    

    ■実行結果■

    画像(jb_15_5)

    ■説明■

    反対方向のループにしたい場合は

    「割る数 - 1」

    の数を足していきます。

    どこでも使える変数

    class Global{
    	private Global(){}
    	public static int suji;
    	public static float syousuu;
    	public static String bunsyou;
    }
    
    class Test{
    	public static void main(String args[]){
    		Global.suji = 1200;
    		Global.syousuu = 3.14f;
    		Global.bunsyou = "hello world";
    
    		System.out.println("Global.suji = " + Global.suji);
    		System.out.println("Global.syousuu = " + Global.syousuu);
    		System.out.println("Global.bunsyou = " + Global.bunsyou);
    	}
    }
    

    ■実行結果■

    画像(jb_15_6)

    ■説明■

    いつでもどこでも使える

    Java言語を学習していると変数の使える範囲について悩む事があるかもしれません。

    そんな時に便利ないつでもどこでも使える変数をご紹介します。

    ただいつでもどこでも使える変数というのは大規模なシステム開発などでは変数名の重複などが原因で思わぬバグを引き起こす恐れがあり、あまりよくないとされておりので使う時はほどほどにしておきましょう。

    使い道

    いつでもどこでも使いたい時に

    使い方

    適当にいつでもどこでも使える変数用のクラスを作ります。

    クラスの軽い説明はこちらをご覧ください。

    別に名前はこの「Global」でなくて好きな名前でかまいません。

    次に「private Global(){}」という一文を先頭に書きます。

    これはインスタンス化する必要のないクラスなのでこの一文を書いているワケなのですが現時点では意味不明だと思いますのでとりあえずはこのように書いておけば大丈夫です。

    あとは「public static」というのを頭につけて変数を宣言するだけです。

    使う時は

    Global.suji = 1200;
    Global.syousuu = 3.14f;
    

    のようにします。

    定まった数(定数)

    class Define{
    	private Define(){}
    	public static final int MAX = 100;
    }
    
    class Test{
    	public static void main(String args[]){
    		int ans = 0;
    
    		for(int count = 0;count <= Define.MAX;count++){
    			ans += count;
    		}
    
    		System.out.println("ans = " + ans);
    	}
    }
    

    ■実行結果■

    画像(jb_15_7)

    ■説明■

    変更しない数字

    プログラム中であまり変更しない数字、例えばゲームでいうなら敵の最大数とかステージの最大数などのようにむやみやたらに変更しない、むしろうっかりミスで変更できないような数字を作ります。

    使い道

    上手に使えばわかりやすく変更しやすいプログラムにする事ができます。

    使い方

    適当に変更しない数字用のクラスを作ります。

    クラスの軽い説明はこちらをご覧ください。

    別に名前はこの「Define」でなくて好きな名前でかまいません。

    次に「private Define(){}」という一文を先頭に書きます。

    これはインスタンス化する必要のないクラスなのでこの一文を書いているワケなのですが現時点では意味不明だと思いますのでとりあえずはこのように書いておけば大丈夫です。

    あとは「public static final」というのを頭につけて変数を宣言するだけです。

    そして使う時はそのまま

    for(int count = 0;count <= Define.MAX;count++){
    	ans += count;
    }
    

    こうする事でまずはうっかりミスによる値の変更を避ける事ができます。

    試しに「Define.MAX = 200」のように変更してみるとエラーになるのが確認できるかと思います。

    さらにはプログラムの先頭を見ただけで大事な数字の内容がある程度わかるし、普通の変数とも区別がつけられるし、変更する時もこの先頭部分だけ変えれば済んでしまうというワケです。

    □ページの先頭へ□

    □目次へ戻る□

    □HOME□

    広告

    ↓発売日:2017年04月18日↓

    Java本格入門 ~モダンスタイルによる基礎からオブジェクト指向・実用ライブラリまで

    新品価格
    ¥2,990から
    (2018/10/8 23:35時点)

    ↓発売日:2016年06月25日↓

    新・明解Java入門 (明解シリーズ)

    新品価格
    ¥2,916から
    (2018/10/8 23:36時点)

    ↓発売日:2016年08月31日↓

    やさしいJava 第6版 (「やさしい」シリーズ)

    新品価格
    ¥2,786から
    (2018/10/8 23:37時点)

    ↓発売日:2018年11月21日↓

    本格学習 Java入門 [改訂3版]

    新品価格
    ¥2,462から
    (2018/10/8 23:38時点)

    ↓発売日:2016年12月15日↓

    Javaの絵本 第3版 Javaが好きになる新しい9つの扉

    新品価格
    ¥1,706から
    (2018/10/8 23:39時点)

    ↓発売日:2016年09月28日↓

    やさしいJava 活用編 第5版 (「やさしい」シリーズ)

    新品価格
    ¥2,786から
    (2018/10/8 23:40時点)