Gå til innhold

Anbefalte innlegg

Hello,

 

En helg på å lære Java og dette er hva jeg har gjort hittil--laget mitt første fysikksim program! Wohoo! Slapp av. Jeg kan veldig lite Java, men hadde det meste i JavaScript fra før av, så ikke bli sjokkert eller noe.

 

Jeg lurte på hvordan man gir dette til andre. Jeg mener, jeg har JDKen, og kan bare kjøre klassen via java kommandoen. Lurte på hvordan jeg gir denne her til venner f eks uten at de må laste ned JDKen...?

 

Koden under. Bruk den så mye du vil, og sett inn noen andre objects! Artig detta...

 

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;

// kopirett
// olai solheim
// [email protected]

class PhysX extends JFrame implements ActionListener
{
Container c;
DrawingSurface d;
Timer animation;

Arena arena;
ArrayList<Sphere> obj;

public PhysX()
{
 super("PhysX A Physics Simulation");
 
 arena = new Arena(800, 600);
 
 obj = new ArrayList<Sphere>();
 obj.add(new Sphere("Blue Ball", new Position(0, 0), new Vector(Math.toRadians(70), .8), 5, 7, new Color(0, 0, 255)));
 obj.add(new Sphere("Red Ball", new Position(-130, -90), new Vector(Math.toRadians(76), 1.3), 7, 9, new Color(255, 0, 0)));
 obj.add(new Sphere("Green Ball", new Position(120, 50), new Vector(Math.toRadians(-45), 1.1), 12, 15, new Color(0, 255, 0)));
 
 d = new DrawingSurface();
 c = getContentPane();
 c.add(d);
 
 animation = new Timer(0, this);
 animation.start();
 
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 setSize(arena.width + 8, arena.height + 34);
}

public void actionPerformed(ActionEvent ev)
{
 for (int i = 0; i < obj.size(); i++)
 {
 	Vector sumForce = new Vector();
 	
 	// gravitation
 	Vector sumGravForce = new Vector();
 	for (int j = 0; j < obj.size(); j++)
 	{
   if (j == i)
   	continue;
   Vector gravForce = new Vector();
   double distance = obj.get(i).getDistance(obj.get(j));
   gravForce.angle = obj.get(i).getAngle(obj.get(j));
   // formula gravitational force
   gravForce.mag = Global.GAMMA * obj.get(i).mass * obj.get(j).mass / Math.pow(distance, 2);
   sumGravForce.add(gravForce);
 	}
 	sumForce.add(sumGravForce);
 	
 	if (sumForce.mag > 0)
 	{
   Vector acceleration = new Vector();
   acceleration.angle = sumForce.angle;
   acceleration.mag = sumForce.mag / obj.get(i).mass;
   obj.get(i).velocity.add(acceleration);
 	}
 	
 	for (int j = i + 1; j < obj.size(); j++)
   obj.get(i).objectCollision(obj.get(j));
 	obj.get(i).arenaCollision(arena);
 	
 	obj.get(i).move();
 }
 
 repaint();
}

class DrawingSurface extends JPanel
{
 Dimension preferredSize = new Dimension(arena.width, arena.height);
 
 public DrawingSurface()
 {
 	super();
 }
 
 public Dimension getPreferredSize()
 {
 	return preferredSize;
 }
 
 public void paintComponent(Graphics g)
 {
 	super.paintComponent(g);
 	
 	for (int i = 0; i < obj.size(); i++)
 	{
   g.setColor(obj.get(i).color);
   double xPos = arena.width / 2 + (obj.get(i).pos.x - obj.get(i).radius) / Global.METERS_PER_PIXEL;
   double yPos = arena.height / 2 + (obj.get(i).pos.y - obj.get(i).radius) / Global.METERS_PER_PIXEL;
   double diameter = (obj.get(i).radius * 2) / Global.METERS_PER_PIXEL;
   g.fillOval((int)xPos, (int)yPos, (int)diameter, (int)diameter);
 	}
 }
}

public static void main(String[] args)
{
 PhysX app = new PhysX();
 app.setVisible(true);
}
}

class Global
{
public static double METERS_PER_PIXEL = 1;
public static double GAMMA = 6.67 * Math.pow(10, -11);
}

