Autor Beitrag
Javes
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 01.09.17 10:50 
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?

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 01.09.17 12:11 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Javes Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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).

Für diesen Beitrag haben gedankt: Javes
Javes Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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:
ausblenden 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;
                    //}
                }
           }