Im having problems understanding headers, my background is in java programming so im not used to having to create header files and i dont really understand their use. Here are two classes ive put together but i dont know if i should use a header or how to put them together using headers or not.
At the moment the cannonrun class compiles with an error as i attempt to create an instance of the other class. Ive made an attempt to create a header file but obviously its not correct. Do i need a header to link them? is it recommended and what missing?
The cannonrun class creates a window and positions a cannon ball in the center when a key is pushed it should create an instance of the cannon class and then evolve the instance to move the cannon ball along a path. (should but doesnt at the moment due to failed header).
cannon.cpp
Code:
#include "cannon.h"
#include <windows.h>
#include <iostream.h>
#include <math.h>
#include <glut.h>
float myrand(){return((1.0*rand())/RAND_MAX);}
class cannon
{
public:
float getx();
float gety();
float getz();
float getvx();
float getvy();
float getvz();
cannon(float ,float, float);
void evolve(float t);
private:float x,y,z,vx,vy,vz,time;
static float g,c_o_r;
};
float cannon::g=0.1;
float cannon::c_o_r=0.5;
float cannon::getx(){ return x; }
float cannon::gety(){ return y; }
float cannon::getz(){ return z; }
float cannon::getvx(){ return vx; }
float cannon::getvy(){ return vy; }
float cannon::getvz(){ return vz; }
cannon::cannon(float anglex, float anglez, float mag )
{
x=0,y=0,z=0, time=0;
vz = mag*cos((3.14/2)-anglez);
vx = cos(anglez)*cos(anglex);
vy = mag * cos(anglez)*sin(anglex);
}
void cannon::evolve(float delta)
{
time+=delta;
y+=vy*delta;
x+=vx*delta;
z+=vz*delta;
cout << "x= " << x << " y= " << y << " z = " << z << "\n";
cout << "vx= " << vx << "vy= " << vy << " vz = " << vz << "\n";
vz+=-g*delta;
if(z<0)
{
vz=-1*c_o_r; // bounce
z=.001; // make sure ball is above ground
}
}
cannonrun.cpp
Code:
#include "cannon.h"
#include <windows.h>
#include <iostream.h>
#include <math.h>
#include <stdlib.h>
#include <glut.h>
float angle1=3.0f;
float angle2=0.0f;
double mag=0;
double move=0;
char length[20];
double rotateangle=0;
double rotateangle1=0;
double rotateangle2=0;
void init(void)
{
glEnable(GL_DEPTH_TEST);
glClearColor(0.0f,0.0f,0.0f,0.5f);
}
void cannonBall(double x,double y,double z)
{
glTranslatef(x,y,z);
glColor3f(0.3,0.3,0.3);
glutSolidSphere(0.1,20,20);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glRotatef(rotateangle,0,1,0);
glRotatef(rotateangle1,1,0,0);
glRotatef(rotateangle2,0,0,1);
//Draw Ball
cannonBall(0.0,0.0,move);
//glLoadIdentity();
//glEnd();
glFlush();
glutSwapBuffers();
}
void fire()
{
while(true)
{
float angle1=0;
float angle2=0;
float mag=0;
cannon * cball = new cannon(angle1,angle2,mag);
float time =0;
float delta=0.01;
int f =3;
while(f < 6)
{
//gball->evolve(delta);
}
}
}
void anim()
{
display();
}
void keyboard( unsigned char key, int x, int y)
{
char c='#';
switch(key)
{
case('s'):
angle1+=5; if(angle1>180)angle1=180;
break;
case('a'):
angle1-=5; if(angle1<0)angle1=0;
break;
case('w'):
angle2+=5; if(angle2>90)angle2=90;
break;
case('x'):
angle2-=5; if(angle2<0)angle2=0;
break;
case('o'):
mag+=0.1;
break;
case('p'):
mag+=-0.1; if(mag<0)mag=0;
break;
case('m'):
move=move+0.1;
break;
case('n'):
move=move-0.1;
break;
case('u'):
rotateangle=rotateangle-5;
break;
case('t'):
rotateangle1=rotateangle1-5;
break;
case('y'):
rotateangle2=rotateangle2-5;
break;
}
glutPostRedisplay();
}
void reshape(int w, int h)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(0, 1.0, 0.1, 40);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main( int argc, char * argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
glutInitWindowSize (600,600);
glutCreateWindow(argv[0]);
init();
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutDisplayFunc(display);
//glutIdleFunc(anim);
glutMainLoop();
return 0;
}
cannon.h
Code:
#include <windows.h>
#include <iostream.h>
#include <math.h>
#include <stdlib.h>
#include <glut.h>
#ifndef CANNON_H
#define CANNON_H
cannon(float anglex, float anglez, float mag );
#endif
Apologies for the massive amount of code posted but im really stuck on this header problem and ive tried looking in books for solutions but i need a practical one in order to help me. Many thanks.
--- Please note i have used glut libraries just comment out the lines of code with glut reference if u do not have it installed