class Arena
{
int width;
int height;

public Arena(int width, int height)
{
 this.width = width;
 this.height = height;
}
}

class Position
{
double x;
double y;

public Position(double x, double y)
{
 this.x = x;
 this.y = y;
}
}

class Vector
{
double angle;
double mag;

public Vector()
{
 this.angle = 0;
 this.mag = 0;
}

public Vector(double angle, double mag)
{
 this.angle = angle;
 this.mag = mag;
}

public void add(Vector other)
{
 double aMagX = Math.sin(this.angle) * this.mag;
 double aMagY = Math.cos(this.angle) * this.mag;
 double bMagX = Math.sin(other.angle) * other.mag;
 double bMagY = Math.cos(other.angle) * other.mag;
 double cMagX = aMagX + bMagX;
 double cMagY = aMagY + bMagY;
 this.angle = Math.atan2(cMagX, cMagY);
 this.mag = Math.sqrt(Math.pow(cMagX, 2) + Math.pow(cMagY, 2));
}
}

class Sphere
{
String name;
Position pos;
Vector velocity;
double mass;
double radius;
Color color;

public Sphere(String name, Position pos, Vector velocity, double mass, double radius, Color color)
{
 this.name = name;
 this.pos = pos;
 this.velocity = velocity;
 this.mass = mass;
 this.radius = radius;
 this.color = color;
}

public double getDistance(Sphere other)
{
 double distanceX = other.pos.x - this.pos.x;
 double distanceY = this.pos.y - other.pos.y;
 return Math.sqrt(Math.pow(distanceX, 2) + Math.pow(distanceY, 2));
}

public double getAngle(Sphere other)
{
 double distanceX = other.pos.x - this.pos.x;
 double distanceY = this.pos.y - other.pos.y;
 return Math.atan2(distanceX, distanceY);
}

public void arenaCollision(Arena arena)
{
 if (this.pos.x - this.radius < (-arena.width / 2) * Global.METERS_PER_PIXEL)
 {
 	this.pos.x = (-arena.width / 2) * Global.METERS_PER_PIXEL + this.radius;
 	this.velocity.angle = 2 * Math.PI - this.velocity.angle;
 }
 else if (this.pos.x + this.radius > (arena.width / 2) * Global.METERS_PER_PIXEL)
 {
 	this.pos.x = (arena.width / 2) * Global.METERS_PER_PIXEL - this.radius;
 	this.velocity.angle = -this.velocity.angle;
 }
 if (this.pos.y - this.radius < (-arena.height / 2) * Global.METERS_PER_PIXEL)
 {
 	this.pos.y = (-arena.height / 2) * Global.METERS_PER_PIXEL + this.radius;
 	this.velocity.angle = -Math.PI - this.velocity.angle;
 }
 else if (this.pos.y + this.radius > (arena.height / 2) * Global.METERS_PER_PIXEL)
 {
 	this.pos.y = (arena.height / 2) * Global.METERS_PER_PIXEL - this.radius;
 	this.velocity.angle = Math.PI - this.velocity.angle;
 }
}

public void objectCollision(Sphere subobj)
{
 double distance = this.getDistance(subobj);
 if (distance - this.radius - subobj.radius < 0)
 {
 	// get angle to b from a
 	double objAngle = this.getAngle(subobj);
 	// get angle to a from b
 	double subobjAngle = subobj.getAngle(this);
 	
 	// decompose speeds on collision plane (collision plane: line from center this to center subobj where x is along plane and y is normal to plane)
 	double objPlaneXSpeed = this.velocity.mag * Math.cos(this.velocity.angle - objAngle);
 	double objPlaneYSpeed = this.velocity.mag * Math.sin(this.velocity.angle - objAngle);
 	double subobjPlaneXSpeed = subobj.velocity.mag * Math.cos(subobj.velocity.angle - objAngle);
 	double subobjPlaneYSpeed = subobj.velocity.mag * Math.sin(subobj.velocity.angle - objAngle);
 	
 	// calculate new speeds in x-direction
 	double objPlaneNewXSpeed = (objPlaneXSpeed * (this.mass - subobj.mass) + 2 * subobj.mass * subobjPlaneXSpeed) / (this.mass + subobj.mass);
 	double objPlaneNewYSpeed = objPlaneYSpeed; // leave unchanged in y-direction
 	double subobjPlaneNewXSpeed = (subobjPlaneXSpeed * (subobj.mass - this.mass) + 2 * this.mass * objPlaneXSpeed) / (this.mass + subobj.mass);
 	double subobjPlaneNewYSpeed = subobjPlaneYSpeed; // leave unchanged in y-direction
 	
 	// get new polar speed
 	this.velocity.mag = Math.sqrt(Math.pow(objPlaneNewXSpeed, 2) + Math.pow(objPlaneNewYSpeed, 2));
 	subobj.velocity.mag = Math.sqrt(Math.pow(subobjPlaneNewXSpeed, 2) + Math.pow(subobjPlaneNewYSpeed, 2));
 	
 	// get new polar angle (first part is angle from plane, then second part adds the angle arena-plane)
 	this.velocity.angle = Math.atan2(objPlaneNewYSpeed, objPlaneNewXSpeed) + objAngle;
 	subobj.velocity.angle = Math.atan2(subobjPlaneNewYSpeed, subobjPlaneNewXSpeed) + objAngle;
 	
 	// move object out of collision zone
 	this.pos.x = subobj.pos.x + ((this.radius + subobj.radius) * Math.sin(subobjAngle));
 	this.pos.y = subobj.pos.y + ((this.radius + subobj.radius) * Math.cos(subobjAngle) * -1);
 }
}

public void move()
{
 this.pos.x += this.velocity.mag * Math.sin(this.velocity.angle);
 this.pos.y += this.velocity.mag * Math.cos(this.velocity.angle) * -1;
}
}

 

