C
Ich habe angefangen ein Moorhuhnspiel mit SDL zu proggen und habe nun einige Fragen bzw. Probleme.
Dies ist erst einmal der Quellcode(ich hoffe ich habe genug auskommentiert und kann mir die Funktionstätigkeit der einzelnen Codeabschnitte ersparen) :
#include <stdio.h>
#include <stdlib.h>
#include "stdafx.h"
#include <time.h>
#ifdef _WIN32
#undef main
#endif
#include <stdlib.h>
#include <stdio.h>
#include <Sdl/SDL.h>
int h=1;// gibt später die Nummer des Bildes an(in Animation)
int iMinTimes = 100; //Zeit für den Timer
class Sprite
{
public:
Sprite(SDL_Surface *new_image, int x, int y); //Konstruktor
//~Sprite();
void SetImage(SDL_Surface *new_image);
void SetPos(int x, int y);
void Move(int move_x, int move_y);
void Animation(void);
void klick(void);
SDL_Rect *GetRect(void);
void Draw(SDL_Surface *target);
protected:
SDL_Surface *image;
SDL_Rect rect;
};
Sprite::Sprite(SDL_Surface *new_image, int x, int y) //Konstruktor
{
SetImage(new_image);
SetPos(x, y);
}
void Sprite::SetImage(SDL_Surface *new_image)
{
image = new_image;
}
void Sprite::SetPos(int x, int y) //für die Position des Bildes
{
rect.x = x;
rect.y = y;
}
void Sprite::Move(int move_x, int move_y) //für die Bewegung
{
rect.x += move_x;
rect.y += move_y;
}
SDL_Rect *Sprite::GetRect(void)
{
return ▭
}
void Sprite::Draw(SDL_Surface *target)
{
SDL_BlitSurface(image, NULL, target, &rect);
}
void Sprite::Animation(void) //für das Wechseln der Moorhuhnbilder
{
if(h<=3) {h++;}
if(h>3) {h=1;}
}
void Sprite::klick(void) //für das schießen auf das Huhn
{
int mouseX, mouseY; //Variabeln der Mausposition
if(SDL_GetMouseState(&mouseX, &mouseY) &SDL_BUTTON(1) && rect.x + rect.w < mouseX) //Wenn linke Maustaste gedrückt wird
//und sich der Mauszeiger über dem Sprite befindet dann...
{
Move(0,40); //...bewegt sich das Huhn 40 Pixel
}
}
SDL_Surface *LoadBMP(const char *filename)//Umwandeln des Bildes
{
SDL_Surface *temp, *image;
temp = SDL_LoadBMP(filename);
image = SDL_DisplayFormat(temp);
SDL_FreeSurface(temp);
return image;
}
SDL_Surface *LoadBMP(const char *filename);
/////////////////////////////////////////////////////////////////////////
int main(int argc, char *argv[])
{
SDL_Surface *screen, *image[4], *back, *temps;
SDL_Rect dsts;
SDL_Event event;
Sprite *huhn[4][4]; //Vererbung der Sprite-Eigenschaften
bool done = false; //Solange done false ist läuft das Programm
bool z = false;
if(SDL_Init(SDL_INIT_VIDEO) == -1) //Initialisierung und Fehlerabrage
{
printf("Can't init SDL: %s\n", SDL_GetError());
exit(1);
}
atexit(SDL_Quit);
back = SDL_SetVideoMode(800, 600, 16, SDL_HWSURFACE | SDL_DOUBLEBUF);
SDL_FillRect(back, NULL, SDL_MapRGB(back->format, 0, 0, 255));
//back wird eine blaue Fläche zugewiesen
if(back == NULL)
{
printf("Can't set video mode: %s\n", SDL_GetError());
exit(1);
}
temps = SDL_LoadBMP("moorh.bmp");
screen = SDL_DisplayFormat(temps);
if(screen == NULL)
{
printf("Image konnte nicht geladen werden: %s\n", SDL_GetError());
exit(1);
}
SDL_FreeSurface(temps);
dsts.x = 0;
dsts.y = 0;
dsts.w = screen->w;
dsts.h = screen->h;
//////////////////////////////////////////////
image[0] = LoadBMP("huhn1.bmp");
image[1] = LoadBMP("huhn2.bmp");
image[2] = LoadBMP("huhn3.bmp");
SDL_SetColorKey(image[0], SDL_SRCCOLORKEY, SDL_MapRGB(image[0]->format, 0, 255, 0));
SDL_SetColorKey(image[1], SDL_SRCCOLORKEY, SDL_MapRGB(image[1]->format, 0, 255, 0));
SDL_SetColorKey(image[2], SDL_SRCCOLORKEY, SDL_MapRGB(image[2]->format, 0, 255, 0));
huhn[1][1] = new Sprite(image[0],0,50);
huhn[1][2] = new Sprite(image[1],0,50);
huhn[1][3] = new Sprite(image[2],0,50);//[Nummer des Huhns][Nummer des Bildes]
huhn[2][1] = new Sprite(image[0],0,200);
huhn[2][2] = new Sprite(image[1],0,200);
huhn[2][3] = new Sprite(image[2],0,200);
SDL_BlitSurface(screen, NULL, back, &dsts); //der Hintergrund wird geblittet
huhn[1][1]->Draw(back); //das erste Bild von Huhn[1] wird geblittet
huhn[2][1]->Draw(back);//das erste Bild von huhn[2] wird geblittet
while(!done)
{
while(SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_QUIT:
done = true;
break;
}
}
if(huhn[1][1]->GetRect()->x + huhn[1][1]->GetRect()->w < screen->w)
{
huhn[1][h]->Move(40, 0);
huhn[1][h]->Animation();
huhn[1][h]->klick();
}
else {
huhn[1][h]->SetPos(10, 50);
}
////////////////////////////////////////////////////////
if (huhn[2][1]->GetRect()->x /*+ huhn[2][1]->GetRect()->w*/ < screen->w)
{
huhn[2][h]->Move(60, 0);
huhn[2][h]->Animation();
huhn[2][h]->klick();
}
else {
huhn[2][h]->SetPos(0, 200);
}
///////////////////////////////////////////////////////////////
SDL_BlitSurface(screen, NULL, back, &dsts);
huhn[1][h]->Draw(back);
huhn[2][h]->Draw(back);
SDL_Flip(back);
Uint32 iStartTime = SDL_GetTicks();
while(SDL_GetTicks() - iStartTime < iMinTimes); //Timer
}
delete huhn[1][1];
delete huhn[1][2];
delete huhn[1][3];
delete huhn[2][1];
delete huhn[2][2];
delete huhn[2][3];
SDL_FreeSurface(screen);
SDL_FreeSurface(image[0]);
SDL_FreeSurface(image[1]);
SDL_FreeSurface(image[2]);
return 0;
}
Fragen bzw. Probleme:
1. Wenn die beiden Moorhühner das erste Mal den Bildschirm überqueren klappt alles super, aber wenn sie dann wieder auf eine Position zurückgesetzt werden, blinken sie während ihres Fluges, oder eher gesagt das erste Bild wird nicht angezeigt.
Woran könnte dies liegen?
2. Nach dem Klick auf eines der Moorhühner wird es ja laut dem Code 40 Pixel nach unten versetzt, nur springt es dann wie ein Flummie immer zwischen seiner alten und seiner neuen Position hin und her.(ich schätze, dass das erste Bild immer wieder an der alten Position geblittet wird)
Woran könnte das liegen?
3. Jetzt habe ich noch ein Problem mit meinem Timer. Da dieser das Programm solange unterbricht bis die vorgegebene Zeit abgelaufen ist,
gilt dies natürlich auch für das Klicken mit der Maus. D.h:
Das Moorhuhn wird nicht bei jedem Klick nach unten versetzt, sondern nur,wenn sich der entsprechende Klick innerhalb der Zeitspanne befindet.
Gibt es für diesen Timer eine andere Lösung?
Schon einmal vielen Dank im Voraus!
Gruß Lars