/ / Stuck pri vytváraní motora 2D hier - 2d

Stlačený pri vytváraní motora 2D herného pohybu - 2d

Robím hnací motor pre môj top-down 2D hru, ale ja som sa zasekol snažil vyriešiť tento problém:

  • Prehrávač sa môže pohybovať pomocou klávesov so šípkami, ktoré vás urýchlia v príslušných smeroch. Existuje trenie, takže prestanete pohybovať po uvoľnení kľúčov, hoci nie okamžite.
  • Keď držíte dve kolmé klávesy, zrýchlite v tomto smere o 45 ° rovnakú rýchlosť ako na jednej ose
  • Existuje maximálna rýchlosť, nad ktorou sa nemôžete zrýchliť pešo, to tiež zrejme obmedzuje vašu maximálnu rýchlosť chôdze. Môžete sa zraziť, a tým prekročiť túto rýchlosť.
  • Ak sa pohybujete rýchlejšie ako max. rýchlosť chodu, môžete spomaliť rýchlejšie, ak držíte klávesy v opačnom smere (smeroch)

Pseudokód pre prvý bod, bez trenia:

gameTick(){

tempX += LeftKeyHeld ? -1 : 0;
tempX += RightKeyHeld ? 1 : 0;
tempY += UpKeyHeld ? -1 : 0;
tempY += DownKeyHeld ? 1 : 0;
ratio = 0.71;

if( |tempX| == |tempY| ) {
tempX =tempX* ratio;
tempY =tempY* ratio;
}
player.x += tempX;
player.y += tempY;
}

Môžem vyriešiť trenie (dostať dĺžkupohybový vektor, ktorý ho znižuje trením, vyčnieva ho späť s rovnakým pomerom x: y), ale nemôžem zabaliť hlavu okolo dostať maxSpeed ​​urobiť.

Pokúsil som sa nájsť riešenie, ktoré by neumožňovalo hráčovichodiť vôbec, keď je nad maxSpeed, ale toto porušuje bod 4. Tiež to malo škaredé vedľajšie účinky, že keď ste sa presťahovali do MaxSpeed ​​doľava a začali tlačiť nadol, smer pohybu nebol, alebo sa sotva zmenil.

Potom som začal premýšľať o mnohých produktoch, rozdieloch a iných veciach s vektormi, ale väčšinou som to už nemohol sledovať ani sa dostal do ranných problémov.

Takže na záver by mohol niekto vysvetliť systémktoré spĺňajú všetky vyššie uvedené body, alebo poukazujú na článok, ktorý vysvetľuje, ako by sa mohol tento systém realizovať? Nebojte sa, že by ste navrhovali niečo zložité, aby som pochopil aj náročné koncepty.

Vďaka za vašu pomoc!

odpovede:

1 pre odpoveď č. 1

Ospravedlňujeme sa, že ste si o tom viac než deň nezamýšľali, ale podarilo sa mi to vyriešiť, a to nie je dvoma riadkami kódu (aj keď ďakujem všetkým za nápady)

Pretože som lenivý a unavený, nedokážem ho zmeniť na pseudokódu okrem nasledujúcich dvoch metód:

updateGame(){
player.walk();
player.move();
}
player.move(){
player.x += player.speedX
player.y += player.speedY
}

A kód (java):

public void walk() {
float tempX = 0;
float tempY = 0;
float accelX;
float accelY;
float nextSpeedX;
float nextSpeedY;
float nextSpeed;
float speed;
tempX += walkLeft ? -1 : 0;
tempX += walkRight ? 1 : 0;
tempY += walkUp ? -1 : 0;
tempY += walkDown ? 1 : 0;

if (Math.abs(tempX) == Math.abs(tempY)) {
tempX = (float) tempX * rat;
tempY = (float) tempY * rat;
}

accelX = tempX * (float) runSpeed;
accelY = tempY * (float) runSpeed;
speed = (float) Math.sqrt(speedX * speedX + speedY * speedY);
nextSpeedX = speedX + accelX;
nextSpeedY = speedY + accelY;
nextSpeed = (float) Math.sqrt(nextSpeedX * nextSpeedX + nextSpeedY * nextSpeedY);

if (nextSpeed > maxSpeed) { //can"t accelerate by running
if (nextSpeed > speed) {  //wants to accelerate
if (speed > maxSpeed) {  //the current speed is larger than maximum.
float diff = (float)(speed / nextSpeed);
float greenX = nextSpeedX*diff;
float greenY = nextSpeedY*diff;
accelX = greenX-speedX;
accelY = greenY-speedY;
} else { //speed <= maxspeed
float diff = (float)(maxSpeed / nextSpeed);
float greenX = nextSpeedX*diff;
float greenY = nextSpeedY*diff;
accelX = greenX-speedX;
accelY = greenY-speedY;
}
} else { //wants to slow! allow it!
//acceleration doesn"t need to be changed
}
} else { //no problem, allow it!
//acceleration doesn"t need to be changed
}
speedX += accelX;
speedY += accelY;
}

Mohol by byť kratší, mohol by byť o niečo optimalizovaný, ale to funguje. Dúfam, že to pomôže každému, kto sa v budúcnosti potýka s týmto problémom.


0 pre odpoveď č. 2

Pridať dole:

 If (|tempX|>maxSpeed)
tempX=maxSpeed*sign(tempX);

If (|tempY|>maxSpeed)
tempY=maxSpeed*sign(tempX);

Kde znak int (x) { ak x <0 návrat -1; }


0 pre odpoveď č. 3

Navrhujem, aby ste spolu s pozíciou pridali určitú rýchlosť k prehrávaču a iba kontrolovali rýchlosť proti maxSpeed ​​pri stlačení tlačidiel so šípkami.

Ak rýchlosť prekročí maxSpeed, ale stlačíte tlačidlá so šípkami na opačnej strane, potom udržujete aktuálnu rýchlosť nad maxSpeed ​​a jednoducho použijete negatívnu akceleráciu.