10
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Java】ポケモンショックをJavaで再現する

Last updated at Posted at 2015-06-27
Pokemonshock.java

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferStrategy;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JFrame;

public class Pokemonshock {
        
        public static void main(String[] args) {
                Pokemonshock gtm = new Pokemonshock();
                gtm.start();
        }
        
        JFrame mainwindow;
        BufferStrategy strategy;
        Boolean apple=true;
        
        //コンストラクタ
        Pokemonshock(){
            this.mainwindow=new JFrame("Pokemonshock");
            this.mainwindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.mainwindow.setSize(1280,720);
            this.mainwindow.setLocationRelativeTo(null);
            this.mainwindow.setVisible(true);
            this.mainwindow.setResizable(false);
            //バッファストラテジー
            this.mainwindow.setIgnoreRepaint(true);
            this.mainwindow.createBufferStrategy(2);
            this.strategy=this.mainwindow.getBufferStrategy();
        }
        
        void start(){
            //intervalミリ秒毎にrunメソッドが呼ばれる
            Timer t=new Timer();
            long interval=(1000/12);
            TimerTask task=new RenderTask();
            t.schedule(task,0,interval);
        }
        
        void render(){
            Graphics2D g=(Graphics2D)this.strategy.getDrawGraphics();
            
	        //背景色の指定
                if(apple){
                  g.setBackground(Color.RED);
                }else{
                  g.setBackground(Color.BLUE);  
                }
                
            //反転させる
            apple=!apple;
		
            g.clearRect(0, 0,this.mainwindow.getWidth(), this.mainwindow.getHeight());
            g.dispose();
            this.strategy.show();
        }
        
        class RenderTask extends TimerTask{
            
	    @Override
	    public void run() {
                Pokemonshock.this.render();
            }
        }

}


##環境
ベアボーン:Shuttle XS35GS V3
OS:win7(32bit)
JAVA SE8(jdk-8u45-windows-i586)

##注意
このプログラムを実行すると、光過敏性発作を起こすかもしれないので注意ください。また、画面を激しくない点滅にする方法を載せておきます。赤と青の画面の切り替えは1秒に12回の仕様ですが、1秒に1回に変更する方法は次のとおりです。



long interval=(1000/12);
// ↓ 12から1に変える
long interval=(1000/1);

##解説

今回、Javaのリアルタイム処理の勉強の題材に「ポケモンショック、赤と青の激しい点滅」を選んだ。
リアルタイム処理に使うのはTimerTaskクラスとTimerTaskクラスのrunメソッドである。
TimerTaskクラスは抽象クラスであり、TimerTaskクラスのrunメソッドは抽象メソッドである。抽象クラスはオブジェクトを生成できないので、TimerTaskクラスは継承してRenderTaskクラスとし、runメソッドはオーバーライドして使用する。runメソッドは1秒に12回呼び出しをされる。

##実行結果

c:\2015>javac Pokemonshock.java

c:\2015>java Pokemonshock

c:\2015>

##あとがき
1997年に『ポケットモンスター』第38話「でんのうせんしポリゴン」を鑑賞した児童の中で赤と青の激しい光の点滅により光過敏性発作で病院に運び込まれるポケモンショックという事件が起きた。私は当時小学生でポケモンに夢中でしたが、地方在住のためテレビ東京が映らず、ポケモンの放送が何話か遅れている地方局で見ていたため、この第38話は見ていません。この事件で、ポケモンが一旦放送をやめてしまし、代わりに学級王ヤマザキが私が見ていた地方局で放送されていました。

10
7
0

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
10
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?