SeaMonster131 Temat założony przez niniejszego użytkownika |
[C++] Błędy z wieloma plikami w projekcie » 2011-03-03 16:56:52 Zacząłem sie uczyć Allegro 5.1. Ale raczej nie w tym rzecz. Mam kilka plików w projekcie i wyskakuje masa errorów.. A ja nie moge dojść jak poprawnie dołączyć te pliki :)
main.cpp
#include "main.h"
enum MYKEYS { KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT };
ALLEGRO_BITMAP * platforma = NULL; ALLEGRO_BITMAP * tlo = NULL;
int main( int argc, char ** argv ) { bool redraw = true; bool key[ 4 ] = { false, false, false, false }; Init(); CreateBall(); while( 1 ) { ALLEGRO_EVENT ev; al_wait_for_event( event_queue, & ev ); if( ev.type == ALLEGRO_EVENT_TIMER ) { MoveBall(); redraw = true; } else if( ev.type == ALLEGRO_EVENT_KEY_DOWN ) { switch( ev.keyboard.keycode ) { case ALLEGRO_KEY_UP: key[ KEY_UP ] = true; break; case ALLEGRO_KEY_DOWN: key[ KEY_DOWN ] = true; break; case ALLEGRO_KEY_LEFT: key[ KEY_LEFT ] = true; break; case ALLEGRO_KEY_RIGHT: key[ KEY_RIGHT ] = true; break; } } else if( ev.type == ALLEGRO_EVENT_KEY_UP ) { switch( ev.keyboard.keycode ) { case ALLEGRO_KEY_UP: key[ KEY_UP ] = false; break; case ALLEGRO_KEY_DOWN: key[ KEY_DOWN ] = false; break; case ALLEGRO_KEY_LEFT: key[ KEY_LEFT ] = false; break; case ALLEGRO_KEY_RIGHT: key[ KEY_RIGHT ] = false; break; case ALLEGRO_KEY_ESCAPE: break; } } else if( ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE ) { break; } else if( ev.type == ALLEGRO_EVENT_MOUSE_BUTTON_UP ) { break; } if( redraw && al_is_event_queue_empty( event_queue ) ) { redraw = false; al_clear_to_color( al_map_rgb( 0, 0, 0 ) ); DrawBall(); al_flip_display(); } } al_destroy_bitmap( bouncer ); al_destroy_timer( timer ); al_destroy_display( display ); al_destroy_event_queue( event_queue ); return 0; }
main.h
#ifndef MAIN_H_INCLUDED #define MAIN_H_INCLUDED
#include <stdio.h> #include <allegro5/allegro.h> #include "main.h" #include "pilka.h" #include "init.h"
#endif
init.h
#ifndef INIT_H_INCLUDED #define INIT_H_INCLUDED
#include "main.h"
extern const float FPS = 60;
ALLEGRO_DISPLAY * display = NULL; ALLEGRO_EVENT_QUEUE * event_queue = NULL; ALLEGRO_TIMER * timer = NULL;
void Init();
#endif
init.cpp
#include "init.h"
void Init() { al_init(); timer = al_create_timer( 1.0 / FPS ); display = al_create_display( SCREEN_W, SCREEN_H ); al_set_target_bitmap( al_get_backbuffer( display ) ); event_queue = al_create_event_queue(); al_register_event_source( event_queue, al_get_display_event_source( display ) ); al_register_event_source( event_queue, al_get_timer_event_source( timer ) ); al_install_mouse(); al_install_keyboard(); al_register_event_source( event_queue, al_get_mouse_event_source() ); al_register_event_source( event_queue, al_get_keyboard_event_source() ); al_clear_to_color( al_map_rgb( 0, 0, 0 ) ); al_flip_display(); al_start_timer( timer ); }
pilka.h
#ifndef PILKA_H_INCLUDED #define PILKA_H_INCLUDED
#include "main.h"
extern ALLEGRO_BITMAP * bouncer = NULL; const int BOUNCER_SIZE = 100;
float bouncer_x = SCREEN_W / 2.0 - BOUNCER_SIZE / 2.0; float bouncer_y = SCREEN_H / 2.0 - BOUNCER_SIZE / 2.0; float bouncer_dx = - 4.0, bouncer_dy = 4.0;
void CreateBall();
void MoveBall();
void DrawBall();
#endif
pilka.cpp
#include "pilka.h"
void CreateBall() { bouncer = al_create_bitmap( BOUNCER_SIZE, BOUNCER_SIZE ); al_set_target_bitmap( bouncer ); }
void MoveBall() { if( bouncer_x < 0 || bouncer_x > SCREEN_W - BOUNCER_SIZE ) { bouncer_dx = - bouncer_dx; } if( bouncer_y < 0 || bouncer_y > SCREEN_H - BOUNCER_SIZE ) { bouncer_dy = - bouncer_dy; } bouncer_x += bouncer_dx; bouncer_y += bouncer_dy; }
void DrawBall() { al_draw_bitmap( bouncer, bouncer_x, bouncer_y, 0 ); }
Prosiłbym o jakieś podpowiedzi czy coś, jak zaincludować poprawnie te pliki bo co nie zrobie to jest źle heh... :) |
|
DejaVu |
» 2011-03-03 17:02:10 |
|
SeaMonster131 Temat założony przez niniejszego użytkownika |
» 2011-03-03 17:13:35 Hmm...przeczytałem to już :) No więc mam tak: main.cpp: #include <stdio.h> #include <allegro5/allegro.h> #include "init.h" #include "pilka.h" init.h: #include <allegro5/allegro.h> init.cpp: #include "init.h" pilka.h: #include <allegro5/allegro.h> pilka.cpp: #include "pilka.h" A błędy mam np takie: C:\Documents and Settings\admin\Pulpit\all5 mini pr\pilka.cpp|4|multiple definition of `bouncer'
obj\Debug\main.o:C:\Documents and Settings\admin\Pulpit\all5 mini pr\main.cpp|16|first defined here| Przy czym 16 linijka w main.cpp to otworzenie klamry głównej funkcji... ;/ |
|
dmx81 |
» 2011-03-03 17:24:53 ogolnie to plik.h zawierac powinien wszystkie deklaracje (czyli jak cos wyglada)+potrzebne biblioteki(lub inne pliki .h), z ktorych w tych deklaracjach bedziesz korzystal a plik.cpp zawierac powinien dolaczony plik.h i definicje, czyli rozwiniecie deklaracji. np:
#ifndef PLIK_H #define PLIK_H
#include <string>
class C1 { public: std::string napis; void funkcja_pokaz(); };
#endif
#include "plik.h" #include <iostream> void C1::funkcja_pokaz() { std::cout << napis; }
#include <plik.h>
int main() C1 c; c.funkcja_pokaz; return 0; }
to tak mniej wiecej, mam nadzieje, ze bledow nie popelnilem, chodzilo glownie o przyklad |
|
dmx81 |
» 2011-03-03 17:29:41 pokaz, jak wygladaja teraz te 2 pliki - masz komunikat o wielokrotnej definicji (pewnie jedna ze zmiennych powinna byc jako extern - w pliku main)
|
|
SeaMonster131 Temat założony przez niniejszego użytkownika |
» 2011-03-03 17:38:09 |
|
dmx81 |
» 2011-03-03 18:11:10 ja bym sprobowal takiej zmiany: zmienne nie zamkniete w klasach (czyli u ciebie wszytskie bouncer itd) - jesli sa deklarowane i definiowane w jakims pliku - wypisz je jeszcze raz w pliku main ze slowkiem extern zanim ich uzyjesz, np
float bounce_x = 1;
extern float bounce_x; a pozniej juz normalnie uzywac. a kodu nie sprawdze, bo nie mam allegro 5
|
|
szyx_yankez |
» 2011-03-03 18:46:05 Kod w tej paczce się trochę różni niż ten forum, ale generalnie brakuje tam funkcij głównej programu.
Gdy do 'main.cpp' dodałem:
Wszystko kompiluje się poprawnie. |
|
« 1 » 2 |