Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Błąd kompilacji po dodaniu nowej klasy do programu

Ostatnio zmodyfikowano 2016-09-08 13:47
Autor Wiadomość
Cragmite
Temat założony przez niniejszego użytkownika
Błąd kompilacji po dodaniu nowej klasy do programu
» 2016-09-08 13:47:08
Witam,

Zabieram się za pisanie prostej gry w OpenGL z wykorzystaniem freeglut, jednak mam problem z zaimplementowaniem klasy odpowiedzialnej za symulację prostych zjawisk fizycznych. Główny plik Source.cpp kompilował się bezbłędnie, jednakże po dołączeniu klasy Fizyka z oddzielnych plików .cpp i .h wysypuje mi kilka błędów C2535 i C1075, których przyczyny nie mogę za nic w świecie znaleźć.


Plik Source.cpp:

C/C++
#include <GL/freeglut.h>
#include "Fizykaa.h"

int wys = 600;
int szer = 800;
void display();
void resize( int width, int height );
void keyboard( unsigned char key, int x, int y );

int main( int argc, char * argv[] )
{
    glutInit( & argc, argv );
    glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
    glutInitWindowPosition( 10, 10 );
    glutInitWindowSize( szer, wys );
    glutCreateWindow( "Arkanoid" );
    glClearColor( 1, 1, 1, 1 );
   
    glutDisplayFunc( display );
    glutReshapeFunc( resize );
    glutKeyboardFunc( keyboard );
   
    glutMainLoop();
    return 0;
}

void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    //rysowanie
    glutSwapBuffers();
}

void resize( int width, int height )
{
    const float ar =( float ) width /( float ) height;
   
    glViewport( 0, 0, width, height );
   
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    glFrustum( - ar, ar, - 1.0, 1.0, 2.0, 100.0 );
    gluLookAt( 0, 0, 5, 0, 0, 0, 0, 1, 0 );
   
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
   
    wys = height;
    szer = width;
    cout << endl;
}

void keyboard( unsigned char key, int x, int y )
{
    if( key == 27 )
         exit( 0 );
   
    glutPostRedisplay();
}


Plik Fizykaa.cpp:

C/C++
#include "Fizykaa.h"

Fizyka::Fizyka()
{
    //obiekt staly
    m_g = 0.0;
    m_alfa_g = 0.0;
    m_v = 0.0;
    m_alfa_v = 0.0;
   
    //ustawia domyslna obwiednie obiektu
    m_granica.xa = - 1.0;
    m_granica.ya = - 1.0;
    m_granica.xb = 1.0;
    m_granica.yb = 1.0;
    Reset();
}

void Fizyka::Odbicie( float alfa_n ) //odbicie od sciany charakteryzowanej za pomoca normalnej alfa_n
{
    //prawo odbicia "kat padania rowny katowi odbicia (pod warunkiem, ze obiekt wnika do wnetrza)
    if( fabs( alfa_n - m_alfa_v ) > 90.0 )
         m_alfa_v = alfa_n -( 180.0 + m_alfa_v - alfa_n );
   
}

void Fizyka::Aktualizuj( int czas_aktualny ) //zmienia polozenie obiektu na podstawie aktualnego czasu
{
    float delta_t =( czas_aktualny - m_czas ) / 2500;
    double v_x, v_y;
    v_x = m_v * cos( m_alfa_v / 180.0 * PI );
    v_y = m_v * sin( m_alfa_v / 180.0 * PI );
    m_x = m_x + v_x * delta_t + 0.5 * m_g * cos( m_alfa_g / 180.0 * PI ) * delta_t * delta_t;
    m_y = m_y + v_y * delta_t + 0.5 * m_g * sin( m_alfa_g / 180.0 * PI ) * delta_t * delta_t;
   
    //aktualizacja predkosci
    v_x = v_x + m_g * cos( m_alfa_g / 180.0 * PI ) * delta_t;
    v_y = v_y + m_g * sin( m_alfa_g / 180.0 * PI ) * delta_t;
    //wypadkowa predkosc
    m_v = sqrt( v_x * v_x + v_y * v_y );
    //kierunek predkosci
    m_alfa_v = atan2( v_y, v_x ) * 180.0 / PI;
    m_czas += delta_t;
}

