<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Silveira Neto &#187; defuse</title>
	<atom:link href="http://silveiraneto.net/tag/defuse/feed/" rel="self" type="application/rss+xml" />
	<link>http://silveiraneto.net</link>
	<description>the world is a pixel</description>
	<lastBuildDate>Sun, 08 Jan 2012 05:17:57 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.5</generator>
		<item>
		<title>JavaFX, Defuse the Bomb</title>
		<link>http://silveiraneto.net/2008/11/06/javafx-defuse-the-bomb/</link>
		<comments>http://silveiraneto.net/2008/11/06/javafx-defuse-the-bomb/#comments</comments>
		<pubDate>Thu, 06 Nov 2008 14:55:32 +0000</pubDate>
		<dc:creator>Silveira</dc:creator>
				<category><![CDATA[english]]></category>
		<category><![CDATA[Bomb]]></category>
		<category><![CDATA[Collision]]></category>
		<category><![CDATA[defuse]]></category>
		<category><![CDATA[explosion]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Java Web Start]]></category>
		<category><![CDATA[JavaFX]]></category>
		<category><![CDATA[JNLP]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[openjfx]]></category>
		<category><![CDATA[RIA]]></category>
		<category><![CDATA[sources]]></category>
		<category><![CDATA[webgame]]></category>

		<guid isPermaLink="false">http://silveiraneto.net/?p=1667</guid>
		<description><![CDATA[I continue to develop simple games demos to feel better the strengths and weakness of JavaFX for game development. Preview: Click to play via Java Web Start: There&#8217;s a little JavaFX game demo where you have to transport a bomb to a defuse point without touching in the walls. I&#8217;m using the collision detection methods [...]]]></description>
			<content:encoded><![CDATA[<p>I continue to develop simple games demos to feel better the strengths and weakness of JavaFX for game development.</p>
<p><strong>Preview:</strong></p>
<p><center><object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/hR2LiKiBUgE&amp;rel=0&amp;color1=0x3a3a3a&amp;color2=0x999999"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/hR2LiKiBUgE&amp;rel=0&amp;color1=0x3a3a3a&amp;color2=0x999999" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></object></center></p>
<p><strong>Click to play via Java Web Start:</strong></p>
<p style="text-align: center;"><a title="Click to launch" href="http://silveiraneto.net/downloads/Defuse/dist/launch.jnlp"><img class="size-full wp-image-1474 aligncenter" title="webstart" src="../wp-content/uploads/2008/10/webstart.png" alt="" width="88" height="23" /></a></p>
<p>There&#8217;s a little JavaFX game demo where you have to transport a bomb to a defuse point without touching in the walls. I&#8217;m using the collision detection methods <a href="http://silveiraneto.net/2008/10/30/javafx-rectangular-collision-detection/">I described early in this post</a> to detect when the bomb hits a wall and then explode or when a bomb is inside the defuse point and the game ends. As it&#8217;s only a demo, it&#8217;s just one single level, but adding more levels would be easy.</p>
<p>Basically we have this four images:</p>
<p><a href="http://silveiraneto.net/wp-content/uploads/2008/11/bomb.png"><img class="alignnone size-full wp-image-1684" title="bomb" src="http://silveiraneto.net/wp-content/uploads/2008/11/bomb.png" alt="" width="80" height="41" /><br />
bomb.png</a></p>
<p><a href="http://silveiraneto.net/wp-content/uploads/2008/11/goal.png"><img class="alignnone size-full wp-image-1686" title="goal" src="http://silveiraneto.net/wp-content/uploads/2008/11/goal.png" alt="" width="120" height="72" /><br />
goal.png</a></p>
<p><a href="http://silveiraneto.net/wp-content/uploads/2008/11/floor.png"><img class="alignnone size-thumbnail wp-image-1685" title="floor" src="http://silveiraneto.net/wp-content/uploads/2008/11/floor-150x150.png" alt="" width="150" height="150" /><br />
floor.png</a></p>
<p><a href="http://silveiraneto.net/wp-content/uploads/2008/11/wall.png"><img class="alignnone size-thumbnail wp-image-1687" title="wall" src="http://silveiraneto.net/wp-content/uploads/2008/11/wall-150x150.png" alt="" width="150" height="150" /><br />
wall.png</a></p>
<p>The code is petty simple. A little bit more than 300 lines with even with all comments and declarations. I transform the bomb image into a draggable node, create a list of collidable nodes and a especial node, the goal. I check the collisions when the bomb is dragged by mouse, if it hits something, it blows up.</p>
<p>I use extensively the TimeLine class from the animation framework (javafx.animation) to create chained animations and even to control some game logic.</p>
<p>As I focused in the simplicity, I don&#8217;t declared any classes to after instantiate their objects. I just was using common classes from JavaFX and putting logic on ir throught event and binding to external variables.</p>
<div class="wp_syntax">
<div class="code">
<pre class="java java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javafx.application.Frame</span>;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javafx.application.Stage</span>;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javafx.animation.Timeline</span>;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javafx.animation.KeyFrame</span>;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javafx.animation.Interpolator</span>;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javafx.scene.image.ImageView</span>;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javafx.scene.image.Image</span>;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javafx.scene.Group</span>;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javafx.scene.Node</span>;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javafx.scene.paint.Color</span>;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javafx.scene.geometry.Circle</span>;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javafx.scene.geometry.Rectangle</span>;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javafx.scene.geometry.Shape</span>;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javafx.scene.text.Text</span>;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javafx.scene.Font</span>;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javafx.scene.FontStyle</span>;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javafx.input.MouseEvent</span>;
&nbsp;
<span style="color: #666666; font-style: italic;">/* Fade variable modified in some animations and used in the fadescreen */</span>
var fade <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0.0</span>;
&nbsp;
<span style="color: #666666; font-style: italic;">/* The Bomb */</span>
var lock <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">false</span>;
var tx <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0.0</span>;
var ty <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0.0</span>;
var bomb<span style="color: #339933;">:</span>Node <span style="color: #339933;">=</span> <span style="color: #003399;">Group</span><span style="color: #009900;">&#123;</span>
    opacity<span style="color: #339933;">:</span> bind bombfade;
    content<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span>
        ImageView <span style="color: #009900;">&#123;</span>
            image<span style="color: #339933;">:</span> <span style="color: #003399;">Image</span> <span style="color: #009900;">&#123;</span>
                url<span style="color: #339933;">:</span> <span style="color: #0000ff;">&quot;{__DIR__}/bomb.png&quot;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>,
        Circle <span style="color: #009900;">&#123;</span>
            centerX<span style="color: #339933;">:</span> <span style="color: #cc66cc;">45</span>, centerY<span style="color: #339933;">:</span> <span style="color: #cc66cc;">21</span>, radius<span style="color: #339933;">:</span> <span style="color: #cc66cc;">7</span>, fill<span style="color: #339933;">:</span> <span style="color: #003399;">Color</span>.<span style="color: #006633;">LIME</span>
            opacity<span style="color: #339933;">:</span> bind led
        <span style="color: #009900;">&#125;</span>,
        Circle <span style="color: #009900;">&#123;</span>
            centerX<span style="color: #339933;">:</span> <span style="color: #cc66cc;">30</span>, centerY<span style="color: #339933;">:</span> <span style="color: #cc66cc;">30</span>, fill<span style="color: #339933;">:</span> <span style="color: #003399;">Color</span>.<span style="color: #006633;">WHITE</span>
            radius<span style="color: #339933;">:</span> bind fireradius
        <span style="color: #009900;">&#125;</span>,
    <span style="color: #009900;">&#93;</span>,
    var startX <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0.0</span>;
    var startY <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0.0</span>;
    translateX<span style="color: #339933;">:</span> bind tx
    translateY<span style="color: #339933;">:</span> bind ty
&nbsp;
    onMousePressed<span style="color: #339933;">:</span> function<span style="color: #009900;">&#40;</span> e<span style="color: #339933;">:</span> <span style="color: #003399;">MouseEvent</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span><span style="color: #003399;">Void</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>lock<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000000; font-weight: bold;">return</span>;<span style="color: #009900;">&#125;</span>
        startX <span style="color: #339933;">=</span> e.<span style="color: #006633;">getDragX</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> tx;
        startY <span style="color: #339933;">=</span> e.<span style="color: #006633;">getDragY</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> ty;
    <span style="color: #009900;">&#125;</span>
&nbsp;
    onMouseDragged<span style="color: #339933;">:</span> function<span style="color: #009900;">&#40;</span>e<span style="color: #339933;">:</span><span style="color: #003399;">MouseEvent</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span><span style="color: #003399;">Void</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>lock<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000000; font-weight: bold;">return</span>;<span style="color: #009900;">&#125;</span>
        tx <span style="color: #339933;">=</span> e.<span style="color: #006633;">getDragX</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> startX;
        ty <span style="color: #339933;">=</span> e.<span style="color: #006633;">getDragY</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> startY;
        checkcollissions<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* Big rectangle that covers all the screen (bomb explosion or game end) */</span>
var fadescreen <span style="color: #339933;">=</span> <span style="color: #003399;">Rectangle</span> <span style="color: #009900;">&#123;</span>
    x<span style="color: #339933;">:</span> 0, y<span style="color: #339933;">:</span> 0, width<span style="color: #339933;">:</span> <span style="color: #cc66cc;">640</span>, height<span style="color: #339933;">:</span> <span style="color: #cc66cc;">480</span>, fill<span style="color: #339933;">:</span> <span style="color: #003399;">Color</span>.<span style="color: #006633;">WHITE</span>
    opacity<span style="color: #339933;">:</span> bind fade
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* The wood floor image for the scenario. */</span>
var floor <span style="color: #339933;">=</span> ImageView <span style="color: #009900;">&#123;</span>
    image<span style="color: #339933;">:</span> <span style="color: #003399;">Image</span> <span style="color: #009900;">&#123;</span>
        url<span style="color: #339933;">:</span> <span style="color: #0000ff;">&quot;{__DIR__}/floor.png&quot;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* The goal image where the bomb should be placed. */</span>
var goal <span style="color: #339933;">=</span> ImageView <span style="color: #009900;">&#123;</span>
    x<span style="color: #339933;">:</span> <span style="color: #cc66cc;">470</span>, y<span style="color: #339933;">:</span> <span style="color: #cc66cc;">360</span>
    image<span style="color: #339933;">:</span> <span style="color: #003399;">Image</span> <span style="color: #009900;">&#123;</span>
        url<span style="color: #339933;">:</span> <span style="color: #0000ff;">&quot;{__DIR__}/goal.png&quot;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* List of obstacles nodes that the bomb can collide with. */</span>
var obstacles <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span>
    <span style="color: #003399;">Rectangle</span> <span style="color: #009900;">&#123;</span> x<span style="color: #339933;">:</span> <span style="color: #cc66cc;">120</span>, y<span style="color: #339933;">:</span> 0, width<span style="color: #339933;">:</span> <span style="color: #cc66cc;">100</span>, height<span style="color: #339933;">:</span> <span style="color: #cc66cc;">300</span>, fill<span style="color: #339933;">:</span> <span style="color: #003399;">Color</span>.<span style="color: #006633;">BLACK</span><span style="color: #009900;">&#125;</span>,
    <span style="color: #003399;">Rectangle</span> <span style="color: #009900;">&#123;</span> x<span style="color: #339933;">:</span> <span style="color: #cc66cc;">350</span>, y<span style="color: #339933;">:</span> <span style="color: #cc66cc;">200</span>, width<span style="color: #339933;">:</span> <span style="color: #cc66cc;">100</span>, height<span style="color: #339933;">:</span> <span style="color: #cc66cc;">300</span>, fill<span style="color: #339933;">:</span> <span style="color: #003399;">Color</span>.<span style="color: #006633;">BLACK</span><span style="color: #009900;">&#125;</span>,
    <span style="color: #003399;">Rectangle</span> <span style="color: #009900;">&#123;</span> x<span style="color: #339933;">:</span> <span style="color: #cc66cc;">370</span>, y<span style="color: #339933;">:</span> <span style="color: #cc66cc;">50</span>, width<span style="color: #339933;">:</span> <span style="color: #cc66cc;">50</span>, height<span style="color: #339933;">:</span> <span style="color: #cc66cc;">50</span>, fill<span style="color: #339933;">:</span> <span style="color: #003399;">Color</span>.<span style="color: #006633;">BLACK</span><span style="color: #009900;">&#125;</span>,
    <span style="color: #003399;">Rectangle</span> <span style="color: #009900;">&#123;</span>
        x<span style="color: #339933;">:</span> <span style="color: #cc66cc;">250</span>, y<span style="color: #339933;">:</span> <span style="color: #cc66cc;">120</span>, translateX<span style="color: #339933;">:</span> bind move, width<span style="color: #339933;">:</span> <span style="color: #cc66cc;">100</span>, height<span style="color: #339933;">:</span> <span style="color: #cc66cc;">50</span>
        fill<span style="color: #339933;">:</span> <span style="color: #003399;">Color</span>.<span style="color: #006633;">BLACK</span>
    <span style="color: #009900;">&#125;</span>,
<span style="color: #009900;">&#93;</span>;
&nbsp;
<span style="color: #666666; font-style: italic;">/* Visible representations of obstacles */</span>
var wallimage <span style="color: #339933;">=</span> <span style="color: #003399;">Image</span> <span style="color: #009900;">&#123;</span>
    url<span style="color: #339933;">:</span> <span style="color: #0000ff;">&quot;{__DIR__}/wall.png&quot;</span>
<span style="color: #009900;">&#125;</span>
var walls <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span>obs in obstacles<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    ImageView <span style="color: #009900;">&#123;</span>
        x<span style="color: #339933;">:</span> obs.<span style="color: #006633;">x</span>, y<span style="color: #339933;">:</span> obs.<span style="color: #006633;">y</span>, translateX<span style="color: #339933;">:</span> bind obs.<span style="color: #006633;">translateX</span>
        clip<span style="color: #339933;">:</span> obs, image<span style="color: #339933;">:</span> wallimage
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* Animation for a blinking green led */</span>
var led <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0.0</span>;
var bombclock <span style="color: #339933;">=</span> Timeline <span style="color: #009900;">&#123;</span>
    repeatCount<span style="color: #339933;">:</span> Timeline.<span style="color: #006633;">INDEFINITE</span>
    autoReverse<span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">true</span>
    keyFrames <span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span>
        KeyFrame <span style="color: #009900;">&#123;</span>
            time <span style="color: #339933;">:</span> 0s
            values <span style="color: #339933;">:</span> led <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0.0</span> tween Interpolator.<span style="color: #006633;">LINEAR</span>
        <span style="color: #009900;">&#125;</span>,
        KeyFrame <span style="color: #009900;">&#123;</span>
            time <span style="color: #339933;">:</span> 1s
            values <span style="color: #339933;">:</span> led <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1.0</span> tween Interpolator.<span style="color: #006633;">LINEAR</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#93;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* Animation for the bomb explosion and game reset */</span>
var fireradius <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0.0</span>;
var explosion<span style="color: #339933;">:</span>Timeline <span style="color: #339933;">=</span> Timeline <span style="color: #009900;">&#123;</span>
    repeatCount<span style="color: #339933;">:</span> <span style="color: #cc66cc;">1</span>
    keyFrames <span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span>
        KeyFrame <span style="color: #009900;">&#123;</span>
            time <span style="color: #339933;">:</span> 0s
            values <span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span>
                fireradius <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0.0</span>,
                fade <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0.0</span>
            <span style="color: #009900;">&#93;</span>
        <span style="color: #009900;">&#125;</span>,
        KeyFrame <span style="color: #009900;">&#123;</span>
            time <span style="color: #339933;">:</span> 2s
            values <span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span>
                fireradius <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">200.0</span> tween Interpolator.<span style="color: #006633;">LINEAR</span>,
                fade <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1.0</span> tween Interpolator.<span style="color: #006633;">LINEAR</span>
            <span style="color: #009900;">&#93;</span>
            action<span style="color: #339933;">:</span> gamereset
        <span style="color: #009900;">&#125;</span>,
        KeyFrame <span style="color: #009900;">&#123;</span>
            time <span style="color: #339933;">:</span> 3s
            values<span style="color: #339933;">:</span> fade <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0.0</span> tween Interpolator.<span style="color: #006633;">LINEAR</span>
        <span style="color: #009900;">&#125;</span>,
    <span style="color: #009900;">&#93;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* Reset variables for initial values */</span>
function gamereset<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    lock <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">false</span>;
    fireradius <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0.0</span>;
    tx <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0.0</span>;
    ty <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0.0</span>;
    bombfade <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1.0</span>;
&nbsp;
    moveblock.<span style="color: #006633;">start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
    specialcollison.<span style="color: #006633;">start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
    bombclock.<span style="color: #006633;">start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* Animation when the bomb reaches the goal. Bomb disapear. */</span>
var bombfade <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1.0</span>;
var bomdisapear <span style="color: #339933;">=</span> Timeline <span style="color: #009900;">&#123;</span>
    repeatCount<span style="color: #339933;">:</span> <span style="color: #cc66cc;">1</span>
    keyFrames <span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span>
        KeyFrame <span style="color: #009900;">&#123;</span>
            time <span style="color: #339933;">:</span> 1s
            values<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span>
                        bombfade <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0.0</span> tween Interpolator.<span style="color: #006633;">EASEBOTH</span>,
                        fade <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0.0</span>
            <span style="color: #009900;">&#93;</span>
        <span style="color: #009900;">&#125;</span>,
        KeyFrame <span style="color: #009900;">&#123;</span>
            time <span style="color: #339933;">:</span> 2s
            values<span style="color: #339933;">:</span>
                    fade <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1.0</span> tween Interpolator.<span style="color: #006633;">LINEAR</span>;
            action<span style="color: #339933;">:</span> gamereset
        <span style="color: #009900;">&#125;</span>,
        KeyFrame <span style="color: #009900;">&#123;</span>
            time <span style="color: #339933;">:</span> 3s
            values<span style="color: #339933;">:</span>
                    fade <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0.0</span> tween Interpolator.<span style="color: #006633;">LINEAR</span>;
        <span style="color: #009900;">&#125;</span>,
    <span style="color: #009900;">&#93;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* Animation for a moving block. */</span>
var move <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0.0</span>;
var moveblock <span style="color: #339933;">=</span> Timeline <span style="color: #009900;">&#123;</span>
    repeatCount<span style="color: #339933;">:</span> Timeline.<span style="color: #006633;">INDEFINITE</span>
    autoReverse<span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">true</span>
    keyFrames <span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span>
        KeyFrame <span style="color: #009900;">&#123;</span>
            time <span style="color: #339933;">:</span> 0s
            values <span style="color: #339933;">:</span>
                    move <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0.0</span>
        <span style="color: #009900;">&#125;</span>,
        KeyFrame <span style="color: #009900;">&#123;</span>
            time <span style="color: #339933;">:</span> 3s
            values <span style="color: #339933;">:</span>
                    move <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">200.0</span> tween Interpolator.<span style="color: #006633;">EASEBOTH</span>
        <span style="color: #009900;">&#125;</span>,
    <span style="color: #009900;">&#93;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* Check and handle possible collisions. */</span>
function checkcollissions<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span> <span style="color: #003399;">Void</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>checkobstacles<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        lock <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">true</span>;
        specialcollison.<span style="color: #006633;">stop</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
        moveblock.<span style="color: #006633;">stop</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
        explosion.<span style="color: #006633;">start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>insidenode<span style="color: #009900;">&#40;</span>bomb,goal<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        lock <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">true</span>;
        moveblock.<span style="color: #006633;">stop</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
        bomdisapear.<span style="color: #006633;">start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* There was a bug, when the bomb is stopped, not been gragged, in front of
the moving block, it could pass through it because checkcollissions() was
only called on mouse moving. This make sure checking this special case. */</span>
var specialcollison<span style="color: #339933;">:</span>Timeline <span style="color: #339933;">=</span> Timeline <span style="color: #009900;">&#123;</span>
    repeatCount<span style="color: #339933;">:</span> Timeline.<span style="color: #006633;">INDEFINITE</span>
    keyFrames <span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span>
        KeyFrame <span style="color: #009900;">&#123;</span>
            time <span style="color: #339933;">:</span> 1s<span style="color: #339933;">/</span><span style="color: #cc66cc;">5</span>
            action<span style="color: #339933;">:</span> function<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
                <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>hitnode<span style="color: #009900;">&#40;</span>obstacles<span style="color: #009900;">&#91;</span>sizeof obstacles<span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span>, bomb<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
                    lock <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">true</span>;
                    moveblock.<span style="color: #006633;">stop</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
                    explosion.<span style="color: #006633;">start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
                    specialcollison.<span style="color: #006633;">stop</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
                <span style="color: #009900;">&#125;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#93;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/*
* The next four functions are for collision detection.
* @See http://silveiraneto.net/2008/10/30/javafx-rectangular-collision-detection/
*/</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/*
 * Check collision between two rectangles.
 */</span>
function collission<span style="color: #009900;">&#40;</span>ax, ay, bx, by, cx, cy, dx, dy<span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span> <span style="color: #003399;">Boolean</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">return</span> not <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>ax <span style="color: #339933;">&gt;</span> dx<span style="color: #009900;">&#41;</span>or<span style="color: #009900;">&#40;</span>bx <span style="color: #339933;">&lt;</span> cx<span style="color: #009900;">&#41;</span>or<span style="color: #009900;">&#40;</span>ay <span style="color: #339933;">&gt;</span> dy<span style="color: #009900;">&#41;</span>or<span style="color: #009900;">&#40;</span>by <span style="color: #339933;">&lt;</span> cy<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/*
 * Check if the first rectangle are inside the second.
 */</span>
function inside <span style="color: #009900;">&#40;</span>ax, ay, bx, by, cx, cy, dx, dy<span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span><span style="color: #003399;">Boolean</span><span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>ax <span style="color: #339933;">&gt;</span> cx<span style="color: #009900;">&#41;</span> and <span style="color: #009900;">&#40;</span>bx <span style="color: #339933;">&lt;</span> dx<span style="color: #009900;">&#41;</span> and <span style="color: #009900;">&#40;</span>ay <span style="color: #339933;">&gt;</span> cy<span style="color: #009900;">&#41;</span> and <span style="color: #009900;">&#40;</span>by <span style="color: #339933;">&lt;</span> dy<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>;
<span style="color: #009900;">&#125;</span>
&nbsp;
function hitnode<span style="color: #009900;">&#40;</span>a<span style="color: #339933;">:</span> Node, b<span style="color: #339933;">:</span>Node<span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span> <span style="color: #003399;">Boolean</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #009900;">&#40;</span>collission<span style="color: #009900;">&#40;</span>
        a.<span style="color: #006633;">getBoundsX</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, a.<span style="color: #006633;">getBoundsY</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>,
        a.<span style="color: #006633;">getBoundsX</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> a.<span style="color: #006633;">getWidth</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, a.<span style="color: #006633;">getBoundsY</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> a.<span style="color: #006633;">getHeight</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>,
        b.<span style="color: #006633;">getBoundsX</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, b.<span style="color: #006633;">getBoundsY</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>,
        b.<span style="color: #006633;">getBoundsX</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> b.<span style="color: #006633;">getWidth</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, b.<span style="color: #006633;">getBoundsY</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> b.<span style="color: #006633;">getHeight</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>;
<span style="color: #009900;">&#125;</span>
&nbsp;
function insidenode<span style="color: #009900;">&#40;</span>a<span style="color: #339933;">:</span>Node,b<span style="color: #339933;">:</span>Node<span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span><span style="color: #003399;">Boolean</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #009900;">&#40;</span>inside<span style="color: #009900;">&#40;</span>
        a.<span style="color: #006633;">getBoundsX</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, a.<span style="color: #006633;">getBoundsY</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>,
        a.<span style="color: #006633;">getBoundsX</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> a.<span style="color: #006633;">getWidth</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, a.<span style="color: #006633;">getBoundsY</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> a.<span style="color: #006633;">getHeight</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>,
        b.<span style="color: #006633;">getBoundsX</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, b.<span style="color: #006633;">getBoundsY</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>,
        b.<span style="color: #006633;">getBoundsX</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> b.<span style="color: #006633;">getWidth</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, b.<span style="color: #006633;">getBoundsY</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> b.<span style="color: #006633;">getHeight</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/*
* Check collision of bomb against each obstacle.
*/</span>
function checkobstacles<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span> <span style="color: #003399;">Boolean</span><span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span>obst in obstacles<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>hitnode<span style="color: #009900;">&#40;</span>obst, bomb<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">true</span>;
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span>;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* Pack visual game elements in a Frame's Stage, unresizable. */</span>
<span style="color: #003399;">Frame</span> <span style="color: #009900;">&#123;</span>
    title<span style="color: #339933;">:</span> <span style="color: #0000ff;">&quot;Defuse the Bomb&quot;</span>
    width<span style="color: #339933;">:</span> <span style="color: #cc66cc;">640</span>
    height<span style="color: #339933;">:</span> <span style="color: #cc66cc;">480</span>
    resizable<span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">false</span>
    closeAction<span style="color: #339933;">:</span> function<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        java.<span style="color: #006633;">lang</span>.<span style="color: #003399;">System</span>.<span style="color: #006633;">exit</span><span style="color: #009900;">&#40;</span> 0 <span style="color: #009900;">&#41;</span>;
    <span style="color: #009900;">&#125;</span>
    visible<span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">true</span>
&nbsp;
    stage<span style="color: #339933;">:</span> Stage <span style="color: #009900;">&#123;</span>
        content<span style="color: #339933;">:</span> bind <span style="color: #009900;">&#91;</span>floor, goal, walls, bomb, fadescreen<span style="color: #009900;">&#93;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* Call gamereset to set initial values and start animations */</span>
gamereset<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;</pre>
</div>
</div>
<p><strong>Downloads:</strong></p>
<ul>
<li>High definition video, <a href="http://http://silveiraneto.net/downloads/javafx_defuse.ogv">javafx_defuse.ogv</a>.</li>
<li>Entire project with sources and resources for NetBeans 6.1 with JavaFX pluggin, <a title="NetBeans project" href="http://silveiraneto.net/downloads/defuse.tar.bz2">defuse.tar.bz2</a>.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://silveiraneto.net/2008/11/06/javafx-defuse-the-bomb/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