PS! Den tar med gravitasjon også, men det legger man ikke merke til i det hele tatt på objekter med så liten masse som disse har.

 

Utvid arenaen ved å utvide METERS_PER_PIXEL konstanten, lag nye objekter med større masse, og simuler Cassinis slingshot rundt Jupiter f eks! =] Jeg lagde denne i JavaScript først, men når det ble avansert etterhvert, tenkte jeg det var på tide å lage det i et programmeringsspråk, som f eks C++ eller Java. C++ var så vanskelig å skjønne bæret av (selv etter 600/1400 sider med lesing i en bok), så jeg prøvde meg på Java ved å bruke Joe Grip's fantastiske interaktive Java onlinekurs funnet her. Det gav meg rask tilgang til raske prosesser for å si det sånn... =D Takk for dere som har hjulpet meg også... =]

 

Lost

Endret av LostOblivion
Lenke til kommentar
Videoannonse
Annonse

Veldig morsom greie du har satt sammen her! :)

 

Vet ikke om du har sett odejava prosjektet på dev.java.net (https://odejava.dev.java.net/), det er da java bindinger for ODE som er den mest brukte Open Source rigid body dynamics simulatoren. Kan spare deg et par år i utviklingstid, hvis du har tenkt til å utvide til 3D ;) . Har blitt brukt i mange kommersielle spill blant annet. Den kan man ha det mye moro med.

 

ODE demo på youtube:

Lenke til kommentar

Hehe. Tenkte kanskje jeg skulle lære meg Java først da... =] Så det går an med 3D i Java assa? Niiice....

 

Oh. En ting til.

 

Jeg lurte på hvordan man gir dette til andre. Jeg mener, jeg har JDKen, og kan bare kjøre klassen via java kommandoen. Lurte på hvordan jeg gir denne her til venner f eks uten at de må laste ned JDKen...?

 

Her hvis du vil ha Mars + tre ekstra måner. =]

 

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;

// kopirett
// olai solheim
// [email protected]

