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; } if (left == true) { player.Left -= 5; } if (jump == true) { player.Top -= Force; Force -= 1; }
if (player.Top + player.Height >= screen.Height) { player.Top = screen.Height - player.Height; jump = false; } else { player.Top += 5; }
if (player.Left + player.Width >= screen.Width) { player.Left = screen.Width - player.Width; player.Top += 5; }
if (player.Left <= 0) { player.Left = 0; }
if (player.Top <= 0) { player.Top = 0; Force = 0; } 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; }
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 Th69: 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 -
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; //} } } |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!