#c #arrays #opengl #object
#c #массивы #opengl #объект
Вопрос:
Редактировать:
Я все еще не получаю правильное положение, все шары рисуются в начале координат, я думаю, что, возможно, я размещаю объекты в неправильных местах…
Ball.cpp
#include "Ball.h"
#include "Vector2f.h"
#include "Vector3f.h"
#include "Glut/glut.h"
#include "GL/gl.h"
#include "GL/glu.h"
Ball::Ball(void)
{
Vector3f Temp_position;
position = Temp_position;
Vector3f Temp_velocity;
velocity = Temp_velocity;
}
Ball::~Ball(void)
{
}
void Ball::SetPos(Vector3f New_position)
{
position = New_position;
}
void Ball::Draw()
{
glPushMatrix();
glTranslatef(position.X(), position.Y(), position.Z());
glColor3d(1, 0, 0);
glutSolidSphere(0.3, 50, 50);
glPopMatrix();
}
void Ball::ArrayPosition()
{
Ball *Yellowball = new Ball[8];
Yellowball[0].SetPos(Vector3f (position.X(), position.Y(), position.Z()));
Yellowball[1].SetPos(Vector3f (position.X(), position.Y(), position.Z()));
Yellowball[2].SetPos(Vector3f (position.X(), position.Y(), position.Z()));
Yellowball[3].SetPos(Vector3f (position.X(), position.Y(), position.Z()));
Yellowball[4].SetPos(Vector3f (position.X(), position.Y(), position.Z()));
Yellowball[5].SetPos(Vector3f (position.X(), position.Y(), position.Z()));
Yellowball[6].SetPos(Vector3f (position.X(), position.Y(), position.Z()));
Yellowball[7].SetPos(Vector3f (position.X(), position.Y(), position.Z()));
}
void Ball::DrawYellow()
{
glPushMatrix();
glColor3f(2,1,0);
glutSolidSphere(0.3, 50, 50);
glPopMatrix();
}
void Ball::SetVel(Vector3f New_velocity)
{
velocity = New_velocity;
}
Vector3f Ball::GetPos()
{
Vector3f temp;
temp = position;
return temp;
}
Vector3f Ball::GetVel()
{
Vector3f temp;
temp = velocity;
return temp;
}
Main.cpp
Ball Redball;
float BALL_RED_START = 0;
float RADIUS_OF_BALL = 0.3;
float BALL_RED_END = 8;
Ball Yellowball;
float BALL_YELLOW_START = 0;
float BALL_YELLOW_END = 8;
init()
Ball *Yellowball = new Ball[8];
for(int i = BALL_YELLOW_START; i < BALL_YELLOW_START; i )
{
Yellowball[0].SetPos(Vector3f (1,0,0));
Yellowball[1].SetPos(Vector3f (0,0,0));
Yellowball[2].SetPos(Vector3f (0,0,0));
Yellowball[3].SetPos(Vector3f (0,0,0));
Yellowball[4].SetPos(Vector3f (0,0,0));
Yellowball[5].SetPos(Vector3f (0,0,0));
Yellowball[6].SetPos(Vector3f (0,0,0));
Yellowball[7].SetPos(Vector3f (0,0,0));
}
Draw method:
Ball Yellowball[8];
for (int i = BALL_YELLOW_START; i<BALL_YELLOW_END;i )
{
glColor3f(2,1,0);
Yellowball[i].DrawYellow();
}
glPopMatrix();
Результатом является то, что при рисовании массива в начале координат все шары оказываются в одном и том же месте!
Комментарии:
1. По какой-либо причине вы не можете указать текущую позицию x, y, z (перевод) для каждого из ваших массивов?
2. это то, чего я бы хотел! Я просто не уверен, как!
3. Для начала добавьте три строки в свой класс Ball для хранения значений x, y и z int. Затем вы можете присвоить этим значениям некоторое начальное значение в вашей программе. В приведенном выше цикле используйте эти 3 значения в вашем вызове glTranslate (например, glTranslate( Yellowball[i].x, Yellowball[i].y, Yellowball [i].z ); )
4. x, y, z должны быть частными и должны быть заданы в конструкторе, а затем вызов glTranslate должен быть выполнен в методе Ball::Draw. Если вы хотите, по крайней мере, хороший дизайн. Смотрите мое решение ниже.
Ответ №1:
Сделайте что-то вроде этого:
// first of all, include the x,y position (assuming 2D, since pool) in the Ball object:
class Ball
{
//...
private:
int xpos, ypos;
//...
};
Затем, когда вы создадите массив шаров, вместо того, чтобы просто создавать 8 шаров, вам захочется выделить память в куче, чтобы ее хватило на всю вашу игру. Итак, сделайте это:
Ball *YellowBall[8];
YellowBall[0] = new Ball(x0,y0);
YellowBall[1] = new Ball(x1,y1);
YellowBall[2] = new Ball(x2,y2);
YellowBall[3] = new Ball(x3,y3);
// ...
Убедитесь, что, когда ваша игра закончится, вы уберете за собой.
for (int i = 0; i < 8; i )
delete YellowBall[i];
Затем в вашем Ball::DrawYellow() сделайте что-то вроде этого:
Ball::DrawYellow()
{
glColor3f(/*yellow*/); // Set the color to yellow
glTranslatef(-x, -y, 0); // Move to the position of the ball
// Draw the ball
glTranslatef(x, y, 0); // Move back to the default position
}
Вероятно, отсюда потребуется немного подправить, но имеет ли это смысл / отвечает ли на ваш вопрос?
Комментарии:
1. Я думаю, что добавление пары glPushMatrix / glPopMatrix было неплохой идеей.
2. Да, это имеет смысл! Я попробую и посмотрю, что получится, спасибо!
3. Верно, все еще имея несколько проблем, я отредактировал свой пост с тем, что у меня есть 🙂