Paint uit List

Status
Niet open voor verdere reacties.

Tommiiee

Gebruiker
Lid geworden
6 feb 2010
Berichten
93
Hoi allemaal,

Ik zit met een probleem m.b.t. painten vanuit een list.
Het volgende staat in mijn Form1_paint:
Code:
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics graphics = e.Graphics;
            List<Medicine> hulp;
            hulp = game.Medicijnen();

            foreach (Medicine m in hulp)
            {
                int x = m.CorX;
                int y = m.CorY;
                int width = m.Straal * 2;
                int height = m.Straal * 2;
                graphics.FillEllipse(Brushes.Black, x, y, width, height);
            }
        }
Zo worden, zoals je kunt zien, cirkels getekend. Deze worden getriggerd op een MouseDown. Hoe langer je deze ingedrukt houdt, hoe groter de cirkel wordt. Als je de knop loslaat wordt de cirkel definitief, en behoudt deze zijn grootte.

Het probleem is echter: ik zie de cirkel niet groeien! Pas als ik de knop loslaat zie ik het resultaat. Ik heb op elk denkbare plek een "Refresh()" staan.. Als ik niet uit een list teken, krijg ik het wel gedaan, doe ik dat wel doe, krijg ik het niet voor elkaar.

Wat doe ik hier niet goed?

Mvg,
Tom

PS. Mochten jullie meer info nodig hebben, dan zal ik die meteen plaatsen. Wist niet direct wat jullie nodig hadden, aangezien ik nooit eerder een vraag over C# heb geplaatst.
 
probeer een timer, inplaats van bij eventhandlers.

Dit zorgt dat hij elke X miliseconde update.
 
Ik maak gebruik van een timer..

Deze wordt "enabled" op het MouseDown-event, en "disabled" op het MouseUp-event..


Even voor de duidelijkheid:
Als ik de Ellipses niet wegschrijf naar een List, dan zie ik ze wel groeien. Maar daar heb ik niks aan, want ik heb meerdere cirkels nodig. Als ik ze niet wegschrijf naar een List, dan wordt er steeds een nieuwe getekend.
 
Laatst bewerkt:
Kan je anders de cirkel die je op dat moment niet in de list gooien, maar eerst gewoon met een variabele aangeven, en daarna zodra bij mouseup hem in de list stoppen. Dus dat je naast die list, gewoon ook de variabele tekent.
 
Goed plan, ga er straks mee aan de slag :)

Ik laat nog wel weten hoe het afgelopen is.
 
Ben ik weer XD

Het is nu gelukt, wat ik echter niet voor elkaar krijg, is om die ballen die ik teken, te laten bewegen..

Hoe krijg ik een bal (getekend met de Paint-event) zover om in alle richtingen, willekeurig te bewegen?

Mvg,
Tom
 
Umm, dat is wat moeilijker uit te leggen. Dat kan op verschillende manieren. Maar probeer dit is:

Je moet de CorX veranderen van elke medicine. Dsu: Stop dit in een Timer
Code:
 foreach (Medicine m in hulp)
            {
                int m.CorX  += 1;
                int m.CorY += 1;
            }

Als je nou echt een richting enz. wil aangeven dan moet je ook een List<> hebben en je moet een struct creeren.
Code:
private struct Velocity
        {
            public float X;
            public float Y;
            public Velocity(float X, float Y)
            {
                this.X = X;
                this.Y = Y;
            }
        }

En dan gewoon:
Code:
List<Velocity> BallVelocitys;

En deze moet dan gelijk worden upgedate met de medicine list.

SOrry, het is moeilijk zo uit te leggen omdat ik niet de volledige code heb. Maar kijk maar hoever je komt.

Of een andere manier:
Je creert een Class genaamd Ball.
Deze class maak je public, en add je een paar variable en een functie:
Code:
    public float X, Y;
        public float VelX, VelY;
        public void Update()
        {
            X += VelX;
            Y += VelY;
        }

En dan kan je gewoon ball.Update() gebruiken. om zijn positie te herwijzigen.
 
Hoi,

Bedankt voor de moeite! Het wil echter niet echt lukken. En sommige ideeën (zoals een struct) heb ik nog nooit mee gewerkt..

Ik heb hier de code geupload, mocht je het interessant vinden om ernaar te kijken..

Toch bedankt. Ik ga nog wat zitten sleutelen.
Als je naar de code gekeken hebt, hoor ik het vanzelf.

Mvg,
Tom ;)
 
Nee hoor..

De bal gaat nu vanuit het midden naar rechtsonder.. Dat is niet de bedoeling.. De bal moet een willekeurige richting ingaan, en van de zijkanten en onder- en bovenkant afketsen.. De bal verdwijnt nu gewoon uit beeld..

En als je meerdere ballen toevoegt, beweegt er maar één..
 
Het werkt precies zoals ik wilde! :thumb:
Heb echter nog een aantal vragen, om te kijken of ik het begrijp:

- Kun je ook controleren of de ballen stil staan? Ik heb nu een paar keer getest, en bij sommige keren (bij meerdere ballen), stonden sommige ballen stil.. Is het mogelijk om een controle in te bouwen? Is het ook mogelijk om te controleren of een bal precies horizontaal of verticaal gaat? Dus dat het niet mogelijk is dat hij alleen maar naar links-rechts of boven-beneden beweegt..


