Entwickler-Ecke

Sonstiges (.NET) - Collisionserkennung


Javes - Fr 01.09.17 10:50
Titel: Collisionserkennung
Hallo,
Ich bin gerade dabei einen kleinen Platformer zu programmieren.
Aber nun habe ich folgendes Problem: und zwar möchte ich mit nur if abfrage Die Top Collision von 2 Blöcken abfragen.
Doch ich weiß nicht wie ich das machen soll?


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Game
{
    public partial class Form1 : Form
    {
        bool right, left;
        bool jump;
        int Gravity = 18;
        int Force;

        public Form1()
        {
            InitializeComponent();
            timer1.Enabled = true;
            player.Visible = true;
        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.D) { right = true; }
            if (e.KeyCode == Keys.A) { left = true; }
            if (e.KeyCode == Keys.Z) { player.Left = 0; player.Top = 0; }
            if (e.KeyCode == Keys.Escape) { this.Close(); }

            if (jump != true)
            {
                if (e.KeyCode == Keys.Space)
                {
                    jump = true;
                    Force = Gravity;
                }
            }

        }
        #region Timer

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (right == true) { player.Left += 5; } //Bewegung nach Rechts
            if (left == true) { player.Left -= 5; }  //Bewegung nach Links

            if (jump == true)                        //Sprung
            {
                player.Top -= Force;
                Force -= 1;
            }

            if (player.Top + player.Height >= screen.Height) //Boden Border (Damit man nicht durch den Boden fallen kann)
            {
                player.Top = screen.Height - player.Height;
                jump = false;
            }
            else
            {
                player.Top += 5;                            //Sollte der Spieler noch nicht am Boden sein so wird er zum Boden gezogen
            }

            if (player.Left + player.Width >= screen.Width) //Damit man nicht aus den Rechten Bildrand verschwinden kann 
            {
                player.Left = screen.Width - player.Width;
                player.Top += 5;
            }

            if (player.Left <= 0)                          //Damit man nicht aus dem Linken Bildrand verschwinden kann
            {
                player.Left = 0;
            }

            if (player.Top <= 0)                           //Damit man nicht oben hinausspringen kann
            {
                player.Top = 0;
                Force = 0;
            }
            //Collisions Erkennung: Top

            if (player.Top + player.Height > Block.Top && player.Left + player.Width > Block.Left && player.Right - player.Width < Block.Right && player.Top < Block.Top)
            {
                jump = false;
                player.Top = Block.Location.Y - player.Height;
                Force = 0;
            }

            //Collisions Erkennug: Bottom

            if (player.Top < Block.Top + Block.Height && player.Left + player.Width > Block.Left && player.Right - player.Width < Block.Right && player.Top + player.Height > Block.Top)
            {
                Force = 0;
            }
        }
        #endregion

        private void Form1_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.D) { right = false; }
            if (e.KeyCode == Keys.A) { left = false; }
        }
    }
}


Block = Picturebox
player = Picturebox

Moderiert von user profile iconTh69: Code- durch C#-Tags ersetzt


Th69 - Fr 01.09.17 12:05

Hallo und :welcome:

könntest du bitte den Satz
Javes hat folgendes geschrieben:
und zwar möchte ich mit nur if abfrage Die Top Collision von 2 Blöcken abfragen.
nochmals neu schreiben (da grammatikalisch unverständlich) und genauer angeben, auf welche Codezeilen du dich damit beziehst.


Delete - Fr 01.09.17 12:11

- Nachträglich durch die Entwickler-Ecke gelöscht -


Javes - Fr 01.09.17 12:17

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Daran hatte ich auch zu grübbeln. Ich denke, er bezieht sich hierbei auf den Code ab Zeile 85.

genau!

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Javes hat folgendes geschrieben:
und zwar möchte ich mit nur if abfrage Die Top Collision von 2 Blöcken abfragen.
nochmals neu schreiben (da grammatikalisch unverständlich) und genauer angeben, auf welche Codezeilen du dich damit beziehst.

Also was ich meine ist das ich nicht möchte das ich die if abfrage kopieren und dann statt "Block" "Block2" einfügen muss.

Moderiert von user profile iconTh69: Zitat verkürzt.


Th69 - Fr 01.09.17 12:24

Achso, du hast also mehrere Blöcke - das war aus deinem Anfangsbeitrag nicht ersichtlich. ;-)
Am besten du packst diese dann in eine Liste: List<PictureBox> und kannst diese dann in einer Schleife verarbeiten.

Alternativ (bzw. zusätzlich) kannst du auch aus den bisherigen Zeilen eine eigene Methode erzeugen (und den Block als Parameter übergeben).


Javes - Fr 01.09.17 12:33

Okay ich werde es versuchen! Danke für die Hilfe! - Okay habs geschaft mit Hilfe einer foreach Schleife der Code:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
foreach (Control x in this.Controls)
            {
                if (x is PictureBox && x.Tag == "platform")
                {
                    if (player.Top + player.Height > x.Top && player.Left + player.Width > x.Left && player.Right - player.Width < x.Right && player.Top < x.Top)
                    {
                        parachute.Visible = false;
                        jump = false;
                        player.Top = x.Location.Y - player.Height;
                        Force = 0;
                    }
                    if (player.Top < x.Top + x.Height && player.Left + player.Width > x.Left && player.Right - player.Width < x.Right && player.Top + player.Height > x.Top)
                    {
                        Force = 0;
                    }
                    //if (player.Left + player.Width > x.Left && player.Top + player.Height > x.Top && player.Right + player.Width > x.Right && player.Top < x.Top + x.Height)
                    //{
                    //    player.Left = x.Left - player.Width;
                    //}
                }
           }