Autor Wątek: [SOLVED] SDL2 - mapa kaflowa i poruszające się na niej obiekty  (Przeczytany 2379 razy)

Offline Dethas

  • Użytkownik

# Maj 01, 2014, 13:59:59
Witam, zaprogramowałem już mapę kaflową odzwierciedloną w tablicy oraz kolizje z głównym obiektem obsługiwanym przez gracza to znaczy poruszanie się na wsad, kolizje działają ale problem pojawia się gdy wstawiam inne obiekty które poruszają się same. Kiedy koliduję na przykład z kaflem wody to inne obiekty nieznacznie przesuwają się w złych kierunkach, dziwnie to wygląda i nie wiem jak naprawić taki błąd.
Wiem że wynika to z tego że gdy dochodzi do kolizji to cofam główny obiekt o ruch * delta, przez co znajduję się kawałek przed kolizją a nie bezpośrednio przy niej, nie wiem jak naprawić ten błąd, proszę o pomoc ;-)
« Ostatnia zmiana: Marzec 04, 2015, 21:27:37 wysłana przez Dethas »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Dethas

  • Użytkownik

# Czerwiec 15, 2014, 19:51:19
Odświeżam

Offline Xirdus

  • Redaktor

# Czerwiec 15, 2014, 19:58:42
Fajnie by było jakbyś pokazał jakiś kod, i najlepiej jeszcze screeny i zaznaczył na nich co jest nie tak.

Offline Dethas

  • Użytkownik

# Lipiec 04, 2014, 20:52:54
CMovingObject::CMovingObject( SDL_Renderer *passed_Renderer, const char* File_Path, Uint32 Type_Flags, unsigned int Size, int passed_Speed, PlayerData *passed_Player, CCollisions* passed_Collision  )
: CObject( passed_Renderer, File_Path, Type_Flags, Size ), Speed( passed_Speed ), AiTimer( NULL ), AiWaitTime( NULL ), Player( passed_Player )
{
Collision = passed_Collision;
AnimationLoop = 0;
AnimationLoop = 25 / Speed;
State = Stand;
Data.x = 500;
Data.y = 500;
PosX = Data.x;
PosY = Data.y;
Data.w = Size;
Data.h = Size;
Animation.x = 0;
Animation.y = 0;
Animation.w = 37;
Animation.h = 37;
}

CMovingObject::~CMovingObject()
{
}

void CMovingObject::UpdateAnimation( double Frame_Time )
{
AnimationTimer += Frame_Time;
switch( State )
{
case Stand:
Animation.x = 0;
break;
case Move_Up:
Animation.y = 0;
break;
case Move_Right:
Animation.y = Animation.h;
break;
case Move_Down:
Animation.y = Animation.h * 2;
break;
case Move_Left:
Animation.y = Animation.h * 3;
break;
}
if( State != Stand && AnimationTimer >= AnimationLoop )
{
AnimationTimer = 0;
Animation.x += Animation.w;
if( Animation.x >= Animation.w * 3 ) Animation.x = Animation.w;
}
}

void CMovingObject::Draw( double Frame_Time )
{
if( !( PosX > GLOBAL_SCREEN_SIZE_X && PosY > GLOBAL_SCREEN_SIZE_Y ) )
{
if( Collision->IsColliding( PosX, PosY, Data, TypeFlags ) )
{
StandBack();
State = Stand;
}
if( TypeFlags & TYPE_Creep ) Move( Frame_Time );
if( TypeFlags & TYPE_Animated ) UpdateAnimation( Frame_Time );
SDL_RenderCopy( Renderer, Texture, &Animation, &Data );
}
}

void CMovingObject::Move( double Frame_Time )
{
LastX = Data.x;
LastY = Data.y;
AiTimer += Frame_Time;
if( AiTimer >= AiWaitTime )
{
AiTimer = 0;
AiWaitTime = rand() % 3 + 1;
Way = rand() % 5;
switch( Way )
{
case 0:
State = Stand;
break;
case 1:
State = Move_Up;
break;
case 2:
State = Move_Right;
break;
case 3:
State = Move_Down;
break;
case 4:
State = Move_Left;
break;
}
}
switch( State )
{
case Stand:
break;
case Move_Up:
PosY -= Speed * Frame_Time;
break;
case Move_Right:
PosX += Speed * Frame_Time;
break;
case Move_Down:
PosY += Speed * Frame_Time;
break;
case Move_Left:
PosX -= Speed * Frame_Time;
break;
}
switch( Player->Player_State )
{
case Stand:
break;
case Move_Up:
PosY += Player->speed * Frame_Time;
break;
case Move_Right:
PosX -= Player->speed * Frame_Time;
break;
case Move_Down:
PosY -= Player->speed * Frame_Time;
break;
case Move_Left:
PosX += Player->speed * Frame_Time;
break;
}
Data.x = PosX;
Data.y = PosY;
}

int CMovingObject::GetPosX()
{
return PosX;
}

int CMovingObject::GetPosY()
{
return PosY;
}

int CMovingObject::GetSpeed()
{
return Speed;
}

void CMovingObject::StandBack()
{
PosX = LastX;
PosY = LastY;
}

To są metody poruszających się obiektów które sprawiają problem, gdy gracz się poruszy to obiekty odpowiednio cofam lub przesuwam do przodu czy w bok względem prędkości gracza tak aby sprawić wrażenie oddalania się lub przybliżania do takiego obiektu, problem polega na tym że jak wpadnę na kolizję i będę cały czas w nią wchodził to te obiekty nieznacznie przesuwają się w kierunku w którym powinny gdybym nie wpadał na kolizję tylko szedł normalnie

Offline Xirdus

  • Redaktor

# Lipiec 04, 2014, 21:19:58
Widzę jeden bardzo mocny błąd projektowy - współrzędne obiektów są względem okna, nie względem świata. Założę się, że jak przepiszesz to tak, że pozycje obiektów i gracza są nie współrzędnymi okna, tylko współrzędnymi względem np. lewego górnego rogu mapy, to problem automatycznie zniknie. No i dobrze jest trzymać współrzędne w kaflach, nie w pikselach (potem przy rysowaniu sobie odpowiednio przemnażasz i dodajesz).

Offline Dethas

  • Użytkownik

# Lipiec 13, 2014, 17:04:00
Nie do końca rozumiem o co chodzi, czy mógłbyś wytłumaczyć bardziej szczegółowo?

Offline Xirdus

  • Redaktor

# Lipiec 14, 2014, 02:02:07
Normalnie jak zrobisz krok, to przesuwasz się ty. W twoim kodzie jak zrobisz krok, przesuwa się cała Ziemia i wszyscy jej mieszkańcy.