- Zorgt onderstaande code voor alleen het bewegen zelf, of ook voor het afketsen van muren?
Code:
        public void MovementVirus()
        {
            foreach (Virus v in virusbeheer.Virus)
            {
                if (v.CorY < 0)
                    v.VelY *= -1;
                if (v.CorX < 0)
                    v.VelX *= -1;
                if (v.CorX + v.Straal > Width)
                    v.VelX *= -1;
                if (v.CorY + v.Straal > Height)
                    v.VelY *= -1;
                v.CorX = v.CorX + v.VelX;
                v.CorY = v.CorY + v.VelY;
            }
        }

- In het volgende stukje code, wat doet de "myRandom.Next(-1,2)" precies? Met name: Waar komen de getallen "-1" en "2" vandaan?
Code:
        public void VoegVirusToe(int aantalVirussen)
        {
            for (int i = 0; i < aantalVirussen; i++)
            {
                int straal = 30;
                virusbeheer.ItemToevoegen(myRandom.Next(-1, 2), myRandom.Next(-1, 2), straal, myRandom.Next(straal, Width - straal), myRandom.Next(straal, Height - straal));
            }
        }

Ik zal ongetwijfeld met meer vragen komen, maar ik kan een heel stuk vooruit :)
Nu nog de botsingen met andere ballen regelen. Daar zou ik in principe zelf moeten kunnen uitwerken, maar als ik nog vragen heb, weet ik waar ze te stellen ;)

Super bedankt!

Tom

Edit: Zou je me ook kunnen vertellen wat "MyPanel.cs" doet? Ik ben er niet mee bekend..
 
Laatst bewerkt:
MyPanel heb ik zelf gecreerd om microsoft protection van de panel usercontrol af te halen. Hij is doublebuffered dus dat in dat hij beter en sneller en mooeier tekent.

Random(-1,2) creert een getal: -1,0,1. En hij gaat dus naar onder naar boven of staat stil. In de X en de Y richting.

Een controle om ballen stil te laten staan is, if (VelX == 0 && VelY ==0)
Daar heb je hem.

En de onderstaande code zorgt voor beiden.
eerst verandert die snelheid als je in de muur zit.
daarna update hij je positie met de nieuwe snelheid.

BTW:
alles staat in int's, maar het is veel beter als je dat allemaal naar floats verandert. Als je dit doet kan je veel preciezer bewegingen aangeven etc.

En ten tweede. Het is niet handig voor alles een nieuwe class aan te maken, want na een tijdje wordt dat gewoon onhandig.
Want jij hebt nu form > game > virusbeheer > virus. En als je dan op de form een virus wil aan vragen dan moet dat via game via virusbeheer etc. Dus dan wordt je Game code moet ze dan allemaal gaan linken en als je dan echt veel data krijgt wordt je game code heel groot.
 
Laatst bewerkt:
Bedankt voor de uitleg en tips. Ik ga kijken wat ik eraan kan doen.

Als ik nog ergens vastloop, hoor je het vanzelf ;)

Mvg,
Tom
 
Een controle om ballen stil te laten staan is, if (VelX == 0 && VelY ==0)
Hoi,

Waar moet deze precies komen (die 'if')?
Ik heb 'm op een aantal plaatsen geprobeerd, maar óf het werkt niet, óf hij loopt vast..
Kun jij me vertellen waar ik deze neer moet zetten? :)
 
probeer dit:
Code:
     int VelX = 0;
                int VelY = 0;
                while (VelX == 0 && VelY == 0)
                {
                    VelX = myRandom.Next(-1, 2);
                    VelY = myRandom.Next(-1, 2);
                }
 
Voor zover ik kan zien werkt het. Thanks:thumb:

Nog een vraagje (je zult wel gek worden):

Ik heb nu een "bots-detectie" ingebouwd. Iets wat controleert of de "virussen" (rode balletjes) tegen elkaar komen.. Dat lukt, maar wat er gebeurt is: de balletjes blijven aan elkaar plakken, in plaats van dat ze van elkaar afketsen..

Zou jij kunnen kijken wat ik verkeerd doe?
Ik heb hier de meest recente versie geupload.

Mvg,
Tom

PS. Heb helaas het panel dat je gemaakt had eruit moeten slopen, maar dat ga ik nog terugzetten. Heeft een bepaalde reden.
 
De vraag die jij nu stelt is erg ingewikkeld, maar of je moet een physics engine importeren, of misschien heb je hier iets aan:
http://compsci.ca/v3/viewtopic.php?t=14897
Dit ga ik niet voor je doen omdat dat echt heel veel tijd kost etc. En ik importeer dan een 2D physics engine inplaats van het zelf te gaan coden.
 
Hmm oké..

Ander vraagje (wat kleiner)..
Mijn ENUM in die versie schijnt niet te werken. Ik zie alleen niet wat ik fout doe..

In mijn Form1 staat een code gecommentaard (if blabla).. die controleert of een bal "active" is.. Als dit zo is, moet hij dus getekend worden. Maar zodra ik dit dus daar neerzet, wordt alleen nog de variabele nog getekend. Dus niet uit de list (en de bal verdwijnt dus..)

Ik krijg de fout niet gevonden. Volgens mij geef ik toch echt in VirusBeheer ItemToevoegen op dat dan de status op Active gezet moet worden..

Zie jij de fout?
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan