Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C#] - 1945 spel.

Pagina: 1
Acties:

  • JST94
  • Registratie: Juli 2009
  • Laatst online: 31-07 13:28
Beste Tweakers,

Ik heb een schoolopdracht gekregen. Het is een spelletje, de bedoeling van dit spel is dat je met je toetsenbord een vliegtuigje van links naar rechts kan laten vliegen. Als je op spatiebalk drukt vuurt je vliegtuig een kogel af. Als je op Enter drukt start je het spel. Zodra je het spel start komen er vliegtuigjes je beeld in gevlogen. De bedoeling is is dat je de vliegtuigjes die je beeld in komen gevlogen dat die worden neergeschoten. Alles gaat goed, tot aan de Collision check. Ik weet niet exact wat er mis is aan de Collision check. Maar soms schiet hij hem wel neer en soms weer niet. Daarvoor heb ik even jullie hulp nodig om te kijken wat er nog ontbreekt aan de controle.

De Collision check:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Controle of vliegtuig en kogel elkaar raken.
            for (int Z = 0; Z < 10; Z++)
            {
                if (Bullet[Z].Visible == true)
                {
                    for (int Q = 0; Q < 20; Q++)
                    {
                        if (Vijand[Q].Visible == true && Bullet[Z].Location.X + 10 > Vijand[Q].Location.X && Bullet[Z].Location.X + 10 < Vijand[Q].Location.X + 32 && Bullet[Z].Location.Y + 5 == Vijand[Q].Location.Y)
                        {
                            Vijand[Q].Visible = false;
                            Vijand[Q].Enabled = false;
                            Bullet[Z].Visible = false;
                            Bullet[Z].Enabled = false;
                            Score += 5;
                            lblScore.Text = Score.ToString();
                        }
                    }
                }
            }


Ik probeer hier de kogel zo dicht mogelijk tegen het vliegtuigje aan te laten komen. Dat komt omdat de kogel in een picture box staat. Ik wil niet dat de kogel vlak langs het vliegtuigje af gaat, maar dat het vliegtuigje dan alsnog neergeschoten word.

Ik hoop dat jullie me iets verder op weg kunnen helpen zodat de Collision check continue werkt, en niet de ene keer wel en de andere keer niet.

Bedankt ! _/-\o_

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
En wat heb je zelf al geprobeerd? Heb je al eens gedebugged? (Debuggen: Hoe doe ik dat?). Zet eens een breakpoint in je collision detection en stap er doorheen wanneer er een collision is.

Verder is het handig als je even je variabelen Q, Z etc hernoemd naar iets dat wij ook snappen. En je hebt max. 20 vijanden in beeld ofzo? Want vijand 21 en verder zullen nooit ge-collision-checked worden. Idem voor kogels, maar dan 10.

Tot slot is het handig(er) om de binnenste "if" te refactoren naar een method die zoiets doet:
C#:
1
2
3
if (Vijand[Q].Visible == true && IsCollision(Bullet[Z], Vijand[Q])) {
...
}

Dat leest namelijk wel zo prettig in vergelijk met een buttload aan and's en location-foo en location-bar's in je if. In de IsCollision() method kun je dan ook nog eens gebruik maken van iets als Rect.Contains(Point) om 't geheel nog leesbaarder te maken.

