dev.gamez.lv Forum Index dev.gamez.lv
Latvian Game Developers Community
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups 

Jump&Run lekšanas problēma
Goto page 1, 2  Next
 
dev.gamez.lv Forum Index -> Iesācējiem
View previous topic :: View next topic  
Author Message
Tankists



Joined: 18 Dec 2006
Posts: 81
Location: Baldone

PostPosted: Mon Sep 08, 2008 5:37 pm    Post subject: Jump&Run lekšanas problēma

Varētu teikt, ka problēma, pēc problēmas, bet tāc nu ir mans mācīšanās process. Sākot domāt par lekšanas iespēju manā jump&run "spēlē", nespēju izdomāt, kā pareizi to varētu panākt, līdz uzraku kādu mājas lapu, kurā tēma par lekšanu nav tieši izrunāta, bet kautkas uz to pusi ir. (links)
Sākot pētīt source failu, kas dots lapas apakšā atradu, kur itkā ir itkā vienkārša lekšanas ideja. Protams pašpikoju un uztaisiju sev ko līdzīgu, un protams nekas labs nesanāca. Par cik manā "spēlē" kolīzijait tiek izmantota box-box tehnika, spēlētājs nevar pakustēties ne uz priekšu, ne uz atpakaļu, dēļ gravitācijas ja nemaldos. Tikai palecoties es varu kustēties uz priekšu un uz atpakaļu.
Tutoriāļa autors izmanot savādāku kolīzijas noteikšanas tehniku un tas arī visu padara sarežģītāku.

mana move f-cija:
Code:
void Player::move(Tile *tiles[])
{
    this->box.x += this->xVel;

    if ((this->box.x < 0) || (this->box.x + this->box.w > SCREEN_WIDTH) || this->touchesWall(this->box, tiles))
    {
        this->box.x -= this->xVel;
    }
    this->box.y += this->yVel;
    if ((this->box.y < 0) || (this->box.y + this->box.h > SCREEN_HEIGHT) || this->touchesWall(this->box, tiles))
    {
        this->box.y -= this->yVel;
    }

   //JUMPING
    if (this->yVel < 0)
   {
      if (this->touchesWall(this->box, tiles))
      {
         this->yVel = 0;
      }
      else
      {
         this->box.y += this->yVel;
         this->yVel += GRAVITY;
      }
   }
   else
   {
      if (this->touchesWall(this->box, tiles) && (this->yVel != 0))
      {
         this->yVel = 0;
         this->lockJump = false;
      }
      else
      {
         this->box.y += this->yVel;
         this->yVel += GRAVITY;

         if (this->yVel > TILE_SIZE)
         {
            this->yVel = TILE_SIZE;
         }
         this->lockJump = true;
      }
   }

    if (this->xVel > 0)
    {
        this->direction = D_RIGHT;
        this->frame++;
    }
    else if (this->xVel < 0)
    {
        this->direction = D_LEFT;
        this->frame++;
    }
    else
    {
        this->frame = 0;
    }

    if (this->frame >= 2)
    {
        this->frame = 0;
    }
}


Ir kāds labāks veids, kā arī ar box-box tehniku varētu realizēt lekšanas ideju?

Mans Source

P.S.
Piedodiet, ja nemāku pareizi izstāstīt kas nav tā kā vājag.
Back to top
View user's profile Visit poster's website
snake5
Indago dalībnieks
Indago dalībnieks


Joined: 27 Jun 2007
Posts: 2590

PostPosted: Mon Sep 08, 2008 7:09 pm    Post subject:

