人生、気合いと具合 - blog

タグ:いろふ

This post is written as 23rd in irof Advent Calendar and JavaFX Advent Calendar.

Regardless of the Mayan calendar, I'm glad you are safe.
We are not interested in it, however, irof-san saved the Earth.

unzip and double click irof.jar



irof_screen_shot


When hold down the left mouse button, the balloon(?) is fired towards the mouse cursor, using the balloon to destroy the meteor.
Boss will appear over time, shoot and destroy it. Done right, you can save the Earth.
Meter at the bottom will be green to destroy the meteor, be red meteor reaches the Earth. If the meter is red all, game is over.

This is a sample that making a game with ScalaFX is easy.

Incidentally, game screen is using Canvas, and start button, text and meter are using Label and Rectangle in BorderPane.

このエントリは、いろふ Advent Calendar、およびJavaFX Advent Calendarの23日目のエントリです。

さて、マヤ暦がどーのこーので地球が滅亡するのしないの、なんて話がありましたが、みなさま無事でなによりです。
しかし、我々が「滅びるわけねーだろ、ふふーん」とか余裕ぶっこいてる裏で、実はいろふさんが地球を守ってくれたのです!!!

ダウンロード
解凍してirof.jarをダブルクリックで起動するはず?

アプレット/Web Start


ソースとかはこちらで


irof_screen_shot


マウスの左ボタンを押しっぱなしにすると、マウスカーソルに向かってふきだし(?)が発射されるので、迫りくる隕石(うめぼしではない)を破壊しましょう。
一定時間耐えると、ボスが出現するので目いっぱい打ち込んでください。うまくいけば地球は救われるでしょう。
画面下のメーターは隕石を破壊すると増えて、隕石が地球に到達すると減っていきます。オールレッドになるとゲームオーバーです。
また、ボスが地球に到達した場合、無条件にゲームオーバーです。

まあ、要はScalaFXでゲームっぽいものを実装してみたというわけですが、ゲームとして成立はしてないですな。バランスもなにもないw
これくらいなら結構簡単にできますよーというサンプル的なものと思ってもらえば。

ちなみに、ゲームのメイン画面はCanvasにイメージを描画しています。
スタートボタンやゲームオーバーなどの文字とメーターはBorderPaneにLabelやRectangleを設定して使用。

てか、もうちょっと改良したいよ!
 

※これはAdvent Calendar向けのエントリではありません

さくらばさんのいろふさん絵描き歌 by JavaFXを、ScalaFXにしてみただけです。
ていうか、ゆきーんさんのエントリを見て、「おー、じゃあScalaFXで書いてみたら23日のエントリに使えっかな~」と思っていたら、意外な方面からJavaFXで先を越されたというか潰されたというか。
JavaとScalaで違うといったって、結局JavaFXだからねぇ。これではネタ被りとみなされそうなので23日は何か考えないと。
とはいえせっかくなのでやってみるだけやってみた。

基本的にさくらばさんと同じですが、FXMLを使わずにプログラムだけでやる場合、やはりScalaFXはかなり見やすくなっていると思います。

こんな感じ。

import scalafx.stage.Stage
import scalafx.stage.Stage._
import scalafx.scene._
import scalafx.scene.input._
import scalafx.scene.shape._
import scalafx.scene.paint._
import scalafx.scene.shape._
import scalafx.Includes._
import javafx.application.Application

object IrofShape{
  def main(args : Array[String]) = Application.launch(classOf[IrofShape])
}
class IrofShape extends Application {
  def start(stage: javafx.stage.Stage): Unit = {
    val irof = new Group{
      children = Seq(
        //枠
        new Rectangle{
          strokeWidth = 5
          stroke = Color.BLACK
          fill = Color.WHITE
          translateX = 0
          translateY = 0
          width = 300
          height = 300
        },
        //輪郭
        new Path{
          strokeWidth = 10
          stroke = Color.BLACK
          fill.value = null
          elements = Seq(
            MoveTo(126.5, 267),
            ArcTo(117, 117, 0, 146, 184.5, true, false),
            LineTo(210, 255),
            new ClosePath
          )
          clip = Rectangle(0, 0, 300, 300)
        },
        //ふき出し
        new Path{
          strokeWidth = 10
          stroke = Color.BLACK
          fill = Color.WHITE
          elements = Seq(
            MoveTo(50, 30),
            LineTo(153, 30),
            ArcTo(30, 30, 0, 153, 90, false, true),
            LineTo(105, 90),
            CubicCurveTo(105, 90, 90, 105, 129, 142),
            CubicCurveTo(90, 135, 66, 120, 81, 90),
            LineTo(57, 90),
            ArcTo(30, 30, 0, 50, 30, false, true)
          )
        },
        //目
        new Circle{
          centerX = 255
          centerY = 204
          radius = 15
          fill = Color.WHITE
          stroke = Color.BLACK
          strokeWidth = 10
        }
      //ふき出しの中の点
      ) ++ (for(x <- Seq(51, 84, 120, 154))yield Circle(x, 60, 5, Color.BLACK))
    }
    new Stage(stage){
      title = "irof shape by ScalaFX"
      scene = new Scene(irof, 300, 300)
    }.show
  }
}

Pathとかはだいぶ見やすいけど、CubicCurveToあたりは引数が多くてどれがどのプロパティだかわからなくなりがちなのがちょっと大変ですかね。
強いて言えば、ふき出しの中の点がfor式で書ける辺りがScalaっぽいといえばScalaっぽいかな。 (そのせいで絵描き歌としては順番かわっちゃってるけども)

irof_scalafx

このページのトップヘ