class PhysX extends JFrame implements ActionListener
{
Container c;
DrawingSurface d;
Timer animation;

Arena arena;
ArrayList<Sphere> obj;

public PhysX()
{
 super("PhysX A Physics Simulation");
 
 arena = new Arena(1000, 800);
 
 obj = new ArrayList<Sphere>();
 obj.add(new Sphere(
 	"Mars",
 	new Position(0, 0),
 	new Vector(Math.toRadians(0), 0),
 	6.4 * Math.pow(10, 25),
 	3.4 * Math.pow(10, 6),
 	new Color(255, 40, 40)
 ));
 obj.add(new Sphere(
 	"Phobos",
 	new Position(0, 9.4 * Math.pow(10, 6)),
 	new Vector(Math.toRadians(90), 24000),
 	1.07 * Math.pow(10, 16),
 	6.2 * Math.pow(10, 5),
 	new Color(50, 50, 230)
 ));
 obj.add(new Sphere(
 	"Deimos",
 	new Position(-2.35 * Math.pow(10, 7), 0),
 	new Vector(Math.toRadians(180), 14000),
 	1.8 * Math.pow(10, 15),
 	2.5 * Math.pow(10, 5),
 	new Color(130, 50, 230)
 ));
 obj.add(new Sphere(
 	"ExtraI",
 	new Position(2.05 * Math.pow(10, 7), 3 * Math.pow(10, 6)),
 	new Vector(Math.toRadians(0), 14000),
 	6.8 * Math.pow(10, 15),
 	4.8 * Math.pow(10, 5),
 	new Color(70, 155, 90)
 ));
 obj.add(new Sphere(
 	"ExtraII",
 	new Position(2.05 * Math.pow(10, 7), 0),
 	new Vector(Math.toRadians(0), 13500),
 	3.7 * Math.pow(10, 15),
 	3.2 * Math.pow(10, 5),
 	new Color(200, 155, 90)
 ));
 obj.add(new Sphere(
 	"ExtraIII",
 	new Position(0, 2.25 * Math.pow(10, 7)),
 	new Vector(Math.toRadians(90), 12500),
 	1.75 * Math.pow(10, 16),
 	4.5 * Math.pow(10, 5),
 	new Color(255, 100, 90)
 ));
 
 d = new DrawingSurface();
 c = getContentPane();
 c.add(d);
 
 animation = new Timer(0, this);
 animation.start();
 
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 setSize(arena.width + 8, arena.height + 34);
 Dimension offset = Toolkit.getDefaultToolkit().getScreenSize();
 int locX = (offset.width - getSize().width) / 2;
 int locY = (offset.height - getSize().height) / 2;
 setLocation(locX, locY);
}

public void actionPerformed(ActionEvent ev)
{
 for (int i = 0; i < obj.size(); i++)
 {
 	Vector sumForce = new Vector();
 	
 	// gravitation
 	Vector sumGravForce = new Vector();
 	for (int j = 0; j < obj.size(); j++)
 	{
   if (j == i)
   	continue;
   Vector gravForce = new Vector();
   double distance = obj.get(i).getDistance(obj.get(j));
   gravForce.angle = obj.get(i).getAngle(obj.get(j));
   // formula gravitational force
   gravForce.mag = Global.GAMMA * obj.get(i).mass * obj.get(j).mass / Math.pow(distance, 2);
   sumGravForce.add(gravForce);
 	}
 	sumForce.add(sumGravForce);
 	
 	if (sumForce.mag > 0)
 	{
   Vector acceleration = new Vector();
   acceleration.angle = sumForce.angle;
   acceleration.mag = sumForce.mag / obj.get(i).mass;
   obj.get(i).velocity.add(acceleration);
 	}
 	
 	for (int j = i + 1; j < obj.size(); j++)
   obj.get(i).objectCollision(obj.get(j));
 	obj.get(i).arenaCollision(arena);
 	
 	obj.get(i).move();
 }
 
 repaint();
}

class DrawingSurface extends JPanel
{
 Dimension preferredSize = new Dimension(arena.width, arena.height);
 
 public DrawingSurface()
 {
 	super();
 }
 
 public Dimension getPreferredSize()
 {
 	return preferredSize;
 }
 
 public void paintComponent(Graphics g)
 {
 	super.paintComponent(g);
 	
 	g.setColor(new Color(200, 200, 200));
 	g.fillRoundRect(-10, arena.height - 20, 110, 30, 10, 10);
 	g.setColor(new Color(255, 255, 255));
 	g.drawString("by Olai Solheim", 5, arena.height - 5);
 	
 	for (int i = 0; i < obj.size(); i++)
 	{
   g.setColor(obj.get(i).color);
   double xPos = arena.width / 2 + (obj.get(i).pos.x - obj.get(i).radius) / Global.METERS_PER_PIXEL;
   double yPos = arena.height / 2 + (obj.get(i).pos.y - obj.get(i).radius) / Global.METERS_PER_PIXEL;
   double diameter = (obj.get(i).radius * 2) / Global.METERS_PER_PIXEL;
   g.fillOval((int)xPos, (int)yPos, (int)diameter, (int)diameter);
 	}
 }
}

public static void main(String[] args)
{
 PhysX app = new PhysX();
 app.setVisible(true);
}
}

