Вопрос или проблема
Я делаю проект, состоящий из 3D приложения Солнечной системы. Мое приложение имеет главный экран, и после нажатия на красную коробку оно перенаправляет на 3D модель Солнечной системы. Проблема в том, что мой код разрознен. Вот мой код: Для главного экрана:
StateInterface currentState = new StateHome();
// -------------------------------------------------
void setup() {
// инициализация (работает только один раз)
fullScreen(OPENGL);
} // функция
void draw() {
// работает постоянно
currentState.showState();
}
// ----------------------------------------
// клавиатурный ввод
void keyPressed() {
currentState.keyPressedState();
}
//----------------------------------------
void mousePressed() {
currentState.mousePressedState();
}
// ===============================================================================================
class StateHome implements StateInterface {
// Игра
void showState() {
// Игра
background(11);
fill(244, 3, 3); // красный
text ("Добро пожаловать в Генератор Солнечной системы", 850, 100);
//
noStroke();
fill(255, 2, 2) ;
rect(100, 100, 100, 100);
fill(255, 2, 255) ;
// rect(300, 100, 100, 100);
if (mouseX > 100 &&
mouseX < 100 + 100 &&
mouseY > 100 &&
mouseY < 100 + 100) {
println ("столкновение");
currentState = new statePause();
}
} // функция
void keyPressedState() {
if (key == CODED)
{
if (keyCode == UP) {
//
} else if (keyCode == DOWN) {
//
}
if (keyCode == LEFT) {
//
} else if (keyCode == RIGHT) {
//
} else {
// ничего не делать
} // иначе
} // if (key == CODED) {
else
{
// не CODED ----------------------
if (key == 'p') {
// Пауза
currentState = new statePause();
} else {
// ничего не делать
} // иначе
} // иначе не CODED
} // функция
void mousePressedState() {
// Игра
println("мышь 1");
}//функция
}//класс
// ===========================================================================================
class statePause implements StateInterface {
// Мой Генератор Солнечной системы будет здесь
}
interface StateInterface {
// Давайте абстрагируем
// Давайте абстрагируем display()
void showState();
void keyPressedState();
void mousePressedState();
}
Для Генератора Солнечной системы:
import peasy.*;
PeasyCam cam;
ArrayList planets;
float fmax = 0;
ArrayList stars;
float rotate;
float radius = 250;
float camheight = 1000;
float fov;
float cameraZ;
float dis1;
int steps = 400000;
int p;
PImage sun, mercury, venus, earth, mars, jupiter, saturn, uranus, neptune;
void setup() {
//size(800, 600, OPENGL);
fullScreen(OPENGL);
frameRate(100);
sun = loadImage("Sun.jpg");
mercury = loadImage("Mercury.jpg");
venus = loadImage("Venus.jpg");
earth = loadImage("Earth.jpg");
mars = loadImage("Mars.jpg");
jupiter = loadImage("Jupiter.jpg");
saturn = loadImage("Saturn.jpg");
uranus = loadImage("Uranus.jpg");
neptune = loadImage("Neptune.jpg");
p = 0;
fov = radians(70);
perspective(fov, float(width)/float(height), 1, 9999999);
cam = new PeasyCam(this, width/2, height/2, 0, 1000);
cam.setMinimumDistance(21);
planets = new ArrayList();
planets.add(new Planet("Солнце", 0, 0, 0, 0, 20, 333054, 255, 230, 0, 1, 1000, 0, sun));
planets.add(new Planet("Меркурий", 62.543, 7, 0, 0.205, 8, 0.055, 132, 132, 132, 45, 13, 10, mercury));
planets.add(new Planet("Венера", 145.763, 3.4, 177, 0.007, 12, 0.8149, 197, 133, 40, 50, 28, 5, venus));
planets.add(new Planet("Земля", 200, 0, 23.4, 0.017, 13, 1, 84, 101, 130, 50, 48, 0.1, earth));
planets.add(new Planet("Марс", 280.9, 1.9, 6.7, 0.094, 9, 0.1069, 183, 99, 72, 60, 76, 0.1, mars));
planets.add(new Planet("Юпитер", 1006.798, 1.3, 25.2, 0.049, 40, 317, 167, 161, 150, 80, 350, 0.05, jupiter));
planets.add(new Planet("Сатурн", 1839.02, 2.5, 3.1, 0.057, 32, 95, 208, 193, 163, 100, 700, 0.05, saturn));
planets.add(new Planet("Уран", 3727.1, 0.8, 26.7, 0.046, 60, 14, 155, 203, 210, 132, 1450, 0.07, uranus));
planets.add(new Planet("Нептун", 6042.8, 1.8, 97.8, 0.011, 70, 17, 45, 52, 132, 183, 2000, 0.08, neptune));
//planets.add(new Planet("Плутон", -5032.3589395, 0, 0, 0, -0.19226, 0, 15, 0.10699933, 250, 200, 50));
background(0);
for (int i = 0; i < steps; i++) {
pre(i);
}
}
void draw() {
background(0);
//pushMatrix();
//translate(width/2, height/2, 0);
//stroke(0, 0, 255);
//line(300, 0, 0, -100, 0, 0);
//stroke(0, 255, 0);
//line(0, 330, 0, -0, -100, 0);
//stroke(255, 0, 0);
//line(0, 0, 300, 0, 0, -100);
//popMatrix();
float dis = (float) cam.getDistance();
if (dis > 50000) dis = 50000;
if (dis < 21) dis = 21;
dis1 = map(dis, 21, 50000, 0, 255);
fov = radians(log1(dis1));
perspective(fov, float(width)/float(height), 1, 9999999);
pushMatrix();
float[] campos = cam.getPosition();
translate(campos[0], campos[1], campos[2]);
translate(-campos[0], -campos[1], -campos[2]);
popMatrix();
for (Planet planet1 : planets) {
planet1.grav(planet1, planets);
}
for (Planet planet1 : planets) {
planet1.updateVel();
}
Planet plan = planets.get(0);
Planet plan2 = planets.get(p);
//camera(width/2, /*(height/2)*/ + map(mouseY, 0, height, -1000, 1000), 1000, width/2, height/2, 0, 0, 0, 1);
pushMatrix();
translate((width/2) - plan2.pos.x, (height/2) - plan2.pos.y, 0 - plan2.pos.z);
for (int i = 0; i < planets.size(); i++) {
Planet plan1 = planets.get(i);
if (i != 0) plan1.light(plan);
plan1.show();
}
popMatrix();
}
void pre(int i) {
for (Planet planet1 : planets) {
planet1.grav(planet1, planets);
}
for (Planet planet1 : planets) {
planet1.updateVel1(i);
}
}
float log1(float a) {
float a2 = 2100 / (30 + 70 * exp(0.021 * -a));
return a2;
}
void keyPressed() {
if (key == 'w'){
p++;
if (p > planets.size()-1) p = 0;
}
if (key == 's'){
p--;
if (p < 0) p = planets.size()-1;
}
}
class Planet {
PVector pos;
PVector vel;
PVector acc;
float radius;
float mass;
float r, g, b;
int mod;
PVector currVel;
String name;
ArrayList posStore;
float dis;
int traillength;
float rotation;
float rot;
float winkelPole;
float Grav = 0.0002;
PShape planet;
Planet(String name, float dis, float incl, float winkelPole, float ecc, float r, float m, float re, float g, float b, int traillength, int mod, float rot, PImage img) {
float vz;
if (dis != 0) vz = sqrt((Grav * 333054) / dis);
else vz = 0;
vz = vz * (1 + (ecc/2));
this.pos = new PVector(dis, 0, 0);
this.vel = new PVector(0, 0, vz);
this.pos.x = dis * cos(radians(incl));
this.pos.y = (dis * sin(radians(incl))) *-1;
float hyp = vz / cos(radians(incl));
this.vel.y = sin(radians(incl)) * hyp;
this.vel.setMag(vz*-1);
this.winkelPole = winkelPole;
this.rotation = rot;
this.mod = mod;
this.radius = r;
this.mass = /*PI * sq(r)*/ m;
this.r = re;
this.g = g;
this.b = b;
this.currVel = new PVector(this.vel.x, this.vel.y, this.vel.z);
this.name = name;
this.traillength = traillength;
this.posStore = new ArrayList(traillength);
for (int i = 0; i < traillength; i++) {
posStore.add(new PVector(this.pos.x, this.pos.y, this.pos.z));
}
planet = createShape(SPHERE, r);
planet.setTexture(img);
planet.setStroke(0);
}
void grav(Planet planet1, ArrayList planets) {
for (Planet planet2 : planets) {
if (planet1 == planet2) continue;
PVector forceDir = PVector.sub(planet2.pos, planet1.pos);
float d = forceDir.magSq();
forceDir.normalize();
PVector f = forceDir.mult(Grav * planet2.mass / d);
currVel = planet1.vel.add(f);
}
}
void updateVel() {
this.pos.add(this.currVel);
if (frameCount % mod == 0) posStore.add(0, new PVector(this.pos.x, this.pos.y, this.pos.z));
if ( posStore.size() > traillength) posStore.remove(traillength);
}
void updateVel1(int i) {
this.pos.add(this.currVel);
if (i % mod == 0) posStore.add(0, new PVector(this.pos.x, this.pos.y, this.pos.z));
if ( posStore.size() > traillength) posStore.remove(traillength);
}
void show() {
for (int i = 0; i < posStore.size()-2; i++) {
PVector p1 = posStore.get(i);
PVector p2 = posStore.get(i+1);
stroke(this.r, this.g, this.b);
line(p1.x, p1.y, p1.z, p2.x, p2.y, p2.z);
}
noStroke();
fill(r, g, b);
pushMatrix();
translate(pos.x, pos.y, pos.z);
if (rotation != 0) {
if (rot > 1000000) rot = 0;
rot = rot + (0.1 / rotation);
rotateX(radians(winkelPole));
rotateY(radians(rot));
}
//specular(r*1.5, g*1.5, b*1.5);
//shininess(5);
//emissive(r*0.2, g*0.2, b*0.2);
shape(planet);
popMatrix();
}
void light(Planet plan) {
lightSpecular(0, 0, 0);
pointLight(120, 120, 110, plan.pos.x, plan.pos.y, plan.pos.z);
}
}
Итак, я попытался напрямую объединить коды вместе:
import peasy.*;
PeasyCam cam;
ArrayList planets;
float fmax = 0;
ArrayList stars;
float rotate;
float radius = 250;
float camheight = 1000;
float fov;
float cameraZ;
float dis1;
int steps = 400000;
int p;
PImage sun, mercury, venus, earth, mars, jupiter, saturn, uranus, neptune;
StateInterface currentState = new StateHome();
// -------------------------------------------------
void setup() {
// инициализация (работает только один раз)
fullScreen(OPENGL);
} // функция
void draw() {
// работает постоянно
currentState.showState();
}
// ----------------------------------------
// клавиатурный ввод
void keyPressed() {
currentState.keyPressedState();
}
//----------------------------------------
void mousePressed() {
currentState.mousePressedState();
}
// ===============================================================================================
class StateHome implements StateInterface {
// Игра
void showState() {
// Игра
background(11);
fill(244, 3, 3); // красный
text ("Добро пожаловать в Генератор Солнечной системы", 850, 100);
//
noStroke();
fill(255, 2, 2) ;
rect(100, 100, 100, 100);
fill(255, 2, 255) ;
// rect(300, 100, 100, 100);
if (mouseX > 100 &&
mouseX < 100 + 100 &&
mouseY > 100 &&
mouseY < 100 + 100) {
println ("столкновение");
currentState = new statePause();
}
} // функция
void keyPressedState() {
if (key == CODED)
{
if (keyCode == UP) {
//
} else if (keyCode == DOWN) {
//
}
if (keyCode == LEFT) {
//
} else if (keyCode == RIGHT) {
//
} else {
// ничего не делать
} // иначе
} // if (key == CODED) {
else
{
// не CODED ----------------------
if (key == 'p') {
// Пауза
currentState = new statePause();
} else {
// ничего не делать
} // иначе
} // иначе не CODED
} // функция
void mousePressedState() {
// Игра
println("мышь 1");
}//функция
}//класс
// ===========================================================================================
class statePause implements StateInterface {
sun = loadImage("Sun.jpg");
mercury = loadImage("Mercury.jpg");
venus = loadImage("Venus.jpg");
earth = loadImage("Earth.jpg");
mars = loadImage("Mars.jpg");
jupiter = loadImage("Jupiter.jpg");
saturn = loadImage("Saturn.jpg");
uranus = loadImage("Uranus.jpg");
neptune = loadImage("Neptune.jpg");
p = 0;
fov = radians(70);
perspective(fov, float(width)/float(height), 1, 9999999);
cam = new PeasyCam(this, width/2, height/2, 0, 1000);
cam.setMinimumDistance(21);
planets = new ArrayList();
planets.add(new Planet("Солнце", 0, 0, 0, 0, 20, 333054, 255, 230, 0, 1, 1000, 0, sun));
planets.add(new Planet("Меркурий", 62.543, 7, 0, 0.205, 8, 0.055, 132, 132, 132, 45, 13, 10, mercury));
planets.add(new Planet("Венера", 145.763, 3.4, 177, 0.007, 12, 0.8149, 197, 133, 40, 50, 28, 5, venus));
planets.add(new Planet("Земля", 200, 0, 23.4, 0.017, 13, 1, 84, 101, 130, 50, 48, 0.1, earth));
planets.add(new Planet("Марс", 280.9, 1.9, 6.7, 0.094, 9, 0.1069, 183, 99, 72, 60, 76, 0.1, mars));
planets.add(new Planet("Юпитер", 1006.798, 1.3, 25.2, 0.049, 40, 317, 167, 161, 150, 80, 350, 0.05, jupiter));
planets.add(new Planet("Сатурн", 1839.02, 2.5, 3.1, 0.057, 32, 95, 208, 193, 163, 100, 700, 0.05, saturn));
planets.add(new Planet("Уран", 3727.1, 0.8, 26.7, 0.046, 60, 14, 155, 203, 210, 132, 1450, 0.07, uranus));
planets.add(new Planet("Нептун", 6042.8, 1.8, 97.8, 0.011, 70, 17, 45, 52, 132, 183, 2000, 0.08, neptune));
//planets.add(new Planet("Плутон", -5032.3589395, 0, 0, 0, -0.19226, 0, 15, 0.10699933, 250, 200, 50));
background(0);
for (int i = 0; i < steps; i++) {
pre(i);
}
}
void draw() {
background(0);
//pushMatrix();
//translate(width/2, height/2, 0);
//stroke(0, 0, 255);
//line(300, 0, 0, -100, 0, 0);
//stroke(0, 255, 0);
//line(0, 330, 0, -0, -100, 0);
//stroke(255, 0, 0);
//line(0, 0, 300, 0, 0, -100);
//popMatrix();
float dis = (float) cam.getDistance();
if (dis > 50000) dis = 50000;
if (dis < 21) dis = 21;
dis1 = map(dis, 21, 50000, 0, 255);
fov = radians(log1(dis1));
perspective(fov, float(width)/float(height), 1, 9999999);
pushMatrix();
float[] campos = cam.getPosition();
translate(campos[0], campos[1], campos[2]);
translate(-campos[0], -campos[1], -campos[2]);
popMatrix();
for (Planet planet1 : planets) {
planet1.grav(planet1, planets);
}
for (Planet planet1 : planets) {
planet1.updateVel();
}
Planet plan = planets.get(0);
Planet plan2 = planets.get(p);
//camera(width/2, /*(height/2)*/ + map(mouseY, 0, height, -1000, 1000), 1000, width/2, height/2, 0, 0, 0, 1);
pushMatrix();
translate((width/2) - plan2.pos.x, (height/2) - plan2.pos.y, 0 - plan2.pos.z);
for (int i = 0; i < planets.size(); i++) {
Planet plan1 = planets.get(i);
if (i != 0) plan1.light(plan);
plan1.show();
}
popMatrix();
}
void pre(int i) {
for (Planet planet1 : planets) {
planet1.grav(planet1, planets);
}
for (Planet planet1 : planets) {
planet1.updateVel1(i);
}
}
float log1(float a) {
float a2 = 2100 / (30 + 70 * exp(0.021 * -a));
return a2;
}
void keyPressed() {
if (key == 'w'){
p++;
if (p > planets.size()-1) p = 0;
}
if (key == 's'){
p--;
if (p < 0) p = planets.size()-1;
}
}
class Planet {
PVector pos;
PVector vel;
PVector acc;
float radius;
float mass;
float r, g, b;
int mod;
PVector currVel;
String name;
ArrayList posStore;
float dis;
int traillength;
float rotation;
float rot;
float winkelPole;
float Grav = 0.0002;
PShape planet;
Planet(String name, float dis, float incl, float winkelPole, float ecc, float r, float m, float re, float g, float b, int traillength, int mod, float rot, PImage img) {
float vz;
if (dis != 0) vz = sqrt((Grav * 333054) / dis);
else vz = 0;
vz = vz * (1 + (ecc/2));
this.pos = new PVector(dis, 0, 0);
this.vel = new PVector(0, 0, vz);
this.pos.x = dis * cos(radians(incl));
this.pos.y = (dis * sin(radians(incl))) *-1;
float hyp = vz / cos(radians(incl));
this.vel.y = sin(radians(incl)) * hyp;
this.vel.setMag(vz*-1);
this.winkelPole = winkelPole;
this.rotation = rot;
this.mod = mod;
this.radius = r;
this.mass = /*PI * sq(r)*/ m;
this.r = re;
this.g = g;
this.b = b;
this.currVel = new PVector(this.vel.x, this.vel.y, this.vel.z);
this.name = name;
this.traillength = traillength;
this.posStore = new ArrayList(traillength);
for (int i = 0; i < traillength; i++) {
posStore.add(new PVector(this.pos.x, this.pos.y, this.pos.z));
}
planet = createShape(SPHERE, r);
planet.setTexture(img);
planet.setStroke(0);
}
void grav(Planet planet1, ArrayList planets) {
for (Planet planet2 : planets) {
if (planet1 == planet2) continue;
PVector forceDir = PVector.sub(planet2.pos, planet1.pos);
float d = forceDir.magSq();
forceDir.normalize();
PVector f = forceDir.mult(Grav * planet2.mass / d);
currVel = planet1.vel.add(f);
}
}
void updateVel() {
this.pos.add(this.currVel);
if (frameCount % mod == 0) posStore.add(0, new PVector(this.pos.x, this.pos.y, this.pos.z));
if ( posStore.size() > traillength) posStore.remove(traillength);
}
void updateVel1(int i) {
this.pos.add(this.currVel);
if (i % mod == 0) posStore.add(0, new PVector(this.pos.x, this.pos.y, this.pos.z));
if ( posStore.size() > traillength) posStore.remove(traillength);
}
void show() {
for (int i = 0; i < posStore.size()-2; i++) {
PVector p1 = posStore.get(i);
PVector p2 = posStore.get(i+1);
stroke(this.r, this.g, this.b);
line(p1.x, p1.y, p1.z, p2.x, p2.y, p2.z);
}
noStroke();
fill(r, g, b);
pushMatrix();
translate(pos.x, pos.y, pos.z);
if (rotation != 0) {
if (rot > 1000000) rot = 0;
rot = rot + (0.1 / rotation);
rotateX(radians(winkelPole));
rotateY(radians(rot));
}
//specular(r*1.5, g*1.5, b*1.5);
//shininess(5);
//emissive(r*0.2, g*0.2, b*0.2);
shape(planet);
popMatrix();
}
void light(Planet plan) {
lightSpecular(0, 0, 0);
pointLight(120, 120, 110, plan.pos.x, plan.pos.y, plan.pos.z);
}
}
}
interface StateInterface {
// Давайте абстрагируем
// Давайте абстрагируем display()
void showState();
void keyPressedState();
void mousePressedState();
}
//
Что является причиной множества ошибок, и это не сработало. Поэтому я хотел бы узнать, как связать файлы вместе в среде Processing IDE.
Вот ссылка на изображения планет:
Ответ или решение
Чтобы связать два файла вместе в Processing IDE и решить проблему с вашим проектом солнечной системы, вы можете использовать объектно-ориентированный подход, который уже присутствует в вашем коде. Ниже приведены рекомендации по корректному объединению вашего кода и реализации системы состояний для переключения между главным экраном и моделью солнечной системы.
1. Определение структуры классов
В вашем коде присутствуют два основных класса — StateHome
и statePause
. Я рекомендую изменить название statePause
на более подходящее, например, StateSolarSystem
, чтобы лучше отражать его предназначение.
2. Перенос кода солнечной системы
Перенесите код и методы, относящиеся к солнечной системе, в класс StateSolarSystem
, следуя структуре вашего текущего проекта.
3. Подключение нужных файлов
Обратите внимание, что в Processing IDE вы можете создавать несколько файлов, каждый из которых должен содержать классы или функции, соответствующие вашему проекту. Чтобы подготовить подключение изображений планет, вы можете загрузить их в папку проекта и обращаться к ним в нужных классах.
4. Обновленный код
Ниже приведён упрощённый вариант вашего кода с учётом вышеуказанных изменений:
import peasy.*;
PeasyCam cam;
ArrayList<Planet> planets;
PImage[] planetImages = new PImage[8];
StateInterface currentState;
void setup() {
fullScreen(OPENGL);
// Инициализируем текущее состояние
currentState = new StateHome();
}
void draw() {
currentState.showState();
}
void keyPressed() {
currentState.keyPressedState();
}
void mousePressed() {
currentState.mousePressedState();
}
// Главный экран
class StateHome implements StateInterface {
void showState() {
background(11);
fill(244, 3, 3);
text("Добро пожаловать в Генератор Солнечной Системы", 850, 100);
noStroke();
fill(255, 2, 2);
rect(100, 100, 100, 100);
if (mouseX > 100 && mouseX < 200 && mouseY > 100 && mouseY < 200) {
println("Кликнут красный квадрат, переходим к солнечной системе");
currentState = new StateSolarSystem();
}
}
void keyPressedState() {
// Обработка клавиатуры на главном экране
}
void mousePressedState() {
// Обработка мыши на главном экране
}
}
// Состояние солнечной системы
class StateSolarSystem implements StateInterface {
void setupSolarSystem() {
// Загрузка изображений
planetImages[0] = loadImage("Sun.jpg");
planetImages[1] = loadImage("Mercury.jpg");
planetImages[2] = loadImage("Venus.jpg");
// загружаем остальные планеты...
cam = new PeasyCam(this, 0, 0, 1000);
planets = new ArrayList<Planet>();
planets.add(new Planet("Солнце", planetImages[0]));
// Добавляем другие планеты...
}
void showState() {
if (planets == null) {
setupSolarSystem();
}
background(0);
// Логика отображения солнечной системы
for (Planet planet : planets) {
planet.show();
}
}
void keyPressedState() {
// Обработка клавиатуры в солнечной системе
}
void mousePressedState() {
// Обработка мыши в солнечной системе
}
}
// Интерфейс состояний
interface StateInterface {
void showState();
void keyPressedState();
void mousePressedState();
}
// Класс для планет
class Planet {
PImage img;
Planet(String name, PImage img) {
this.img = img;
// Дополнительные свойства и инициализация
}
void show() {
// Логика отрисовки планеты
// например:
pushMatrix();
// трансформации...
image(img, 0, 0); // просто пример, нужно применить правильные трансформации
popMatrix();
}
}
5. Что следует учитывать
- Организация файлов: Убедитесь, что все необходимые изображения находятся в папке проекта для корректной загрузки. Например, поместите файлы изображений в папку
data
. - Логика взаимодействия: Убедитесь, что логика перехода между состояниями работает корректно и что текстуры планет загружаются без ошибок.
- Тестирование: После объединения файлов проведите тестирование, чтобы убедиться, что переходы между состояниями работают как ожидается.
Если у вас возникнут дополнительные проблемы, не стесняйтесь задавать вопросы!