Hest
Vi planlegger hesten slik. Alle deler er lukkede sylindere og har således en lengde og en radius.
|
public static final float BASE=1.0f; public static final float BODY_LENGTH=BASE*1.0f; public static final float BODY_RADIUS=BASE*0.3f; public static final float LEG_UPPER_LENGTH=BASE*0.65f; public static final float LEG_LOWER_LENGTH=BASE*0.4f; public static final float LEG_RADIUS=BASE*0.06f; public static final float NECK_LENGTH=BASE*0.65f; public static final float NECK_RADIUS=0.06f; public static final float HEAD_LENGTH=BASE*0.4f; public static final float HEAD_RADIUS=BASE*0.15f; private static final int SLICES=10; private static final int STACKS=10; |
| og vinklene | |
|
// the horse know how to walk ?
private static final int[] HIP_V =
{ 0,
5, 10, 15, 20 ,25, 20, 15 ,10,5,
0,
-5,-10,-15,-20,-25,-20,-15,-10,-5 };
private static final int[] KNEE_V =
{0,
0,0,0,10,20,10,0,0,0,
0,
0,0,0,0,10,20,10,0,0,0};
// dynamic angle for moves of head
public float m_neck_angle=0.0f;
public float m_head_angle=90.0f;
// when we walk:
private int movePos=0;
private int[]front_left_leg={0,0};
private int[]front_right_leg={0,0};
private int[]back_left_leg={0,0};
private int[]back_right_leg={0,0};
|
Den komplette klassen som beskriver og tegner en hest, oneHorse:
Animasjon
Vi vil at hesten skal gå når vi klikker på en knapp og at den fortsetter å gå til vi klikker igjen. Samtidig skal vi kunne endre andre egenskaper ved hesten, eller programmet. Vi gjør dette ved å la mainclass, Horse, implementere Runnable og vi genererer en ny tråd.
private void jToggleButtonWalkActionPerformed(ActionEvent evt) {
if(jToggleButtonWalk.isSelected())
{
glr.doWalk(true);
isRunning=true;
new Thread(new Horse()).start();
}
else
{
glr.doWalk(false);
isRunning=false;
}
}
run-metoden er implementert slik::
public void run()
{
while(isRunning)
{
try {
thePanel.display();
Thread.sleep(200);
}
catch (InterruptedException ex)
{
System.out.println(ex.getMessage());
}
}
}
For at dette skal virke etter hensikten må vi deklarere de involverte egenskapene som statiske slik at de er synlig på tvers av trådene:
GLRenderer glr;
// keep these across threads
static boolean isRunning=false;
static GLJPanel thePanel=null;
public Horse() {
initComponents();
setTitle("Simple JOGL Application");
glr=new GLRenderer();
panel.addGLEventListener(glr);
if(thePanel==null)
thePanel=panel;
}
Merk at animator-klassen som genereres automatisk når NetBeans generer en standard JOGL-applikasjon ikke er til noen nytte her.
En annen figur
Hovedklassen, Horse, vet ikke hva slags dyr vi arbeider med. Alt er fullstendig administrert fra GLRender-klassen. Det er denne som setter opp hesten, gir den farge og sørger for å oppdatere nødvendige vinkler. GLRender er i sin helhet slik:
Det bør være ganske rett-fram og erstatte hesten med en annen pinnefigur, eller å lage alternative bevegelsesmønstere for hesten (trav, galopp, passgang, tølt).