Realmente, es increible lo fácil que resulta crear un juego para teléfono con Netbeans 6.5. De hecho, este tutorial demuestra como crear uno en ¡10 minutos! Vale la pena verlo y tenerlo en cuenta.
Blogger no me permite incrustar el video aquí, así que ahí les va el enlance (se ve mejor a pantalla completa): CLICK AQUI
- Crea tu propio juego para móvil. Hands on Lab6400 (pdf)
- Mobile Game Project.zip
- Guía para el GameBuilder de Netbeans
Mostrando entradas con la etiqueta example. Mostrar todas las entradas
Mostrando entradas con la etiqueta example. Mostrar todas las entradas
viernes, 20 de marzo de 2009
jueves, 12 de febrero de 2009
JavaFX: Stage "controller" demo - Demo "controlador" de Stage
This small code demostrates how easy is to handle the onResize and onMove events implemented by the Stage controller (Stage Controller).
Este pequeño código demuestra lo fácil que es manejar los eventos onResize y onMove implementados por el controlador de Stage (Controlador de Stage)
Here's the code / Aquí está el código:
Download the Netbeans 6.5 project, here. Descarga el proyecto Netbeans 6.5, aquí.
Este pequeño código demuestra lo fácil que es manejar los eventos onResize y onMove implementados por el controlador de Stage (Controlador de Stage)
Here's the code / Aquí está el código:
var img = Image { url: "{__DIR__}myimage.jpg" };
var rect:Rectangle;
var sw:Integer;
var sh:Integer;
var cs = controlStage {
timeToCallFunctions:0.001s
timeToCheckPosSize:0.001s
initialPosition:controlStage.CENTER, persist:true
checkMinWidth:true, minWidth:270,
checkMinHeight:true, minHeight:270,
stickyBorders:true
onResize: function(e) { clip(e) }
onMove: function(e) { clip(e) }
};
// screen resolution
sw = cs.maxScrWidth;
sh = cs.maxScrHeight;
function clip(r:Rectangle2D) {
rect = Rectangle {
x: r.minX - (sw - img.width) / 2
y: r.minY - (sh - img.height) /2
width: r.width, height: r.height
}
};
Stage {
width: bind cs.width with inverse
height: bind cs.height with inverse
x: bind cs.x with inverse
y: bind cs.y with inverse
onClose: function() { cs.persistStage() };
scene: Scene { content:
ImageView {
translateX: bind -rect.x
translateY: bind -rect.y
image: img
clip: rect
}
}
};
Download the Netbeans 6.5 project, here. Descarga el proyecto Netbeans 6.5, aquí.
Etiquetas:
code,
codigo,
control,
controlador,
controller,
demo,
demostracion,
demostration,
ejemplo,
example,
posicion,
position,
resize,
stage,
tamaño,
ventana,
window
miércoles, 4 de febrero de 2009
JavaFX: a Knob control - Un control "de perilla"
Update: Stage Controller hosted on Google Code, includes documentation for using the class. Click Here for a Java Web Start example.
English: Please, visit the Google Code hosted project
JavaFX me está convirtiendo realmente en una fábrica de componentes... este control lo desarrollé en menos de un día. Como verán es bastante sofisticado. No voy a entrar en detalles por ahora, pero el código del programa de ejemplo explota varias de sus funcionalidades.
Una de las cosas que dejo pendiente de demostrar, es cómo se pueden agregar nuevos tipos de perillas... basta con crear la gráfica en Adobe Illustrator y luego crear una clase que herede de la clase basicKnob (update: ver orangeKnob.fx). En esa nueva clase, pueden incluir detalles propios de la gráfica asociada... entre otras cosas, el nombre del archivo que contiene la grafica, las dimensiones de la nueva perilla (ancho y alto) y el radio inicial y final de las lineas del dial (la distancia al radio de la perilla), de manera que el componente pueda dibujar las lineas que le solicite el usuario y que estas lineas coincidan con la gráfica importada (update: ahora también incluye el radio inicial y final de las líneas cortas en el dial).
Aquí va el código fuente del componente, el programa demostrativo, los archivos de gráficos, etc. Sólo tienen que abrirlo en Netbeans 6.5 y ejecutarlo ;D
¡Ah! un detalle que me dió dolor de cabeza, hasta que recordé que lo había leído antes... si se fijan en el código, por cada control instancio la gráfica de la perilla ( ui: orangeKnob{} )... esto es así, porque si creo una sóla instancia y luego la enlazo desde varios lugares, solo queda activo el último enlace.... quizás debería ver si se puede crear algo como una versión "estática" con la gráfica... pero eso tengo que investigarlo y luego probar si funciona.
Descarga el proyecto completo de Netbeans 6.5... Download the complete Netbeans project... CLICK HERE.
English: Please, visit the Google Code hosted project
JavaFX me está convirtiendo realmente en una fábrica de componentes... este control lo desarrollé en menos de un día. Como verán es bastante sofisticado. No voy a entrar en detalles por ahora, pero el código del programa de ejemplo explota varias de sus funcionalidades.
Una de las cosas que dejo pendiente de demostrar, es cómo se pueden agregar nuevos tipos de perillas... basta con crear la gráfica en Adobe Illustrator y luego crear una clase que herede de la clase basicKnob (update: ver orangeKnob.fx). En esa nueva clase, pueden incluir detalles propios de la gráfica asociada... entre otras cosas, el nombre del archivo que contiene la grafica, las dimensiones de la nueva perilla (ancho y alto) y el radio inicial y final de las lineas del dial (la distancia al radio de la perilla), de manera que el componente pueda dibujar las lineas que le solicite el usuario y que estas lineas coincidan con la gráfica importada (update: ahora también incluye el radio inicial y final de las líneas cortas en el dial).
Aquí va el código fuente del componente, el programa demostrativo, los archivos de gráficos, etc. Sólo tienen que abrirlo en Netbeans 6.5 y ejecutarlo ;D
¡Ah! un detalle que me dió dolor de cabeza, hasta que recordé que lo había leído antes... si se fijan en el código, por cada control instancio la gráfica de la perilla ( ui: orangeKnob{} )... esto es así, porque si creo una sóla instancia y luego la enlazo desde varios lugares, solo queda activo el último enlace.... quizás debería ver si se puede crear algo como una versión "estática" con la gráfica... pero eso tengo que investigarlo y luego probar si funciona.
Descarga el proyecto completo de Netbeans 6.5... Download the complete Netbeans project... CLICK HERE.
lunes, 26 de enero de 2009
JavaFX: Objetos que se devuelven a su origen si no caen en el destino
Esta es una versión modificada del ejercicio anterior. Si se arrastra un objeto y este no cae dentro del destino, entonces rebota hacia el punto de origen.
Lo único que agregué fue que al crear el objeto guarda su posicion inicial en las variables original_x y original_y, y si detecta que no cae dentro del destino, ejecuta un Timeline que lo hace volver a su posición de origen.
Adicionalmente, hice algunos pequeños cambios para reemplazar el destino circular por un cuadrado de esquinas redondeadas.
Aquí hay una copia completa del proyecto Netbeans 6.5 (Download Complete Project)
Lo único que agregué fue que al crear el objeto guarda su posicion inicial en las variables original_x y original_y, y si detecta que no cae dentro del destino, ejecuta un Timeline que lo hace volver a su posición de origen.
Adicionalmente, hice algunos pequeños cambios para reemplazar el destino circular por un cuadrado de esquinas redondeadas.
Aquí hay una copia completa del proyecto Netbeans 6.5 (Download Complete Project)
Etiquetas:
actionscript,
ajax,
arrastrable,
arrastrar,
back,
bouce,
codigo fuente,
drag and drop,
draggable,
ejemplo,
ejercicio,
example,
java,
javafx,
javascript,
leccion,
rebota,
rebotan,
rebotar,
tutorial
domingo, 18 de enero de 2009
JavaFX: Objetos arrastrables con "efectos"
Este ejemplo incluye 3 clases:
1) Una clase (SpringInterpolator) que define un nuevo tipo de "interpolador" que genera un movimiento "elástico" (de resorte)
2) Una clase (DraggableObj) que permite que los elementos asignados sean "arrastrables" (drag and drop).
3) La clase principal (Main) que implementa la aplicación y que agrega 4 elementos para arrastrar por la ventana.
archivo SpringInterpolator.fx
archivo DraggableObj.fx
archivo Main.fx
1) Una clase (SpringInterpolator) que define un nuevo tipo de "interpolador" que genera un movimiento "elástico" (de resorte)
2) Una clase (DraggableObj) que permite que los elementos asignados sean "arrastrables" (drag and drop).
3) La clase principal (Main) que implementa la aplicación y que agrega 4 elementos para arrastrar por la ventana.
archivo SpringInterpolator.fx
package DraggableClass;
import javafx.animation.SimpleInterpolator;
import java.lang.Math;
public class SpringInterpolator extends SimpleInterpolator {
// amplitud de la onda
// controla que tan lejos puede llegar el objeto desde su punto final
public-init var amplitude:Number = 1.0;
// determina el peso del objeto
// hace el movimiento de la onda mas grande y llega mas lejos
public-init var mass:Number = 0.058;
// rigidez del movimiento de la onda o resolte
// hace la onda mas corta o ceñida
public-init var stiffness:Number = 12.0;
// hace la onda de fase, de modo que el objeto
// no acabe en el lugar de descanso.
// esta variable generalmente no cambia
public-init var phase:Number = 0.0;
// si actua como un resorte normal o rebota
public-init var bounce:Boolean = false;
// usado para calculos internos
var pulsation:Number;
init {
this.pulsation = Math.sqrt(stiffness / mass);
}
// ecuacion del resorte
override public function curve(t: Number) : Number {
var t2 = -Math .cos(pulsation * t + phase + Math.PI) * (1 - t) * amplitude ;
// usa el valor absoluto de la distancia si rebota
if(bounce) {
return 1 - Math.abs(t2);
} else {
return 1 - t2;
}
}
}
archivo DraggableObj.fx
package DraggableClass;
import javafx.scene.Group;
import javafx.scene.CustomNode;
import javafx.scene.Node;
import javafx.scene.shape.*;
import javafx.scene.paint.*;
import javafx.animation.Timeline;
import javafx.animation.Timeline.*;
import javafx.animation.Interpolator;
import javafx.animation.Interpolator.*;
public class DraggableObj extends CustomNode {
public var content: Node[];
var endX = 0.0;
var endY = 0.0;
var startX = 0.0;
var startY = 0.0;
var op:Number=100;
var scale:Number=100;
// produce un parpadeo rapido al
// al soltar los objetos arrastrados
var t = Timeline {
repeatCount: 3
keyFrames: [
at (0s) { op => 100.0 },
at (0.05s) { op => 0.0 }
]
}
// instancia el interpolador de resorte
def spring = SpringInterpolator { bounce: true};
// escala objetos con efecto de resorte
var s = Timeline {
keyFrames: [
at (1.5s) { scale => 100.0 tween spring},
]
};
// escala objectos de tamano original
// a tamano 50% mas grande al hacer
// click sobre ellos
var i = Timeline {
keyFrames: [
at (0s) { scale => 100.0 },
at (0.3s) { scale => 150.0},
]
};
override function create() : Node {
// produce una variacion constante en la
// opacidad de los elementos arrastrables
Timeline {
repeatCount: Timeline.INDEFINITE
autoReverse: true
keyFrames: [
at (0s) { op => 70.0 },
at (0.3s) { op => 100.0 tween Interpolator.EASEBOTH}
]
}.play();
Group {
translateX: bind endX
translateY: bind endY
content: bind content
opacity: bind op/100.0
scaleX: bind scale/100.0
scaleY: bind scale/100.0
onMouseDragged: function(e) {
endX = e.dragX-startX;
endY = e.dragY-startY;
}
onMousePressed: function(e) {
startX = e.dragX-endX;
startY = e.dragY-endY;
s.stop();
i.playFromStart();
}
onMouseReleased: function(e) {
t.playFromStart();
s.time=0s;
s.play();
}
};
}
}
archivo Main.fx
package DraggableClass;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.image.*;
import javafx.scene.paint.*;
import javafx.scene.shape.*;
import javafx.scene.input.MouseEvent;
var newCircle=DraggableObj{
translateX:700
translateY:200
content: Circle {
radius: 100
fill: Color.RED
opacity:0.75
}
};
// este objeto incluye un ARRAY (arreglo) de figuras
var newCircle2=DraggableObj{
translateX:200
translateY:200
content: [
Circle {
opacity:0.5
fill:Color.BLUE
radius:70
},
Rectangle {
translateX:-50
translateY:-50
width:100
height:100
rotate:45
fill:Color.GREEN
opacity:0.5
}
]
};
var newImage=DraggableObj{
translateX:200
translateY:500
content: ImageView {
opacity:0.8
preserveRatio:true
fitWidth:200
image: Image {
// url: "file:/C:/Users/myuser/Pictures/2008a.png"
url: "http://www.google.com/intl/en_ALL/images/logo.gif"
}
}
}
var newRect=DraggableObj{
translateX:700
translateY:500
content: Rectangle {
width:100
height:100
rotate:45
fill:Color.PURPLE
opacity:0.5
}
};
Stage {
title: "Application title"
width: 1200
height: 750
scene: Scene {
// Incluye un ARRAY de objetos
content: [
newCircle,
newCircle2,
newImage,
newRect
]
}
}
Etiquetas:
arrastrable,
arrastrar,
boucing,
bounce,
codigo fuente,
como,
contenedor,
drag and drop,
draggable,
efecto,
efectos,
ejemplo,
elastico,
example,
how to,
javafx,
objeto,
resorte,
source code,
spring
sábado, 6 de diciembre de 2008
JavaFX: Pelota 3D con sombra rebotando sobre video
Ok, solo para que vayan descubriendo el poder de JavaFX. Ayer yo no sabía NADA de JavaFX script. Luego de jugar unas pocas horas, ya tengo este ejemplo: Una "habitación" que tiene en el piso un VIDEO y sobre el cual rebota una bola de apariencia 3D, que incluso se aleja del frente de la pantalla y que proyecta una sombra que varia tanto en intensidad como tamaño dependiendo de la altura a la que se encuentra la bola.
Por ahora sólo les dejo el código. Más adelante postearé otro artículo con la explicación del mismo.
Atención: este ejemplo requiere el mediacomponent.jar entre los Libraries del proyecto. Si crean un proyecto demo basado en el SimpleMediaPlayer (incluido con Netbeans 6.5) y luego reemplanzan el código de Main.fx, la biblioteca mediacomponent.jar quedará incluida en el proyecto automáticamente. Si no, tienen que buscar donde se encuentra en su disco la biblioteca e incluirla entre los libraries del proyecto haciendo click con el botón derecho del mouse en Libraries (a la izquierda en Netbeans) y seleccionado Add Library... (ahí tienen que decirle donde está el archivo). Pero como les digo, lo más fácil es comenzar con un proyecto de ejemplo de mediaplayer y reemplazar el código de Main.fx por el código que incluyo a continuación:
Por ahora sólo les dejo el código. Más adelante postearé otro artículo con la explicación del mismo.
Atención: este ejemplo requiere el mediacomponent.jar entre los Libraries del proyecto. Si crean un proyecto demo basado en el SimpleMediaPlayer (incluido con Netbeans 6.5) y luego reemplanzan el código de Main.fx, la biblioteca mediacomponent.jar quedará incluida en el proyecto automáticamente. Si no, tienen que buscar donde se encuentra en su disco la biblioteca e incluirla entre los libraries del proyecto haciendo click con el botón derecho del mouse en Libraries (a la izquierda en Netbeans) y seleccionado Add Library... (ahí tienen que decirle donde está el archivo). Pero como les digo, lo más fácil es comenzar con un proyecto de ejemplo de mediaplayer y reemplazar el código de Main.fx por el código que incluyo a continuación:
package simplevideoplayer;
import javafx.stage.Stage;
import javafx.scene.Scene;
import com.sun.fxmediacomponent.*;
import javafx.scene.Group;
import javafx.scene.shape.Circle;
import javafx.scene.paint.Color;
import javafx.animation.Interpolator;
import javafx.animation.Timeline;
import javafx.scene.paint.Stop;
import javafx.scene.effect.PerspectiveTransform;
import javafx.scene.shape.Ellipse;
import javafx.scene.paint.*;
import javafx.scene.effect.*;
import javafx.scene.transform.*;
import javafx.scene.shape.Line;
var mediaUrl:String = "http://sun.edgeboss.net/download/sun/media/1460825906/1460825906_2956241001_big-buck-bunny-640x360.flv";
if(FX.getArgument("mediaURL")!=null) {
mediaUrl = FX.getArgument("mediaURL").toString();
}
def vidWidth = 1024;
def vidHeight = 576;
var X=0;
var Y=1;
var Z=0;
var VX=230; // perspectiva horizontal para video
var VY=376; // perspectiva vertical para video
var S:Number;
Timeline {
repeatCount: Timeline.INDEFINITE
autoReverse: true
keyFrames: [
at (0s) {X => 100},
at (2.3s) {X => 924 tween Interpolator.LINEAR},
]
}.play();
Timeline {
repeatCount: Timeline.INDEFINITE
autoReverse: true
keyFrames: [
at (0s) {Y => 100},
at (0.5s) {Y => 476 tween Interpolator.EASEIN},
]
}.play();
Timeline {
repeatCount: Timeline.INDEFINITE
autoReverse: true
keyFrames: [
at (0s) {Z => 40},
at (10s) {Z => 100 tween Interpolator.LINEAR},
]
}.play();
Timeline {
repeatCount: Timeline.INDEFINITE
autoReverse: true
keyFrames: [
at (0s) {S => 0.5},
at (0.5s) {S => 1 tween Interpolator.EASEIN},
]
}.play();
var mediaBox:MediaComponent = MediaComponent {
// set the media and make the component visible
mediaSourceURL : mediaUrl
visible:true
// the position and size of the media on screen
translateX: 0
translateY: 0
mediaViewWidth : vidWidth
mediaViewHeight: vidHeight
// determines if the control bar is below the media or on top with a fade in
staticControlBar: false
// make the movie play as soon as it's loaded
mediaPlayerAutoPlay: true
// set the volume
volume: 1.0
effect: PerspectiveTransform {
ulx: bind VX uly: bind VY
urx: bind 1024-VX ury: bind VY
lrx: 1024 lry: 576
llx: 0 lly: 576
}
};
// Currently these variables have to be set after the component is created
// Description to be displayed when the mouse is over the component
mediaBox.mediaDescriptionStr = "A well-tempered rabbit finds his day spoiled by the rude actions of the...";
// Duration to be displayed when the mouse is over the component
mediaBox.mediaDurationStr = "9:56";
// Title to be displayed when the mouse is over the component
mediaBox.mediaTitleStr = "Big Buck Bunny";
Stage {
title: "Simple Media Player"
scene: Scene{
width: vidWidth
height: vidHeight
stylesheets: [
MediaComponent.css_skins
]
content: [
mediaBox,
Line {
strokeWidth: 3.0
stroke: Color.BLACK
startX: bind VX
startY: bind VY
endX: 0
endY: 576
}
Line {
strokeWidth: 3.0
stroke: Color.BLACK
startX: bind VX
startY: bind VY
endX: bind VX
endY: 0
}
Line {
strokeWidth: 3.0
stroke: Color.BLACK
startX: bind VX
startY: bind VY
endX: bind 1024-VX
endY: bind VY
}
Line {
strokeWidth: 3.0
stroke: Color.BLACK
startX: bind 1024-VX
startY: bind VY
endX: bind 1024-VX
endY: 0
}
Line {
strokeWidth: 3.0
stroke: Color.BLACK
startX: bind 1024-VX
startY: bind VY
endX: 1024
endY: 576
}
Ellipse {
centerX: 0, centerY: 0 radiusX: 100 radiusY: 30
fill: Color.BLACK
opacity: bind S - 0.2
fill: RadialGradient {
proportional: false radius: 100
centerX: 0 centerY: 0
focusX: 0 focusY: 0
stops: [
Stop { offset: 0.0 color: Color.web("#333333", 1.0) },
Stop { offset: 0.4 color: Color.web("#444444", 1.0) },
Stop { offset: 1.0 color: Color.web("#FFFFFF", 0.0) }
]
}
transforms: bind [
Transform.translate(X , 476 + Z - 100 + Z / 2)
Transform.scale(S * Z / 100.0, S * Z / 100.0)
]
}
Circle {
centerX: 0 centerY: 0 radius: 100
stroke: Color.BLACK
fill: RadialGradient {
proportional: false radius: 100
centerX: 0 centerY: 0
focusX: 20 focusY: -50
stops: [
Stop { offset: 0.0 color: Color.WHITE },
Stop { offset: 0.85 color: Color.RED },
Stop { offset: 1.0 color: Color.BLACK }
]
}
transforms: bind [
Transform.translate(X , Y + Z - 100)
Transform.scale(Z/100.0, Z/100.0)
]
}
]
}
}
Suscribirse a:
Entradas (Atom)