Runnableインターフェイス|Javaから楽しく学ぶ!ゲームプログラミング専門学校

Javaから楽しく学ぶ!ゲームプログラミング専門学校

ゲームプログラミングとはその名のとおりゲームのプログラムを作ることを指します。『Javaから楽しく学ぶ!ゲームプログラミング専門学校』ではゲームプログラミングについて、実際にゲームプログラムをJAVAプログラミング言語を使用し、作成していきながら詳しく解説していきます。

Runnableインターフェイス

Runnableインターフェイスを用いることでスレッドを起動するしくみをつくることができます。

Runnableインターフェイスについては下記の記事に記載しています。
スレッドの作成(Runnableインターフェイス)

この記事では、Runnableインターフェイスをゲームプログラミング時により近い形で使用したサンプルを載せています。

下記にサンプルを記します。

import java.applet.*;
import java.awt.Graphics;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;

public class SmpRunnable extends Applet implements Runnable, MouseListener{
private Circle cir1;
private Circle cir2;
private Thread th;
private boolean running;
private int width;
private int height;

public void init(){
width = getSize().width; //Javaアプレット画面横幅サイズ取得
height = getSize().height; //Javaアプレット画面縦幅サイズ取得
addMouseListener(this); //マウスイベントを受け取り準備
}
public void start(){
cir1 = new Circle(width, height, 0, 50, 5, 0, 10, 10);
cir2 = new Circle(width, height, 50, 80, 5, 5, 15, 15);
running = false;
}
public void mouseClicked(MouseEvent e){
}
public void mouseEntered(MouseEvent e){
}
public void mouseExited(MouseEvent e){
}
public void mousePressed(MouseEvent e){
if(running == false){
running = true;
th = new Thread(this);
th.start(); //Javaアプレット画面描画用スレッド起動
cir1.start();
cir2.start();
}else{
running = false;
cir1.end();
cir2.end();
}
}
public void mouseReleased(MouseEvent e){
}
public void run(){
try{
while(running){
repaint();
Thread.sleep(100);
}
}catch(Exception e){}
}
public void paint(Graphics g){
g.fillOval(cir1.getPosX(), cir1.getPosY(),
cir1.getSizeX(), cir1.getSizeY());
g.fillOval(cir2.getPosX(), cir2.getPosY(),
cir2.getSizeX(), cir2.getSizeY());
}
}

class Circle implements Runnable{
Thread th;
boolean running;
int width;
int height;
int posX;
int posY;
int dx;
int dy;
int sizeX;
int sizeY;

Circle(int width, int height, int posX, int posY,
int dx, int dy, int sizeX, int sizeY){
this.width = width; //Javaアプレット画面横幅サイズ格納
this.height = height; //Javaアプレット画面縦幅サイズ格納
this.dx = dx; //サークル横移動距離格納
this.dy = dy; //サークル縦移動距離格納
this.sizeX = sizeX; //サークル横幅サイズ格納
this.sizeY = sizeY; //サークル縦幅サイズ格納
this.posX = posX; //サークル横座標初期位置格納
this.posY = posY; //サークル縦座標初期位置格納
running = false;
}
public void run(){
try{
while(running){
posX += dx;
posY += dy;

if(posX > width - sizeX){
dx = -5;
}
if(posX < 0){
dx = 5;
}
if(posY > height - sizeY){
dy = -5;
}
if(posY < 0){
dy = 5;
}
Thread.sleep(100);
}
}catch(Exception e){}
}
public void start(){
running = true;
th = new Thread(this);
th.start();
}
public void end(){
running = false;
}
public int getPosX(){
return posX;
}
public int getPosY(){
return posY;
}
public int getSizeX(){
return sizeX;
}
public int getSizeY(){
return sizeY;
}

}

少しソースコードが長くなってしまいましたが、このサンプルでは2つのサークル(円)を動かす処理をそれぞれ別のスレッドで行っています。
 → 動作内容確認

下記にソースコードの簡単な説明を記載します。

public class SmpRunnable extends Applet implements Runnable, MouseListener{

………

public void run(){
try{
while(running){
repaint();
Thread.sleep(100);
}
}catch(Exception e){}
}

………

}

SmpRunnableクラスはAppletクラスを継承し、RunnableインターフェイスとMouseListenerインターフェイスを実装しています。

Runnableインターフェイスを実装したクラスではrun()メソッドを定義する必要があります。
run()メソッド内には別スレッドで行う処理を記述します。

SmpRunnableクラスのrun()メソッドでは、100ミリ秒(0.1秒)ごとにrepaint()メソッドを呼び出しています。
repaint()メソッドはAppretクラスが持つメソッドであり、呼び出すと、paint()メソッドが実行されます。
paint()メソッドはアプレット画面を描画するという役割を担っています。

つまり、1秒間に10回(FPS=10)、アプレット画面を再描画しています。


public void mousePressed(MouseEvent e){
if(running == false){
running = true;
th = new Thread(this);
th.start(); //Javaアプレット画面描画用スレッド起動
cir1.start();
cir2.start();
}else{
running = false;
cir1.end();
cir2.end();
}
}

マウスのボタンを押したときに呼び出されるmousePressed()メソッドでは、別スレッドの起動/停止処理を行っています。
また、Circleクラスのインスタンスであるcir1、cir2のstart()メソッド、end()メソッドを呼び出しています。

Circleクラスのstart()メソッドでも新しくスレッドを作成しています。
作成したスレッドでは、サークルの位置情報を更新する処理を行っています。


このサンプルでは、メインスレッドを合わせると、合計4つのスレッドが動くことになります。
トラックバック:0Edit
Copyright © Javaから楽しく学ぶ!ゲームプログラミング専門学校 All Rights Reserved.
当サイトのテキストや画像等すべての転載転用・商用販売を固く禁じます