[ Voor 22% gewijzigd door RobIII op 18-09-2013 17:16 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • JST94
  • Registratie: Juli 2009
  • Laatst online: 31-07 13:28
RobIII schreef op woensdag 18 september 2013 @ 17:11:
En wat heb je zelf al geprobeerd? Heb je al eens gedebugged? (Debuggen: Hoe doe ik dat?). Zet eens een breakpoint in je collision detection en stap er doorheen wanneer er een collision is.

Verder is het handig als je even je variabelen Q, Z etc hernoemd naar iets dat wij ook snappen. En je hebt max. 20 vijanden in beeld ofzo? Want vijand 21 en verder zullen nooit ge-collision-checked worden. Idem voor kogels, maar dan 10.

Tot slot is het handig(er) om de binnenste "if" te refactoren naar een method die zoiets doet:
C#:
1
2
3
if (Vijand[Q].Visible == true && IsCollision(Bullet[Z], Vijand[Q])) {
...
}

Dat leest namelijk wel zo prettig in vergelijk met een buttload aan and's en location-foo en location-bar's in je if. In de IsCollision() method kun je dan ook nog eens gebruik maken van iets als Rect.Contains(Point) om 't geheel nog leesbaarder te maken.
De Z staat gewoon voor het aantal kogels. Ik heb mijn programma zo gemaakt dat de Array maar 10 Kogels hoeft te kunnen bevatten maar dat ik wel continue door kan blijven schieten. Met vliegtuigen was dit eerst ook 10, maar dit heb ik verhoogt naar 20. Omdat hij soms wat moeite had om het draaiende te houden.

Qua fouten eruit halen is er al heel wat uitgehaald. Eerst werkte heel mijn controle nog niet. Maar na wat puzzelwerk ben ik hier op uitgekomen. Alleen het werkt niet 100%, de ene keer pakt die hem wel en de andere keer niet. Maar waarom weet ik dus niet. Ik dacht eerst dat het met mijn locaties te maken had, maar na wat gepuzzel met dat denk ik dat dat hem ook niet is.


__ UPDATE

Collision check is gelukt, Ik heb hem nog een keer extra op een Y-waarde laten controleren. Hierdoor blijkt hij ineens wel te werken. Waarom hij hierdoor wel werkt, dat snap ik zelf ook niet.

[ Voor 5% gewijzigd door RobIII op 18-09-2013 19:41 . Reden: Quote gefixed... ]


  • bwerg
  • Registratie: Januari 2009
  • Niet online

bwerg

Internettrol

Om toch nog een extra tip te geven: zet het aantal vliegtuigen/kogels niet vast op 20/10, maar hou dit aantal vrij. Dat lukt waarschijnlijk niet met arrays (of je moet de arrays gewoon belachelijk groot nemen en dan maar hopen dat ze nooit vol raken), maar daarvoor kun je Lists gebruiken (of eventueel andere datastructuren maar Lists zijn wel gemakkelijk), waar je zoveel dingen in kan stoppen als je wil. Dan loop je ook niet het risico dat dingen stuk gaan omdat je ineens een kogel te veel in beeld hebt.

Mocht je dat niet doorvoeren, dan is het handig om die 10 en 20 niet zomaar in de code te zetten maar om dit als constanten te benoemen. Dus NR_BULLETS = 10 of zo. Mocht je dat willen veranderen dan hoef je niet overal te gaan zoeken waar je die waarde hebt gebruikt.

[ Voor 4% gewijzigd door bwerg op 18-09-2013 19:37 ]

Heeft geen speciale krachten en is daar erg boos over.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
JustMU schreef op woensdag 18 september 2013 @ 17:25:
De Z staat gewoon voor het aantal kogels.
Dat is voor jou misschien "gewoon", voor mij (en ons) is Z gewoon Z. Wij zien aan Z niet dat 't 't aantal kogels voorstelt. Als je 't bulletIndex had genoemd ofzo was 't een stuk duidelijker geweest voor jezelf en anderen ;)
JustMU schreef op woensdag 18 september 2013 @ 17:25:
Qua fouten eruit halen is er al heel wat uitgehaald. Eerst werkte heel mijn controle nog niet. Maar na wat puzzelwerk ben ik hier op uitgekomen. Alleen het werkt niet 100%, de ene keer pakt die hem wel en de andere keer niet. Maar waarom weet ik dus niet.
En daarom moet je dat probleem dus (ook) debuggen ;)
JustMU schreef op woensdag 18 september 2013 @ 17:25:
Ik dacht eerst [...] maar na wat gepuzzel met dat denk ik [...]
Assumptions are the mother of all fuckups ;) Meten == weten ==> debuggen :Y)
JustMU schreef op woensdag 18 september 2013 @ 17:25:
Collision check is gelukt, Ik heb hem nog een keer extra op een Y-waarde laten controleren. Hierdoor blijkt hij ineens wel te werken. Waarom hij hierdoor wel werkt, dat snap ik zelf ook niet.
Als je nou slim bent "puzzel" je dat even uit; een "a-ha erlebnis" is een goed leermoment en een fout die je in de toekomst minder maakt ;) Niet te snel "move on" naar 't volgende probleem.

Verder geeft bwerg hierboven wat goeie tips (maar gebruik dan wel een List<T> i.p.v. een List ;) )

[ Voor 3% gewijzigd door RobIII op 18-09-2013 19:45 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • staefke
  • Registratie: December 2003
  • Laatst online: 14-11 20:41
je probeert een bounding box te maken maar voor de Y as gaat dat niet goed, daar check je of de y locatie + 5 van de kogel exact gelijk is aan de y-locatie van het vliegtuig

code:
1
... && Bullet[Z].Location.Y + 5 == Vijand[Q].Location.Y


hier ook een range check op doen zou het moeten verhelpen

duh ?

Pagina: 1