neaizmirsti 2 lietas:
1. nepielikt gravitācijas spēku, kad playeris nekrīt, bet stāv uz zemes (tātad arī tad, kad playera box uz zemes boxi nesaskaras, bet starpā nav pikseļu.
2. izņemt playeri no zemes pēc nokrišanas (zemes box'a, ar kuru saduras, augšējā mala - puse no playera boxa augstuma (pieņemot, ka masas centrs ir augšā) )
_________________
"There are two choices here: "looks good" and "realism"." -- Paul Nettle
Back to top
View user's profile Visit poster's website
Tankists



Joined: 18 Dec 2006
Posts: 81
Location: Baldone

PostPosted: Mon Sep 08, 2008 7:39 pm    Post subject:

Varbūt esmu dumš, bet grūti saprast, kā tas panākams kodā... Ja tev nau jau līdz kaklam man palīdzēt, tad varbūt tu varētu parādīt kādus labojumus ieviest move f-cijā, lai man vieglāk saprast.
Back to top
View user's profile Visit poster's website
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Mon Sep 08, 2008 7:51 pm    Post subject:

Kur precīzi ir problēma? No pirmā posta sapratu, ka kautkas tev nesanāk. Bet kas tieši? Vai tas, kā noteikt, kad drīkst lekt? Es teiktu tad, kad spēlētājs ir pieskāries grīdai (tb tailam/klucītim, kuram normāle pieskaršanas punktā vērsta uz augšu).
Back to top
View user's profile Send e-mail
Tankists



Joined: 18 Dec 2006
Posts: 81
Location: Baldone

PostPosted: Mon Sep 08, 2008 7:57 pm    Post subject:

Man pagaidām sanāk tā, ka man nezināma iemesla pēc vairs nevar pakustēties uz sāniem, pēc palēciena, kad saduras ar zemi spēlētājs nedaudz ir "iegrimis" zemē un kad atsitās pret kādu tailu, virs spēlētāja, iestrēgst un paliek gaisā..
_________________
Getting used to problems...
Back to top
View user's profile Visit poster's website
snake5
Indago dalībnieks
Indago dalībnieks


Joined: 27 Jun 2007
Posts: 2590

PostPosted: Mon Sep 08, 2008 8:16 pm    Post subject:

vispirms izveido funkciju, kura nosaka, kurai playera box'a malai pieskārās siena/grīda, vai atgriez to ar "touchesWall" funkciju kā ciparu (0 - nav sadursmes, 1 - left, 2 - right, 3 - up, 4 - down)
un attiecīgi - ja atgriež 4, tad pieliec iespēju vēl atgriezt taila pointeri (kā argumentu dodot "TILE** t", un "vainīgo tailu ierakstot ar (*t) = current_tile_pointer;), ar kuru sadūrās, un tad var playeri novietot, kur vajag Wink
_________________
"There are two choices here: "looks good" and "realism"." -- Paul Nettle
Back to top
View user's profile Visit poster's website
Tankists



Joined: 18 Dec 2006
Posts: 81
Location: Baldone

PostPosted: Mon Sep 08, 2008 9:09 pm    Post subject:

Nav ne mazākās nojausmas kādu kolīzijas funkciju man vajadzētu izmantot, lai man būtu iespēja noteikt ar kuru no malām notikusi sadursme.

Mana kolīzijas pārbaudes f-cija:
Code:
checkCollision(SDL_Rect A, SDL_Rect B)
{
    int topA, topB;
    int rightA, rightB;
    int bottomA, bottomB;
    int leftA, leftB;

    topA = A.y;
    rightA = A.x + A.w;
    bottomA = A.y + A.h;
    leftA = A.x;

    topB = B.y;
    rightB = B.x + B.w;
    bottomB = B.y + B.h;
    leftB = B.x;

    if (topA >= bottomB)
    {
        return false;
    }
    if (rightA <= leftB)
    {
        return false;
    }
    if (bottomA <= topB)
    {
        return false;
    }
    if (leftA >= rightB)
    {
        return false;
    }
    return true;
}


Varbūt, tad prātīgāk ir mēģināt izurbt kā tajā tutoriālī tā kolīzija tiek aprēķināta, un mēģināt kautko samontēt no tā visa?
_________________
Getting used to problems...
Back to top
View user's profile Visit poster's website
snake5
Indago dalībnieks
Indago dalībnieks


Joined: 27 Jun 2007
Posts: 2590

PostPosted: Mon Sep 08, 2008 9:47 pm    Post subject:

hm, radās viena vienkāršāka ideja..

iekļauj ātruma vektoru playera boxa testiem ar tailiem.
un tad noteikt pusi ir vienkāršāk, nekā čupu ar if'iem rakstīt..
es nedošu koda paraugu, jo tur ir normāls gabals jāparaksta.

tātad, vispirms testējam sadursmi.
ja tā notikusi:
atrodam vainīgā taila centru, saglabājam mainīgajā T1.
no playera pozīcijas atņemam ātrumu * x (kur x ir taila diagonāles garums - sqrt( width * width + height * height ) ), saglabājam mainīgajā T2.
no T2 atņemam T1, rezultātu saglabājam mainīgajā T3.
normalizējam vektoru T3.
izrokam konstantes C1 - C4 // tās var mainīt, bet rezultātā vektoriem jārāda uz atbilstošajiem virzieniem.
{
Vector2D( -1, 0 );//left
Vector2D( 0, -1 );//top
Vector2D( 1, 0 );//right
Vector2D( 0, 1 );//bottom
}
veidojam skalāro reizinājumu (dot product) ar katru konstanti, rezultātu saglabājam mainīgajā T4.
ja T4 ir lielāks par vai vienāds ar 0.5, tad atgriežam vainīgā taila malu attiecīgi.

Sākumā tam vajadzētu strādāt pareizi.
Ar laiku var sanākt tā, ka sadursmes būs vairākas, un netiks izvēlēta pareizā sadursme kā pirmā.
Tad būs jāveido masīvs, kurā glabās sadursmes datus {taila pointeri, sadursmes malu }
to pēc tam varēs visādi apstrādāt :D

piemēram, galā varēs izveidot tādu bool'u masīvu, kurā atzīmēs visas iespējamās puses, piemēram, ja playeris krītot mēģina ielekt stūrī pa labi no viņa, tad būs: left = false; top = false; right = true; bottom = true;
un attiecīgi katram gadījumam varēs izbīdīt playeri ārā no taila Smile
domāju, ka šī ideja pabeidz visu lielo domu, vairs needitošu, šķiet, ar to pietiks tev Smile
_________________
"There are two choices here: "looks good" and "realism"." -- Paul Nettle


Last edited by snake5 on Mon Sep 08, 2008 10:01 pm; edited 1 time in total
Back to top
View user's profile Visit poster's website
Tankists



Joined: 18 Dec 2006
Posts: 81
Location: Baldone

PostPosted: Mon Sep 08, 2008 10:00 pm    Post subject:

Nu jā.. Izklausās iespaidīgi, un sarežģīti. Smile Nezinu, vai ir jēga manā necilajā "spēlē" iegūldīt 50% darba kolīzijas apstrādei. Noteikti ir jābūt kautkam vienkāršam un pat man saprotamam... hmm... Rolling Eyes

Cerēju ar 2D lēnā garā apgūt visus knifus, bet redzu, ka te joki mazi... Shocked
_________________
Getting used to problems...
Back to top
View user's profile Visit poster's website
snake5
Indago dalībnieks
Indago dalībnieks


Joined: 27 Jun 2007
Posts: 2590

PostPosted: Mon Sep 08, 2008 10:04 pm    Post subject:

nezinu, neliekas īpaši sarežģīti, ja tev ir kaut vienkāršs 2d vektoru matemātikas kods. to gan vari nozagt no kāda, lai nejauktu sev galvu Smile
vienkārši tur operatori jāpieliek vektoram, jāzina matemātika ~ 9. klases līmenī arī..
_________________
"There are two choices here: "looks good" and "realism"." -- Paul Nettle
Back to top
View user's profile Visit poster's website
Tankists



Joined: 18 Dec 2006
Posts: 81
Location: Baldone

PostPosted: Mon Sep 08, 2008 10:06 pm    Post subject:

Mācos 11. klasē. Par vektoriem sāk mācīt tikai 10. klasē... Very Happy
_________________
Getting used to problems...
Back to top
View user's profile Visit poster's website
snake5
Indago dalībnieks
Indago dalībnieks


Joined: 27 Jun 2007
Posts: 2590

PostPosted: Mon Sep 08, 2008 10:21 pm    Post subject:

uh Smile
kad pagājušajā gadā mācījos 9. klasē, mums jau bija vektori - saskaitīšana, atņemšana, vektora reizināšana ar skaitli, garuma noteikšana, skalārā reizinājuma 2 varianti Very Happy
tieši tagad atkārtojam :/

nu tātad tev ir puse zināšanu par to, kā izveidot normālu 2d vektora struct'u uz c++

ja gribi pats pacīnīties ar to, vari visu darīt vienkārši:
Code:

struct Vector2D
{
float x, y;
};
Vector2D Vector2DAdd( const Vector2D& v1, const Vector2D& v2 );
Vector2D Vector2DSubtract( const Vector2D& v1, const Vector2D& v2 );
float Vector2DDotProduct( const Vector2D& v1, const Vector2D& v2 );

tas "&" pēc Vector2D norāda, ka argumentu nevis pārkopēs, bet lietos to, ko padod, tas ir nedaudz ātrāk, nekā padodot vienkāršu Vector2D, un, manuprāt nav sarežģīti.
Šeit diezgan labi strādā vienkāršs likums - primitīvos datu tipus (int, bool, float, etc. ) padot pašus (bez "&" vai "*") un klases/ struct'us padot vai nu caur pointeri (*), vai caur referenci (&) - kā vienkāršāk / drošāk / ērtāk pēc tam ar argumentiem darboties.
Bet ar šīm funkcijām tās mums, protams, izdarīt nevajag, tāpēc drošības pēc piemetu const priekšā.
atgriežu vienkārši Vector2D, lai viss būtu vienkārši. Tas nav optimāli, bet ir pavisam vienkārši, un pat nevar programmas ātrumu ietekmēt gandrīz nemaz Wink
_________________
"There are two choices here: "looks good" and "realism"." -- Paul Nettle
Back to top
View user's profile Visit poster's website
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Mon Sep 08, 2008 10:34 pm    Post subject:

snake5 wrote:
[..]
ja T4 ir lielāks par vai vienāds ar 0.5, tad atgriežam vainīgā taila malu attiecīgi.
[..]

Drīkst uzzināt ar ko 60 grādi ir tik īpašs lenķis?

snake5 wrote:
nu tātad tev ir puse zināšanu par to, kā izveidot normālu 2d vektora struct'u uz c++

Nevajag, nu nevajag izgudrot divriteni. It īpaši jau iesācējam, kurš grib taisīt spēli.
Ir ļoti labas jau gatavas matemātikas bibliotēkas. Kaudze ar tām.
Piemēram: http://cmldev.net/
Vai http://glm.g-truc.net/
Ja nemaldos, tad arī DirectX'am bija darbības ar visiem vektoriem jau gatavas.
Back to top
View user's profile Send e-mail
Tankists



Joined: 18 Dec 2006
Posts: 81
Location: Baldone

PostPosted: Mon Sep 08, 2008 10:36 pm    Post subject:

Nu tagad jau kautkas top gaišāks. :)

P.S.
Dīvaini, ka 9. klasē māca pa vektoriem, jo tie pēc idejas nav nemaz mācību programmā pamatskolai...

Īstenībā jūtos apdalīts, jo man pat 10. klasē neko sīkāk, par vektoru saskaitīšanu/atņemšanu/reiz./dal./projekciju nemācija. Es pat nezinu kas ir skalārais reizinājums. Rolling Eyes
_________________
Getting used to problems...
Back to top
View user's profile Visit poster's website
snake5
Indago dalībnieks
Indago dalībnieks


Joined: 27 Jun 2007
Posts: 2590

PostPosted: Mon Sep 08, 2008 10:59 pm    Post subject:

bubu wrote:

Drīkst uzzināt ar ko 60 grādi ir tik īpašs lenķis?

sorry, biju aizmirsis, ka cos nedod ārā vērtības lineāri.
biju domājis salīdzināt, vai ir 45 grādu robežās leņķis starp vektoriem.
tad laikam.. 0.70710678118654752440084436210485 vajadzīgs.
var uztaisīt konstanti, kuru kompilētājs sagatavo jau iepriekš.

bubu wrote:
Nevajag, nu nevajag izgudrot divriteni. It īpaši jau iesācējam, kurš grib taisīt spēli.

snake5 wrote:
to gan vari nozagt no kāda, lai nejauktu sev galvu

_________________
"There are two choices here: "looks good" and "realism"." -- Paul Nettle
Back to top
View user's profile Visit poster's website
Display posts from previous:   
dev.gamez.lv Forum Index -> Iesācējiem All times are GMT + 2 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group