A long time ago, Fabricio Catae developed a demo using c++. Today I created a version of Penguins Demo using JavaFX.
Penguins Demo
| penguins.zip |
| Hosted by eSnips |


1:/*
2: * Penguim.fx
3: *
4: * Created on 04/01/2009, 11:38:24
5: */
6:
7:package javafxapplication1;
8:
9:import javafx.animation.KeyFrame;
10:import javafx.animation.Timeline;
11:import javafx.geometry.Rectangle2D;
12:import javafx.scene.CustomNode;
13:import javafx.scene.image.Image;
14:import javafx.scene.image.ImageView;
15:import javafx.scene.Node;
16:
17:/**
18: * @author sergiosvieira@gmail.com
19: */
20:
21:public class Penguim extends CustomNode {
22: var start: Duration;
23: var falling: Boolean = true;
24: var walking: Boolean = false;
25: var left: Boolean = false;
26: var imageView: ImageView;
27: var currentSprite: Integer = 8;
28: var sSprite: Integer;
29: var fSprite: Integer;
30:
31: public var started: Boolean = false;
32: public var timeLine : Timeline;
33: public var spriteWidth: Integer; // Sprite Width
34: public var spriteHeight: Integer; // Sprite Height
35: public var image: Image;
36: public var x: Integer on replace {
37: imageView.x = x;
38: };
39: public var y: Integer on replace {
40: imageView.y = y;
41: };
42: var max: Number;
43:
44: function loop() {
45: if (falling) {
46: y += 4;
47: if (y >= 345) {
48: y = 345;
49: falling = false;
50: walking = true;
51: }
52: } else {
53: if (walking) {
54: if (left) {
55: if (currentSprite >= sSprite and currentSprite <= fSprite) {
56: currentSprite++;
57: } else {
58: sSprite = 4;
59: fSprite = 6;
60: currentSprite = sSprite;
61: }
62:
63: if (x <= 150) {
64: left = false;
65: }
66: x -= 3;
67: } else {
68: if (currentSprite >= sSprite and currentSprite <= fSprite) {
69: currentSprite++;
70: } else {
71: sSprite = 0;
72: fSprite = 2;
73: currentSprite = sSprite;
74: }
75: if (x >= 370) {
76: left = true;
77: }
78: x += 3;
79: }
80: }
81: }
82: }
83:
84: init {
85: def cols = (image.width / spriteWidth) - 1;
86: def rows = (image.height / spriteHeight) - 1;
87: max = (cols + 1) * (rows + 1);
88: def viewPorts =
89: for (i in [0..rows]){
90: for ( j in [0..cols]) {
91: Rectangle2D {
92: minX: j * spriteWidth
93: minY: i * spriteHeight
94: width: spriteWidth
95: height: spriteHeight
96: }
97: }
98: }
99:
100: timeLine = Timeline {
101: repeatCount: Timeline.INDEFINITE
102: keyFrames: [
103: KeyFrame {
104: time: 60ms
105: action: function(): Void {
106: loop();
107: }
108: }
109: ]
110: };
111:
112:
113: imageView = ImageView {
114: x: bind x
115: y: bind y
116: image: image
117: viewport: bind viewPorts[currentSprite]
118: fitWidth: 20
119: preserveRatio: true
120: smooth: false
121: }
122:
123: }
124:
125: override public function create(): Node {
126: imageView
127: }
128:
129:}
130:
1:/*
2: * Main.fx
3: *
4: * Created on 04/01/2009, 09:45:50
5: */
6:
7:package javafxapplication1;
8:
9:import javafx.animation.KeyFrame;
10:import javafx.animation.Timeline;
11:import javafx.scene.image.Image;
12:import javafx.scene.image.ImageView;
13:import javafx.scene.paint.Color;
14:import javafx.scene.Scene;
15:import javafx.scene.text.Font;
16:import javafx.scene.text.FontWeight;
17:import javafx.scene.text.Text;
18:import javafx.scene.text.TextAlignment;
19:import javafx.scene.text.TextOrigin;
20:import javafx.stage.Stage;
21:import java.lang.Math;
22:/**
23: * @author sergiosvieira@gmail.com
24: */
25:
26:var scenario = ImageView {
27: image: Image {
28: url: "{__DIR__}scenario.png"
29: }
30: fitWidth: 640
31: preserveRatio: true
32: smooth: false
33:}
34:
35:def penguim = Image {
36: url: "{__DIR__}penguim.png"
37:}
38:
39:var currentMsg: Integer = 0;
40:
41:def msgTimes: Duration[] = [
42: 0.1s,
43: 3s,
44: 6s,
45: 8s,
46: 13.7s,
47: 14.4s,
48: 15.1s,
49: 17s,
50: 19s,
51: 23s,
52: 25s,
53: 28s,
54: 31s,
55: 33s,
56: 36s,
57: 39s,
58: 42s,
59: 45s,
60: 48s,
61: 51s,
62: 53s,
63: 55s,
64: 58s,
65: 61s,
66: 64s,
67: 67s,
68: 70s,
69: 73s,
70: 76s,
71: 85s,
72: 90s,
73: 93s,
74: 96s
75:];
76:
77:
78:def messages: String[] = [
79: "Era uma tarde calma...",
80: "Quando...",
81: "AAAAAAHHHHHHHHHHHHHHH!!!",
82: "Estamos Caindo!!!",
83: "Plaft!",
84: " Pleft! ",
85: " Ploft!",
86: "Onde nós estamos?",
87: "Numa ilha, seu burro!",
88: "Uma ilha só pra gente!?",
89: "Fica quieto! Estamos perdidos!",
90: "...",
91: "Hummm... agora está melhor!",
92: "Deixe-me pensar.",
93: "Por quê? Afinal, sou um gênio.",
94: "Gênio??? Você é louco!",
95: "Silêncio!!!",
96: "",
97: "Olha, vamos pensar juntos.",
98: "Nós estamos numa ilha...",
99: "Muito, mas muito pequena...",
100: "Pequeníssima...",
101: "Esse lugar é insuficiente para nós 3!",
102: "Está compreendendo?",
103: "Entendi! Hoje nós estamos com azar!",
104: "...",
105: "Olha o lado bom, somos só nós 3.",
106: "Verdade! Poderia ser pio...",
107: "...#@*%#)^@ !!!",
108: "Socorro!!! Não consigo ver nada.",
109: "Penguins Demo - v0.10",
110: "By FSC - Dez/97",
111: "JavaFX version by Sérgio Vieira :)"
112:];
113:
114:
115:var text = Text {
116: x: 100
117: y: 370
118: fill: Color.WHITE
119: //wrappingWidth: 200
120: content: bind messages[currentMsg];
121: textOrigin: TextOrigin.TOP;
122: textAlignment: TextAlignment.CENTER;
123: font: Font.font("Sans serif", FontWeight.BOLD, 25)
124:
125:};
126:
127:var penguim1 = Penguim {
128: image: penguim
129: x: 257
130: y: -20
131: spriteWidth: 10
132: spriteHeight: 10
133:};
134:
135:var penguim2 = Penguim {
136: image: penguim
137: x: 257
138: y: -70
139: spriteWidth: 10
140: spriteHeight: 10
141:};
142:
143:var penguim3 = Penguim {
144: image: penguim
145: x: 257
146: y: -120
147: spriteWidth: 10
148: spriteHeight: 10
149:};
150:
151:
152:def times =
153:for (i in [0..36]) {
154: KeyFrame {
155: time: msgTimes[i]
156: action: function() {
157: currentMsg = i;
158: }
159: }
160:}
161:
162:def penguins =
163:for (i in [0..100]) {
164: var rand = 150 + (
165: Math.random() * 220).intValue();
166: var randy = 200 + (
167: Math.random() * 320).intValue();
168: randy *= -1;
169: Penguim {
170: image: penguim
171: x: rand
172: y: randy
173: spriteWidth: 10
174: spriteHeight: 10
175: };
176:};
177:
178:Timeline {
179: //repeatCount: Timeline.INDEFINITE
180: keyFrames: [
181: times
182: ]
183:}.play();
184:
185:Timeline {
186: //repeatCount: Timeline.INDEFINITE
187: keyFrames: [
188: KeyFrame {
189: time: 8s
190: action: function() {
191: penguim1.timeLine.play();
192: penguim2.timeLine.play();
193: penguim3.timeLine.play();
194: }
195: },
196: KeyFrame {
197: time: 71s
198: action: function() {
199: for (i in [0..100]) {
200: penguins[i].timeLine.play();
201: }
202: insert penguins into stage.scene.content
203: }
204: }
205: ]
206:}.play();
207:
208:
209:var stage = Stage {
210: title: "Penguins Demo - Fabrício Catae - JavaFX version by sergiosvieira@gmail.com"
211: width: 640
212: height: 425
213: scene: Scene {
214: content: [
215: scenario,
216: penguim1,
217: penguim2,
218: penguim3,
219: text
220: ]
221:
222: }
223:}
224:
225: