daemon777
Lt. Commander
- Registriert
- Dez. 2003
- Beiträge
- 1.371
Hi,
Ich hab mal wieder ein Problem. Diesmal ein etwas komplizierteres würde ich mal sagen. Und zwar geht es um DirectDraw in Directx. Ich habe ein paar texturen im Format 64*64 und möchte die auf den Bildschirm zaubern. Zu erst habe ich das einfach so gemacht dass ich so viele von einer Textur auf den Bildschirm knalle wie es geht. Allerdings möchte ich nun eine Art Karte wie in einem Computerspiel erstellen.
Also der Player hat zB am anfang die Position 0. Der Player befindet sich immer in der Bildschirm Mitte. Also werden die ersten 10 Bilder der Karte dargestellt. Wenn der Player allerdings dann weitergeht sollen die Bilder 2-11 gezeichnet werden. Allerdings funktioniert das nicht so ganz.
Ich denke mal dass ich irgendwo ein Logikproblem drinn habe.
Ich habe die Karte in verschiedene Tiles aufgeteilt. Ein Tile entspricht einem begehbaren Bereich für den Player und einer Textur. Hier ist die Definition eines Tiles:
Dann habe ich eine Karte erstellt die diese Tiles in eine Map lädt:
Dann ist noch die Player klasse wichtig. Ist zum glück bisher relativ kurz:
Das sind die wichtigen Klassen und Strukturen des Programms. Jetzt kommen noch die wichtigen Teile des Hauptprogramms:
Nun das wars. Ich kann leider nicht den Fehler finden. Ich bekomme keine Fehlermeldung oder so aber es ändert sich eifnach nicht wenn cih auf die entsprechende taste drücke. Ich hatte mal eine Message Box unter IDM_RIGHT eingefügt und dieser Part wurde auch aufgerufen aber dennoch hat sich das Bild aufm Bildschirm sich nicht geändert. WM_PAINT wurde danach auch aufgerufen allerdings ist irgendwie nichts passiert.
Ich weiß das ist jetzt ziemilch viel Code aber ich weiß einfach nicht mehr weiter.
Vielleicht kann mir ja doch jemand helfen. Jedenfalls schonmal danke auch wenns eventuell nur fürs durchlesen ist.
Ich hab mal wieder ein Problem. Diesmal ein etwas komplizierteres würde ich mal sagen. Und zwar geht es um DirectDraw in Directx. Ich habe ein paar texturen im Format 64*64 und möchte die auf den Bildschirm zaubern. Zu erst habe ich das einfach so gemacht dass ich so viele von einer Textur auf den Bildschirm knalle wie es geht. Allerdings möchte ich nun eine Art Karte wie in einem Computerspiel erstellen.
Also der Player hat zB am anfang die Position 0. Der Player befindet sich immer in der Bildschirm Mitte. Also werden die ersten 10 Bilder der Karte dargestellt. Wenn der Player allerdings dann weitergeht sollen die Bilder 2-11 gezeichnet werden. Allerdings funktioniert das nicht so ganz.
Ich denke mal dass ich irgendwo ein Logikproblem drinn habe.
Ich habe die Karte in verschiedene Tiles aufgeteilt. Ein Tile entspricht einem begehbaren Bereich für den Player und einer Textur. Hier ist die Definition eines Tiles:
Code:
Tiles
# define chess 0
# define star 1
class tile
{
public:
int texture;
int walkable;
int isaktion;
int aktion;
tile();
tile(int mtexture,int mwalkable,int misaktion,int maktion);
};
tile::tile()
{
texture=chess;
walkable=1;
isaktion=0;
}
tile::tile(int mtexture,int mwalkable,int misaktion,int maktion)
{
texture=mtexture;
walkable=mwalkable;
isaktion=misaktion;
aktion=maktion;
}
Dann habe ich eine Karte erstellt die diese Tiles in eine Map lädt:
Code:
DIe Karte
class lvl1
{
//map level1;
public:
int sizex;
int sizey;
tile alletiles[/*sizex*/32][/*sizey*/20];
lvl1();
~lvl1();
};
lvl1::lvl1()
{
for(int y=0;y<20;y++)
{
for(int x=0;x<32;x++)
{
alletiles[x][y].texture=chess;
alletiles[x][y].walkable=1;
alletiles[x][y].isaktion=0;
alletiles[x][y].aktion=0;
}
}
alletiles[16][5].texture=star;
alletiles[16][5].texture=star;
alletiles[16][5].texture=star;
alletiles[16][5].texture=star;
alletiles[16][5].texture=star;
}
lvl1::~lvl1()
{
}
Dann ist noch die Player klasse wichtig. Ist zum glück bisher relativ kurz:
Code:
Player
class player
{
private:
int relxpos;
int relypos;
public:
player();
int getrelxpos(){return relxpos;}
int getrelypos(){return relypos;}
void setrelxpos(){relxpos++;}
void setrelypos(){relypos++;}
};
player::player()
{
relxpos=0;
relypos=0;
}
Das sind die wichtigen Klassen und Strukturen des Programms. Jetzt kommen noch die wichtigen Teile des Hauptprogramms:
Code:
main
//includes und andere unwichtige definitionen
tile sichtfeld[16][12];
tile aktlvl[3000][3000];
player dplayer;
lvl1 mlvl1;
int getmap()
{
if(anzahl_levels<=level)
{
return 2;
}
switch(level)
{
case 1:
for(int x=0;x<32;x++)
{
for(int y=0;y<20;y++)
{
aktlvl[x][y]=mlvl1.alletiles[x][y];
}
}
aktx=32;
akty=16;
}
level++;
return 1;
}
int getkartenausschnitt()
{
for(int x=0;x<aktx && x<15;x++)
{
for(int y=0; y<akty && y<11;y++)
{
sichtfeld[x][y]=aktlvl[x+dplayer.getrelxpos()][y+dplayer.getrelypos()];
}
}
return 1;
}
//in einer Klasse namens Display steht nun folgendes:
void hintergrund(){dsply.Blt(0,0,hgrnd);}
void tex(int px,int py){dsply.Blt(px*64,py*64,mtex);}
void check(int px, int py){dsply.Blt(px*64,py*64,mcheck);}
void player(){dsply.Blt(rpggame_nettobreite/2-32,rpggame_nettohoehe/2-32,mplayer);}
//Im Callback Handler sind denke ich mal WM_PAINT und IDM_RIGHT wichtig
//IDM_Right wird aufgerufen wenn die entrpechende taste gedrückt wird
case IDM_RIGHT:
dplayer.setrelxpos();
dplayer.setrelypos();
PostMessage(hWnd,WM_PAINT,0,0);
case WM_PAINT:
getkartenausschnitt();
rpggame_display.hintergrund();
for(int ypos=0;ypos<12;ypos++)
{
for(int xpos=0;xpos<15;xpos++)
{
if(sichtfeld[xpos][ypos].texture==chess)
{
rpggame_display.check(xpos,ypos);
}
else
rpggame_display.tex(xpos,ypos);
}
}
rpggame_display.player();
rpggame_display.present();
}
Nun das wars. Ich kann leider nicht den Fehler finden. Ich bekomme keine Fehlermeldung oder so aber es ändert sich eifnach nicht wenn cih auf die entsprechende taste drücke. Ich hatte mal eine Message Box unter IDM_RIGHT eingefügt und dieser Part wurde auch aufgerufen aber dennoch hat sich das Bild aufm Bildschirm sich nicht geändert. WM_PAINT wurde danach auch aufgerufen allerdings ist irgendwie nichts passiert.
Ich weiß das ist jetzt ziemilch viel Code aber ich weiß einfach nicht mehr weiter.
Vielleicht kann mir ja doch jemand helfen. Jedenfalls schonmal danke auch wenns eventuell nur fürs durchlesen ist.