2016-09-25 4 views
0

Voici un lien vers une vidéo que j'ai enregistrée de mon numéro: https://sendvid.com/rjpi6vnw Vous remarquerez qu'au début, je commence à tile (0, 0) puis après avoir déplacé mon personnage de haut en bas plusieurs fois, l'écran ne va que monter à (1,0). J'ai donc perdu toute une rangée de cartes jouables. Je perds seulement une partie de la carte quand mon écran s'ajuste. Vous comprendrez ce que je veux dire dans un instant. J'ai une classe appelée Player, et j'ai des méthodes appelées moveRight(), moveLeft(), moveUp() et moveDown(). J'exclus toutes les classes et méthodes inutiles afin de ne pas perdre votre temps. Voici mes moveDown() et moveUp() méthodes:Pourquoi la vue de ma carte est-elle incrémentée de façon permanente à chaque mouvement?

public void moveUp(){ 
     locY1 -= defaultMoveAmount; 
     if(viewShouldMoveVertically(locX1, locY1) == true){ //locX1 and locY1 refers to the player's bounds location as set by setBounds() 
      Display.uni.moveMapDown(defaultMoveAmount); //Display.uni just means in the Display class 
     } 
    } 
    public void moveDown(){ 
     locY1 += defaultMoveAmount; 
     if(viewShouldMoveVertically(locX1, locY1) == true){ 
      Display.uni.moveMapUp(defaultMoveAmount); //defaultMoveAmount is the # of pixels the player moves each time the program updates 
     } 
    } 

J'ai donc KeyListeners qui décident quand ces méthodes sont appelées. La méthode viewShouldMoveVertically() est la suivante:

public boolean viewShouldMoveVertically(int X1, int Y1){ 
     if(Y1 < screenCenterY){ //screenCenterY is the number of vertical pixels on my screen/2 
      return false; 
     } 
     return true; 
    } 

Le moveMapUp() ou moveMapDown() est ensuite appelée dans la classe d'affichage:

int backgroundX1 = 0; 
int backgroundY1 = 0; 
public void moveMapUp(int moveAmt){ 
    backgroundY1 -= moveAmt; 
    background.setBounds(backgroundX1, backgroundY1, backgroundX2 , backgroundY2); 
} 
public void moveMapDown(int moveAmt){ 
    backgroundY1 += moveAmt; 
    background.setBounds(backgroundX1, backgroundY1, backgroundX2 , backgroundY2); 
} 

Donc, si vous ne pouvez pas voir la vidéo à le lien que j'ai posté, je vais décrire le problème. Quand mon personnage se rapproche du bord de la carte, je ne voudrais évidemment pas que la caméra montre des zones hors de la carte. La caméra s'arrête donc, mais mon personnage peut continuer à marcher jusqu'à la frontière de la carte. Si mon personnage se trouve à moins de 540 pixels du haut de la carte, la caméra ne bougera pas (je cours sur un écran 1920x1080). C'est prévu. Lorsque je déplace le personnage à plus de 540 pixels du haut de la carte, la caméra se déplace maintenant avec le joueur puisqu'il est au centre de l'écran. Mais le problème est que SI et SEULEMENT SI la caméra finit par s'éloigner du haut de la carte, alors je perds maintenant exactement les pixels "defaultMoveAmount" de la zone visible lorsque je reviens au sommet. Je n'arrive pas à comprendre comment résoudre ce problème. Maintenant, un peu plus vous pouvez finir par vouloir savoir: J'ai le même problème se déplaçant horizontalement que je me déplace verticalement. Il est configuré de la même manière, donc il n'y avait aucun intérêt à vous faire lire du code supplémentaire. Lorsque vous regardez la vidéo sur le lien, je dois cliquer sur le bouton de lecture en bas à gauche, ou bien il essaie de me faire ajouter une extension à Chrome ou quelque chose. La solution au problème de mon programme peut finir par être assez simple, mais je ne peux pas sembler comprendre. J'ai fini par en avoir marre et j'ai décidé qu'il serait mieux d'avoir un peu d'aide que d'abandonner pour l'instant. Je suis un débutant en programmation, car je n'ai eu que 1 an d'expérience en programmation dans un cours d'AP Compute Science. Je suis sûr que vous pouvez voir quelques choses qui semblent stupides, et je me réjouis de toutes les suggestions ou commentaires que vous pourriez avoir, mais s'il vous plaît soyez conscient que je suis assez nouveau à ce genre de choses. Principalement le mouvement. Et enfin, je n'ai pas posté une section de code compilable en raison de choses telles que les graphiques qui sont nécessaires. Pendant que je suis ici, si vous avez des suggestions ou de bonnes références pour déterminer si un personnage est dans une zone dans une grande carte semblable à une tuile, comme une porte qui peut être ouverte, ce serait apprécié.

Répondre

0

J'ai résolu le problème. Voici ma mise à jour méthode viewShouldMoveVertically():

public boolean viewShouldMoveVertically(int X1, int Y1){ 
    if(Y1 <= screenCenterY && previousY1 > screenCenterY){ //if just touched highest camera point from below 
     return true; 
    }else if(Y1 >= mapPixelTotalY-screenCenterY && previousY1 < mapPixelTotalY-screenCenterY){ //if just touched lowest camera point from above 
     return true; 
    } else if(Y1 <= screenCenterY){ //if just touched highest camera point from above or is just above 
     return false; 
    } else if(Y1 >= mapPixelTotalY-screenCenterY){ //If touched lowest camera point from below or is just below 
     return false; 
    } 
    return true; 
} 

Il se trouve que lorsque le joueur touche le « point le plus haut de la caméra en bas » ou le « point le plus haut de la caméra en haut », des résultats différents sont nécessaires. Si vous touchez la vue la plus haute de la caméra par le dessous, l'appareil photo doit toujours se déplacer vers le haut juste une fois de plus. Mais lorsque vous touchez le même point par le dessus, la caméra ne devrait pas bouger, car le joueur venait d'une zone dans laquelle la caméra ne se déplacerait pas verticalement. Vous pouvez voir ma solution dans le code. De plus, j'ai ajouté un "previousY1" qui enregistre la dernière valeur de Y1, de sorte que je puisse dire si le joueur venait d'en haut ou de bas.