int Fizyka::Kolizja( const Fizyka & X ) //wykrywanie kolizji z innym obiektem (funkcja przekazuje 1 gdy jest kolizja 0 gdy brak)
{
    //jesli wystepuje kolizja to przynajmniej jeden z wierzcholkow musi zawierac sie wewnatrz
   
    //sprawdzenie czy ktorys z wierzcholkow obiektu nie zawiera sie w obiekcie sprawdzanym
   
    int kolizja = 0;
    if( WProstokacie( m_x + m_granica.xa, m_y + m_granica.ya, X ) == 1 ) kolizja = 1;
    else if( WProstokacie( m_x + m_granica.xa, m_y + m_granica.yb, X ) == 1 ) kolizja = 1;
    else if( WProstokacie( m_x + m_granica.xb, m_y + m_granica.yb, X ) == 1 ) kolizja = 1;
    else if( WProstokacie( m_x + m_granica.xb, m_y + m_granica.ya, X ) == 1 ) kolizja = 1;
    //odworcenie sprawdzania
    else if( WProstokacie( X.m_x + X.m_granica.xa, X.m_y + X.m_granica.ya, * this ) == 1 )
         kolizja = 1;
    else if( WProstokacie( X.m_x + X.m_granica.xa, X.m_y + X.m_granica.yb, * this ) == 1 )
         kolizja = 1;
    else if( WProstokacie( X.m_x + X.m_granica.xb, X.m_y + X.m_granica.yb, * this ) == 1 )
         kolizja = 1;
    else if( WProstokacie( X.m_x + X.m_granica.xb, X.m_y + X.m_granica.ya, * this ) == 1 )
         kolizja = 1;
    //obsluga kolizji
    if( kolizja )
    {
        //znalezienie boku od ktorego nastapi odbicie
        float alfa_n = ZnajdzNormalna( X );
        Odbicie( alfa_n );
    }
    return kolizja;
}


Plik Fizykaa.h:

C/C++
#ifndef FIZYKAA_H
#define FIZYKAA_H

#include <cmath>
#include <iostream>
using namespace std;

const double PI = 3.1415926536;

typedef struct sGranica
{
    float xa; //minimalna wartosc x
    float ya; //minimalna wartosc y
    float xb; //maskymalna wartosc x
    float yb; //maskymalna wartosc y
} sGranica; //granice okreslaja lewy dolny naroznik (xa,ya) i prawy górny (xb,yb)

class Fizyka
{
protected:
    int m_czas; //czas ostatniej aktualizacji
    sGranica m_granica; //granice obiektu
    float m_x, m_y; //polozenie srodka masy
    float m_v; //predkosc
    float m_alfa_v; //kierunek wektora predkosci w [stopniach]
    float m_g; //grawitacja
    float m_alfa_g; //kierunek wektora grawitacji
   
public:
    Fizyka();
    ~Fizyka();
    void Aktualizuj( int czas_aktualny ); //zmienia polozenie obiektu na podstawie aktualnego czasu
    void UstawPredkosc( float _v, float _m_alfa_v ); //ustawia poczatkowa predkosc
    void UstawFizyke( float _g, float _m_alfa_g ); //ustawia poczatkowe przyspieszenie
    void UstawGeometrie( float _x, float _y, float _xa, float _ya, float _xb, float _yb );
    virtual int Kolizja( const Fizyka & X ); //wykrywanie kolizji z innym obiektem (funkcja przekazuje 1 gdy jest kolizja 0 gdy brak)
    void Reset(); //resetuje czas
   
private:
    void Odbicie( float alfa_n ); //odbicie od sciany charakteryzowanej za pomoca normalnej alfa_n
    int WProstokacie( float _x, float _y, const Fizyka & X ); //wykrywa czy dany punkt(_x, _y) znajduje sie wewnatrz pewnego prostokąta
    float Odleglosc( float _x, float _y, float _xa, float _ya, float _xb, float _yb ); //wyznacza odleglosc od pewnej prostej przechodzacej przez 2 punkty
    virtual float ZnajdzNormalna( const Fizyka & X ); //znajduje normalna boku ktory jest najblizej srodka obiektu(wynikiem funkcji jest orientacja normalnej)
};

