Allegro 5 , masked_blit i wskaźnik

0

Witam!

Jestem nowym użytkownikiem i to mój pierwszy post;)
Nie znalazłem nigdzie podobnego problemu.
Piszę prostą aplikację w Dev-C++ , biblioteka Allegro.

Napotkałem na problem.
Mam kod:

class cSnake
{
	//Klasa odpowiedzialna za stworzenie i zniszczenie poszczegolnych elementów węża
	public:
		int x, y;    //współrzędne pojedyńczej bitmapy/elementu węża
		BITMAP* waz;  // bitmapa odpowiadająca elementowi węża
	    cSnake()  //konstruktor który tworzy kolejny element
		{
			waz = load_bmp( "waz.bmp", default_palette );		//ładowanie obrazka do bitmapy
			if( !waz )						//sprawdzenie czy obrazek został poprawnie załadowany
			{
    			set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
   	 			allegro_message( "Nie można załadować obrazka waz.bmp !" );
    			allegro_exit();	
			}		
		}	
		~cSnake()		//destruktor zwalniający pamieć zajętą przez bitmapę waz
		{
			destroy_bitmap(waz);  // niszczenie bitmapy waz
			allegro_message("Destruktor został wywołany");	
		}		
	
};
cSnake stworz(cSnake* wsk, int x, int y, BITMAP* bufor)
{
	wsk = new cSnake;
	masked_blit( *wsk.waz, bufor, 0, 0, x, y , *wsk.waz->w, *wsk.waz->h);		
	
} 

Kompilator zwraca mi błąd
[Error] request for member 'waz' in 'wsk', which is of non-class type 'cSnake*'

Proszę o pomoc.
Pozdrawiam.

0

wypadalo by cos zwrocic :)

0

w ogóle troche(bardzo) dziwnie to robisz. Czemu nie zrobic metody create w srodku klasy?.

I zmien IDE na Visual Studio(Pokazuje co jest zle itp).

0

Błąd dotyczy tej linijki:
masked_blit( *wsk.waz, bufor, 0, 0, x, y , *wsk.waz->w, *wsk.waz->h);

Dodanie zwrócenia nie pomogło...
Konkretnie chodzi o paramenty z *wsk czyli 1,7 i 8.

W Visual Studio nie da rady bo po dodaniu biblioteki nic nie działa tzn. nie działają najprostsze funkcje biblioteki allegro np. allegro_init(); , choć nie zgłasza błędu przy nagłówku #include <allegro.h>
Tu składnia masked_bilt:
http://cpp0x.pl/dokumentacja/Allegro-4-4/masked_blit/529

Żeby nie było to są wycinki kodu.

0

Nikt NIE MA wątpliwości czego dotyczy błąd.
Problem w tym że nikt nie rozumie co chcesz tym kodem osiągnąć.
Czym jest ta klasa cSnake? Pojedynczym ogniwem węża ? To po kiego ładujesz dla każdego ogniwa osobną bitmapę z dysku?
W tej funkcji absolutnie nie jasne po kiego przekazujesz wskaźnik do cSnake jeżeli pamięć pod niego przydzielasz w funkcji, na zewnątrz nie zwracasz i nie zwalniasz, gwarantowany wyciek pamięci.

Dla snake najlepiej zrobić:
class Field { BITMAP *bmp; Field *next,*prev; };
class List { Field *head,*tail; };
class Game { BITMAP *bmpsnake,*bmpfree,*bmpfeed; Field Tb[Rows][Cols]; List Snake; List Free; List Feed; };
w konstruktorze Game:

  • ładujesz bitmapy;
  • łączysz wszystkie pola w listę Free;
  • podpinasz Tb[y][x].bmp=bmpfree;
  • losujesz pozycje węza i to pole odpinasz od listy Free, podpinasz pod listę Snake, podmieniasz wskaźnik na bitmapę;
  • losujesz kilka pozycji pokarmu, odpinasz je od listy Free, podpinasz pod listę Feed, podmieniasz wskaźnik na bitmapę;

Dalej to chyba jasne.

0

Dzięki za wskazówki jak to powinno wyglądać. Ja wymyśliłem swój algorytm i zobaczymy jak to wypali.

"To po kiego ładujesz dla każdego ogniwa osobną bitmapę z dysku?"
A Ty jak byś to rozwiązał? Przekazywać bitmapę do konstruktora?

0
Krychu710 napisał(a):

*wsk.waz
Operator . ma wyższy priorytet niż * dlatego powinieneś użyć nawiasu:

(*waz).wsk

idąc dalej, zapis ten można uprościć do formy:wsk->waz

jest to dokładnie to samo.


 > ##### [Krychu710 napisał(a)](http://4programmers.net/Forum/856815):
> cSnake stworz(cSnake* wsk, int x, int y, BITMAP* bufor)
> {
>         wsk = new cSnake;
>         ...

Funkcja `stworz` nie powinna przyjmować parametru `wsk` bo i po co? Ona powinna **zwracać** wskaźnik
```cpp
cSnake *stworz(int x, int y, BITMAP* bufor)
{
        cSnake *wsk = new cSnake;
        // ...
        return wsk;
}
0

Błąd już naprawiony.
Dzięki koledzy za zainteresowanie i odpowiedzi.
Temat do zamknięcia

1 użytkowników online, w tym zalogowanych: 0, gości: 1