class Global
{
public static final double METERS_PER_PIXEL = 8 * Math.pow(10, 4);
public static final double GAMMA = 6.67 * Math.pow(10, -11);
}

class Arena
{
int width;
int height;

public Arena(int width, int height)
{
 this.width = width;
 this.height = height;
}
}

class Position
{
double x;
double y;

public Position(double x, double y)
{
 this.x = x;
 this.y = y;
}
}

class Vector
{
double angle;
double mag;

public Vector()
{
 this.angle = 0;
 this.mag = 0;
}

public Vector(double angle, double mag)
{
 this.angle = angle;
 this.mag = mag;
}

public void add(Vector other)
{
 double aMagX = Math.sin(this.angle) * this.mag;
 double aMagY = Math.cos(this.angle) * this.mag;
 double bMagX = Math.sin(other.angle) * other.mag;
 double bMagY = Math.cos(other.angle) * other.mag;
 double cMagX = aMagX + bMagX;
 double cMagY = aMagY + bMagY;
 this.angle = Math.atan2(cMagX, cMagY);
 this.mag = Math.sqrt(Math.pow(cMagX, 2) + Math.pow(cMagY, 2));
}
}

class Sphere
{
String name;
Position pos;
Vector velocity;
double mass;
double radius;
Color color;

public Sphere(String name, Position pos, Vector velocity, double mass, double radius, Color color)
{
 this.name = name;
 this.pos = pos;
 this.velocity = velocity;
 this.mass = mass;
 this.radius = radius;
 this.color = color;
}

public double getDistance(Sphere other)
{
 double distanceX = other.pos.x - this.pos.x;
 double distanceY = this.pos.y - other.pos.y;
 return Math.sqrt(Math.pow(distanceX, 2) + Math.pow(distanceY, 2));
}

public double getAngle(Sphere other)
{
 double distanceX = other.pos.x - this.pos.x;
 double distanceY = this.pos.y - other.pos.y;
 return Math.atan2(distanceX, distanceY);
}

public void arenaCollision(Arena arena)
{
 if (this.pos.x - this.radius < (-arena.width / 2) * Global.METERS_PER_PIXEL)
 {
 	this.pos.x = (-arena.width / 2) * Global.METERS_PER_PIXEL + this.radius;
 	this.velocity.angle = 2 * Math.PI - this.velocity.angle;
 }
 else if (this.pos.x + this.radius > (arena.width / 2) * Global.METERS_PER_PIXEL)
 {
 	this.pos.x = (arena.width / 2) * Global.METERS_PER_PIXEL - this.radius;
 	this.velocity.angle = -this.velocity.angle;
 }
 if (this.pos.y - this.radius < (-arena.height / 2) * Global.METERS_PER_PIXEL)
 {
 	this.pos.y = (-arena.height / 2) * Global.METERS_PER_PIXEL + this.radius;
 	this.velocity.angle = -Math.PI - this.velocity.angle;
 }
 else if (this.pos.y + this.radius > (arena.height / 2) * Global.METERS_PER_PIXEL)
 {
 	this.pos.y = (arena.height / 2) * Global.METERS_PER_PIXEL - this.radius;
 	this.velocity.angle = Math.PI - this.velocity.angle;
 }
}

public void objectCollision(Sphere subobj)
{
 double distance = this.getDistance(subobj);
 if (distance - this.radius - subobj.radius < 0)
 {
 	// get angle to b from a
 	double objAngle = this.getAngle(subobj);
 	// get angle to a from b
 	double subobjAngle = subobj.getAngle(this);
 	
 	// decompose speeds on collision plane (collision plane: line from center this to center subobj where x is along plane and y is normal to plane)
 	double objPlaneXSpeed = this.velocity.mag * Math.cos(this.velocity.angle - objAngle);
 	double objPlaneYSpeed = this.velocity.mag * Math.sin(this.velocity.angle - objAngle);
 	double subobjPlaneXSpeed = subobj.velocity.mag * Math.cos(subobj.velocity.angle - objAngle);
 	double subobjPlaneYSpeed = subobj.velocity.mag * Math.sin(subobj.velocity.angle - objAngle);
 	
 	// calculate new speeds in x-direction
 	double objPlaneNewXSpeed = (objPlaneXSpeed * (this.mass - subobj.mass) + 2 * subobj.mass * subobjPlaneXSpeed) / (this.mass + subobj.mass);
 	double objPlaneNewYSpeed = objPlaneYSpeed; // leave unchanged in y-direction
 	double subobjPlaneNewXSpeed = (subobjPlaneXSpeed * (subobj.mass - this.mass) + 2 * this.mass * objPlaneXSpeed) / (this.mass + subobj.mass);
 	double subobjPlaneNewYSpeed = subobjPlaneYSpeed; // leave unchanged in y-direction
 	
 	// get new polar speed
 	this.velocity.mag = Math.sqrt(Math.pow(objPlaneNewXSpeed, 2) + Math.pow(objPlaneNewYSpeed, 2));
 	subobj.velocity.mag = Math.sqrt(Math.pow(subobjPlaneNewXSpeed, 2) + Math.pow(subobjPlaneNewYSpeed, 2));
 	
 	// get new polar angle (first part is angle from plane, then second part adds the angle arena-plane)
 	this.velocity.angle = Math.atan2(objPlaneNewYSpeed, objPlaneNewXSpeed) + objAngle;
 	subobj.velocity.angle = Math.atan2(subobjPlaneNewYSpeed, subobjPlaneNewXSpeed) + objAngle;
 	
 	// move object out of collision zone
 	this.pos.x = subobj.pos.x + ((this.radius + subobj.radius) * Math.sin(subobjAngle));
 	this.pos.y = subobj.pos.y + ((this.radius + subobj.radius) * Math.cos(subobjAngle) * -1);
 }
}

public void move()
{
 this.pos.x += this.velocity.mag * Math.sin(this.velocity.angle);
 this.pos.y += this.velocity.mag * Math.cos(this.velocity.angle) * -1;
}
}

