2017-01-07 1 views
0

J'essaye de créer un jeu de style mario 2D. Tout a fonctionné jusqu'à ce que je commence à le rendre plus «objectif». Mario n'arrête pas à la fin de la fenêtre - s'arrête mais après traverse la fenêtre. Si je fais la méthode sans ref, mario ne s'arrête même pas tout le temps.C# manque de colision en simple jeu 2D en utilisant ref dans la méthode

Mario classe

class Mario: System.Windows.Forms.PictureBox 
{ 
    public Mario(int x, int y) 
    { 
     Image = Image.FromFile("Mario.png"); 
     Location = new Point(x, y); 
     Size = new Size(16, 32); 
     SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; 
     TabIndex = 0; 
     TabStop = false; 
    } 
public void colision(System.Windows.Forms.Panel s,ref bool l, ref bool r) 
    { 
     if (this.Right > s.Right) { r = false; } 

     if (this.Left < s.Left) { l = false; } 
    } 

} 

Classe principale - Form1

public partial class Form1 : Form 
{ 

    bool right=false,left=false; 

public Form1() 
    { 
     InitializeComponent(); 
     player.Top = screen.Height - player.Height; 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     if(right== true) { player.Left += 1; } 
     if (left == true) { player.Left -=1; } 

     player.colision(screen, ref left, ref right); 
} 
écran

est System.Windows.Forms.Panel et le lecteur est de type Mario qui ont été initialisé dans Form1.Designer.cs

J'ai supprimé le champ et les méthodes non pertinents.

+0

Pourquoi cette balise tagué [: Graphics2D ]? – devRicher

+1

débogueur est votre meilleur ami. apprenez comment l'utiliser pour savoir où se trouve votre problème: p –

+0

programme passe en condition if. – Xalion

Répondre

1

L'emplacement d'un contrôle est par rapport à son parent - si vous placez votre Mario à (0, 0), il n'apparaîtra dans le coin supérieur gauche de votre écran sous forme ou , mais en haut à gauche coin du Panel - son parent direct.

De même, l'emplacement de ce Panel est également relatif à son parent.

Supposons que votre Panel est positionné dans votre forme à (100, 100) et sa taille est (400, 300) - cela signifierait sa Left propriété est 100 et sa Right propriété est 500 - Mario sera hors de la vue pour les 100 pixels.

Ainsi, votre chèque doit être:

if (this.Right > s.Width) { r = false; } 
if (this.Left < 0) { l = false; } 

Vous avez déjà fait la bonne chose avec la position verticale (en utilisant Height au lieu de Bottom):

player.Top = screen.Height - player.Height;