Autor Beitrag
Rakeem
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: Mi 08.12.10 20:55 
mein problem ist das er nicht immer in 45 grad abprallen soll sonder auch mal grade aus gehen soll krieg das aber nicht wirklich hin krieg halt nur entweder grade aus oder einen winkel von 45 grad hin
[quote]
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:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        int BallX, BallY;
        bool boolAbfrage = true, boolAbfrage1 = true;

        public Form1()
        {
            InitializeComponent();
        }

        private void OnPaint(object sender, PaintEventArgs e)
        {
            if (boolAbfrage == true)
            {
                BallX++;// bewegung X richtung
                if (BallX == 200// Kollisionsabfrage X richtung rechts
                {
                    boolAbfrage = false;
                }
            }
            if (boolAbfrage == false)
            {
                BallX--;
                if (BallX == 8// Kollisionsabfrage X richtung links
                {
                    boolAbfrage = true;
                }
            }
            if (boolAbfrage1 == true)
            {
                BallY++; // bewegung Y richtung
                if (BallY == 300// Kollisionsabfrage Y richtung unten
                {
                    boolAbfrage1 = false;
                }
            }
            if (boolAbfrage1 == false)
            {
                BallY--;// bewegung Y richtung
                if (BallY == 10// Kollisionsabfrage Y richtung oben
                {
                    boolAbfrage1 = true;
                }
            }
            panel1.Location = new System.Drawing.Point(BallX, BallY);
            Thread.Sleep(5);
            panel1.Refresh();
        }
    }
}
[cs]
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 08.12.10 21:06 
Hallo!

(1) Bitte benutze Satzzeichen und auch die Möglichkeit, Substantive groß zu schreiben. Rechtschreibung ist nicht zum Spaß da, sondern weil man dadurch Texte viel leichter lesen und verstehen kann.

(2) Versetz Dich mal in jemanden hinein, der nicht vor Deinem Projekt sitzt, der also nur Deinen Beitrag liest. Dann wirst Du merken, dass Du zumindest mal sagen solltest, was Dein Programm machen soll, welche Komponenten welche Aufgaben haben und dann dein Problem beschreiben.

Danke schön! :zustimm:

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Rakeem Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: Mi 08.12.10 21:11 
Mein Programm soll das Pannel eigentlich nur in verschidenen Winkel bewegen. Also soll das Pannel einmal in einem Winkel von 45 grad bewegt werden und bei der Kollision soll dann einfach das Pannel gerade aus zurück prallen.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 08.12.10 22:11 
Hallo Rakeem,

du hast ein ganz anderes Problem. Darf ich fragen, woher du die WinForms-Programmierung lernst (Buch, Tutorial, Ausbildung etc...)?

In der Paint-Methode sollte nur gezeichnet werden - keine Logik, keine Änderung von anderen Controls und vor allen Dingen kein Thread.Sleep() - dieses hält den Hauptthread an!).

Ein gutes Buch (bzw. Online-Tutorial) wäre das OpenBook "Visual C#": www.galileocomputing...nbook/visual_csharp/

Desweiteren ein Artikel zum korrekten Zeichnen in WinForms: www.mycsharp.de/wbb2...d.php?threadid=21782

Für die Ballbewegung solltest du einen Timer (anstatt dem Thread.Sleep()) verwenden und in dessen Tick-Methode dann die Änderung vornehmen. Dort kannst du dann auch Invalidate() bzw. Refresh() aufrufen. Wenn du aber nur die 'Location' ändern willst, so brauchst du das nicht extra zu machen, dies passiert dann "von selbst".

Und zu deinem konkreten Problem:
Am besten, du definierst dir zwei Variablen 'stepX' und 'stepY', welche du am Anfang z.B. mit jeweils mit 1 belegst. Und bei der Kollision änderst du dann jeweils das Vorzeichen, d.h. -1.
Und in jedem Schritt (Timer.Tick) addierst du dann diese Schritte zu der aktuellen Position hinzu (bzw. bei negativen Schrittweiten wird halt abgezogen).

Als Source-Code dann in etwa so:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
private int ballX = 0;
private int ballY = 0;

private int stepX = 1;
private int stepY = 1;

void timer_Tick(object sender, EventArgs e)
{
  ballX += stepX;
  ballY += stepY;

  if(ballX <= 0 || ballX >= 200)
    stepX = -stepX;

  if(ballY <= 0 || ballY >= 300)
    stepY = -stepY;

  panel.Location = new Point(ballX, ballY);
}
Rakeem Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: Do 09.12.10 00:06 
Hi Th69,

Danke für die ganzen tollen Tipps werde jetzt versuchen es umzusetzen und das gallileo book mit zur hilfe zunehmen.