Endret av LostOblivion
Lenke til kommentar
Jeg lurte på hvordan man gir dette til andre. Jeg mener, jeg har JDKen, og kan bare kjøre klassen via java kommandoen. Lurte på hvordan jeg gir denne her til venner f eks uten at de må laste ned JDKen...?
Du kan gjøre om kildekoden til en .jar-fil. Disse er kjørbare på de fleste maskiner ;) (man må ha installert java virtuel machine, men det har de fleste i dag tror jeg.)

 

Bruker du et IDE som f.eks. Eclipse kan programmet generere jar-filen automatisk for deg. Hvis ikke, er det uansett ikke kjempevanskelig å lage en jar-fil vha konsollen. Men jeg husker ikke hvordan, så du må ta google til hjelp for sistnevnte

Lenke til kommentar
Wow. Takk! Har ikke sjekka, men awesome hvis det funker... Men må man ikke definere hva som er klassen som skal kjøres? Eller trenger den en "manifest" som det står i jar hjelpen?

7815017[/snapback]

Stemmer, du trenger et manifest. Selv har jeg kun lagd jar-filer i Eclipse, og da gikk det meste automatisk.. :p Poenget blir jo iallefall å fortelle jar-filen hvor main-metoden er m.m. Er vel det manifestet skal ta seg av?

 

(Jeg har ikke god kunnskap på generering av jar-filer)

 

Lykke til!

Lenke til kommentar

Hmmm. Ser ut til å funke helt fint for meg ved å gjøre det jeg gjorde. Du finner alle filene jeg brukte og et bilde som viser kommandoen jeg brukte til jar-arkiveringen her.

 

Problemet er at en venn av meg, som ikke har hele JDKen, men bare JVM, sier han får feilmeldingen "Cannot find main class." eller noe sånt noe.

 

Denne får ikke jeg når jeg kjører nøyaktig den samme filen.

 

Noen som har peiling på dette?

Lenke til kommentar
Ingen som har peiling på hvorfor det ikke funker?