#endif


Log kompilacji:

1>------ Build started: Project: Arkanoid2, Configuration: Debug Win32 ------
1>  Source.cpp
1>c:\visual studio - pliki\arkanoid2\arkanoid2\source.cpp(28): error C2535: 'void Fizyka::display(void)' : member function already defined or declared
1>          c:\visual studio - pliki\arkanoid2\arkanoid2\source.cpp(6) : see declaration of 'Fizyka::display'
1>c:\visual studio - pliki\arkanoid2\arkanoid2\source.cpp(35): error C2535: 'void Fizyka::resize(int,int)' : member function already defined or declared
1>          c:\visual studio - pliki\arkanoid2\arkanoid2\source.cpp(7) : see declaration of 'Fizyka::resize'
1>c:\visual studio - pliki\arkanoid2\arkanoid2\source.cpp(54): error C2535: 'void Fizyka::keyboard(unsigned char,int,int)' : member function already defined or declared
1>          c:\visual studio - pliki\arkanoid2\arkanoid2\source.cpp(8) : see declaration of 'Fizyka::keyboard'
1>c:\visual studio - pliki\arkanoid2\arkanoid2\source.cpp(59): fatal error C1075: end of file found before the left brace '{' at 'c:\visual studio - pliki\arkanoid2\arkanoid2\fizykaa.h(19)' was matched
1>  Fizykaa.cpp
1>c:\visual studio - pliki\arkanoid2\arkanoid2\fizykaa.cpp(4): error C2535: 'Fizyka::Fizyka(void)' : member function already defined or declared
1>          c:\visual studio - pliki\arkanoid2\arkanoid2\fizykaa.h(30) : see declaration of 'Fizyka::Fizyka'
1>c:\visual studio - pliki\arkanoid2\arkanoid2\fizykaa.cpp(18): error C2535: 'void Fizyka::Odbicie(float)' : member function already defined or declared
1>          c:\visual studio - pliki\arkanoid2\arkanoid2\fizykaa.h(40) : see declaration of 'Fizyka::Odbicie'
1>c:\visual studio - pliki\arkanoid2\arkanoid2\fizykaa.cpp(25): error C2535: 'void Fizyka::Aktualizuj(int)' : member function already defined or declared
1>          c:\visual studio - pliki\arkanoid2\arkanoid2\fizykaa.h(32) : see declaration of 'Fizyka::Aktualizuj'
1>c:\visual studio - pliki\arkanoid2\arkanoid2\fizykaa.cpp(44): error C2535: 'int Fizyka::Kolizja(const Fizyka &)' : member function already defined or declared
1>          c:\visual studio - pliki\arkanoid2\arkanoid2\fizykaa.h(36) : see declaration of 'Fizyka::Kolizja'
1>c:\visual studio - pliki\arkanoid2\arkanoid2\fizykaa.cpp(72): fatal error C1075: end of file found before the left brace '{' at 'c:\visual studio - pliki\arkanoid2\arkanoid2\fizykaa.h(19)' was matched
1>  Generating Code...
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========


Mam nadzieję, że pomożecie mi znaleźć błąd, gdyż nie ukrywam, że utknąłem w martwym punkcie, a chciałbym jak najszybciej móc kontynuować pracę.

Pozdrawiam!


EDIT:

Problem został rozwiązany, ale chciałbym się jeszcze dowiedzieć jak - po ponownym uruchomieniu programu powitał mnie komunikat:
"The line endings in the following file are not consistent. Do you want to normalize the line endings?"
Po wyrażeniu zgody na normalizację błędy wspomniane przeze mnie wcześniej nie występują, ale dlaczego? Nie zauważyłem zmian w kodzie.
P-151549
« 1 »
  Strona 1 z 1