今からはじめるプログラミング61(シューティング?)

シューティングにもいろいろ飽きてきたので。

     (わからないことにつかれた)

プログラムの構造がよくわからいので、

     (シンプルに上から流れないと理解できない)

わかるようにシンプルに修正して、

     (エラーのないように機能を削って)

みよう。

という感じで、時計に改造しましたw

     (どうしてこうなった?)

とはいえ、いろいろまだ残っているのですが。

     (なんとなくプログラムの構造が?見えた?)

100行以上のプログラムは年寄りにはつらいので、100行以下になったShootingクラスが以下です。(なお、修正はパッケージごとコピーをとっておこなっています。取り返しのつかない修正をしてしまう前に、バックアップを忘れずにw)

-------------------------------

package sample27;

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.imageio.ImageIO;

/**
 * @author user
 * @modify histories
 * to ke i
 */
public class Shooting {
    public static ShootingFrame shootingFrame;
    public static boolean loop;

    public static void main(String[] args) {
        shootingFrame = new ShootingFrame();
        loop = true;

        Graphics gra = shootingFrame.panel.image.getGraphics();

        // FPS
        long startTime;
        long fpsTime = 0;
        int fps = 30;
        int FPS = 0;
        int FPSCount = 0;
        //時計用ふぉーまった
        DateFormat dt = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");

        EnumShootingScreen screen = EnumShootingScreen.START;
        BufferedImage image=null;
        try {
             image = ImageIO.read(new File("./ぺんぎん.png"));
        } catch (IOException e1) {
            // TODO 自動生成された catch ブロック
            e1.printStackTrace();
        }

        //むげんるーぷ
        while (loop) {
            //FPSけいさん
            if *1 {
                    screen = EnumShootingScreen.GAME;
                }
                break;
            case GAME:

                // mod start 2022/8/2 ma2
                // Player描画
                gra.setColor(Color.BLUE);
                font = new Font("SansSerif", Font.PLAIN, 20);
                metrics = gra.getFontMetrics(font);
                //とけい表示用日付のオブジェクトをフォーマッタを通して文字列に。
                String drawString =dt.format(new Date());;
                gra.drawString(drawString, 150 - (metrics.stringWidth(drawString) / 2), 50);

                //えを1秒ごとにかえる
                gra.drawImage(image,200,200,200,200,null);
                break;

            }

            gra.setColor(Color.BLACK);
            gra.setFont(new Font("SansSerif", Font.PLAIN, 10));
            gra.drawString(FPS + "FPS", 0, 470);

            shootingFrame.panel.draw();

            try {
                long runTime = System.currentTimeMillis() - startTime;
                if (runTime < (1000 / fps)) {
                    Thread.sleep*2;
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

--------------------------------------

実行結果は以下です。

とけい実行結果

普通の時計(⬇️)は高いですが、プログラムならただです?

 

*1:System.currentTimeMillis() - fpsTime) >= 1000) {
                fpsTime = System.currentTimeMillis();
                FPS = FPSCount;
                FPSCount = 0;
            }
            FPSCount++;
            startTime = System.currentTimeMillis();

            gra.setColor(Color.WHITE);
            gra.fillRect(0, 0, 500, 500);

            switch (screen) {
            case START:
                gra.setColor(Color.BLACK);
                Font font = new Font("SansSerif", Font.PLAIN, 50);
                gra.setFont(font);
                FontMetrics metrics = gra.getFontMetrics(font);
                gra.drawString("Shooting?", 250 - (metrics.stringWidth("Shooting?") / 2), 100);
                font = new Font("SansSerif", Font.PLAIN, 20);
                gra.setFont(font);
                metrics = gra.getFontMetrics(font);
                gra.drawString("Press SPACE to Start", 250 - (metrics.stringWidth("Press SPACE to Start") / 2), 160);
                if (Keyboard.isKeyPressed(KeyEvent.VK_SPACE

*2:1000 / fps) - (runTime