7840843[/snapback]

 

Ingen som har peiling på hvorfor det ikke funker?

7840843[/snapback]

 

Ikke helt sikker på hva dette kan være, men uansett kan du jo lære deg å bruke Apache Ant for bygge prosjektet ditt. Blir det samme som "make" for C/C++, tar seg av kompilering, pakking osv.

 

1: Last ned Ant fra: ant.apache.org

2: Installer

3: lag en fil i prosjektet ditt som heter build.xml

4: Definer build tasks (se nedenfor)

5: kjør 'ant'

 

Eksempel build.xml fil, denne burde dekke alle dine behov. forutsetter følgende prosjekt struktur:

 

ProjectName/

+src/

+lib/

+build.xml

 

(Eller et hvilket som helst Eclipse prosjekt. Eclipse har blant annet innebygd støtte for Ant.)

<project name="Test" default="default">
 <property name="src" value="src"/>
 <property name="build" value="bin"/>
 <property name="external.jars" value="lib"/>
 <property name="jar.name" value="Test.jar"/>
 <property name="main.class" value="com.PhysX"/>

 <!-- Classpath -->
<path id="build.classpath">
 <fileset dir="${external.jars}">
 	<include name="**/*.jar"/>
 </fileset>
</path>

 <!-- Target: default -->
 <target name="default" depends="build, package" description=""></target>

 <!-- Target: clean -->
 <target name="clean">
   <delete dir="${build}"/>
   <mkdir dir="${build}"/>
 </target>

 <!-- Target: build -->
 <target name="build" depends="clean">
   <javac sourcepath="" srcdir="${src}" destdir="${build}" classpathref="build.classpath" debug="on" target="1.5" source="1.5">
     <include name="**/*.java"/>
   </javac>
 </target>

 <!-- Target: package -->
 <target name="package">
 <jar destfile="${jar.name}">
   <fileset dir="${build}" >
     <include name="**/*"/>
   </fileset>
   <manifest>
     <attribute name="Built-By" value="${user.name}"/>
     <attribute name="Main-Class" value="${main.class}"/>
   </manifest>
   </jar>
 </target>
</project>

 

Spør om du lurer på noe

Lenke til kommentar
Takk for svar endelig. Skal prøve å forstå meg på det før jeg spør om noe. =)

 

Det som er litt merkelig, er at han klarer å kjøre denne, men ikke min. Og hvis man sjekker manifestfilen til selve hovedJARfilen så er den nesten identisk...

7850207[/snapback]

 

Ikke sikker på hva dette kan være, men prøv å bygg jar filen med Ant, det er uansett et veldig kjekt verktøy å mestre.

Lenke til kommentar
Takk for svar endelig. Skal prøve å forstå meg på det før jeg spør om noe. =)

 

Det som er litt merkelig, er at han klarer å kjøre denne, men ikke min. Og hvis man sjekker manifestfilen til selve hovedJARfilen så er den nesten identisk...

7850207[/snapback]

 

Tidligere har jeg brukt en plugin som heter Fat Jar, med stort hell.

 

http://fjep.sourceforge.net/

 

Hilsen Werner

Lenke til kommentar
  • 3 uker senere...

Har hatt en del problemer med .jar filer selv, og jeg har kommet frem til at det er hvilken versjon man kompilerer kildekoden i som har noe å si.. Av og til måtte jeg kompilere i 1.4, av og til i 1.5, men etter at jeg begynte med eclipse slapp jeg heldigvis det da...

Bruk eclipse. Det funker.

 

Men for å kunne bruke den kolisjonsmotoren må man vel ha en 3d motor også?

Hvilken er å anbefale?

Lenke til kommentar
Veldig morsom greie du har satt sammen her! :)

 

Vet ikke om du har sett odejava prosjektet på dev.java.net (https://odejava.dev.java.net/), det er da java bindinger for ODE som er den mest brukte Open Source rigid body dynamics simulatoren. Kan spare deg et par år i utviklingstid, hvis du har tenkt til å utvide til 3D ;) . Har blitt brukt i mange kommersielle spill blant annet. Den kan man ha det mye moro med.

 

ODE demo på youtube:

7779149[/snapback]

 

Denne..

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...