[VB6] Fout met de X en Y as berekenen.

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • xehbit
  • Registratie: Februari 2009
  • Laatst online: 26-08 22:19
Hallo,

Er gaat iets fout met het berekenen van de X en de Y as.

Het volgende werkt niet goed

Visual Basic:
1
2
3
4
5
6
7
        If killx(posX(0)) = True And killy(posY(0)) = True Then
            Me.Caption = "Speler " & k + 1 & " Heeft verloren!"
        Else
            level.PaintPicture p(k).Picture, posX(k) * 100, posY(k) * 100, 100, 100
            killx(posX(0)) = True
            killy(posY(0)) = True
        End If


Telkens als ik van positie posX van 10 naar 11 ga is er niks aan de hand. Maar ga ik met posY van 4 naar 5 en posX weer van 11 naar 10 dan Loopt het hele script raar. Dan staat er de hele tijd speler..heeft verloren

Ik zou niet weten wat her fout aan is. :?

[ Voor 0% gewijzigd door een moderator op 12-05-2009 21:06 . Reden: Code tags toegevoegd ]


Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
En wat is k op dat moment? Want dat is de variabele die het probleem geeft

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Acties:
  • 0 Henk 'm!

  • xehbit
  • Registratie: Februari 2009
  • Laatst online: 26-08 22:19
Ik geef wel even wat meer vrij O-)

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Private Sub Timer1_Timer()
    On Error Resume Next
    Dim k As Integer
    For k = 0 To 3
        If GetAsyncKeyState(keyup(k)) And stat(k) <> "GO:DOWN" Then stat(k) = "GO:UP"
        If GetAsyncKeyState(keydown(k)) And stat(k) <> "GO:UP" Then stat(k) = "GO:DOWN"
        If GetAsyncKeyState(keyleft(k)) And stat(k) <> "GO:RIGHT" Then stat(k) = "GO:LEFT"
        If GetAsyncKeyState(keyright(k)) And stat(k) <> "GO:LEFT" Then stat(k) = "GO:RIGHT"
    
        If stat(k) = "GO:LEFT" Then posX(k) = posX(k) - 1
        If stat(k) = "GO:RIGHT" Then posX(k) = posX(k) + 1
        If stat(k) = "GO:UP" Then posY(k) = posY(k) - 1
        If stat(k) = "GO:DOWN" Then posY(k) = posY(k) + 1
        
        If killx(posX(0)) = True And killy(posY(0)) = True Then
            Me.Caption = "Speler " & k + 1 & " Heeft verloren!"
        Else
            level.PaintPicture p(k).Picture, posX(k) * 100, posY(k) * 100, 100, 100
            killx(posX(0)) = True
            killy(posY(0)) = True
        End If
    Next k
End Sub


Dat is het gehele deel van de timer ;)

[ Voor 0% gewijzigd door een moderator op 12-05-2009 21:05 . Reden: Code tags toegevoegd ]


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 21-09 10:43

Matis

Rubber Rocket

codetags graag...
MSalters schreef op dinsdag 12 mei 2009 @ 20:08:
En wat is k op dat moment? Want dat is de variabele die het probleem geeft
Als je daar nu eens antwoord op geeft!

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • xehbit
  • Registratie: Februari 2009
  • Laatst online: 26-08 22:19
de 'k' is een waarde van 0 tot 3 oftewel ook te zien in de source...
Die staat in een loop van de timer.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Waarom de "On Error Resume Next"? Dat debugged lekker :X Heb je überhaupt al gedebugged trouwens? (Debuggen: Hoe doe ik dat?) Met VB6 kun je met (ik meen) F9 een breakpoint zetten in je code en met F8 er door heen stappen. Dan moet je zo kunnen zien wat er mis gaat.

En gebruik voortaan de code tags a.u.b.; ik heb het nu even voor je gedaan.
Dragon707 schreef op dinsdag 12 mei 2009 @ 20:55:
de 'k' is een waarde van 0 tot 3 oftewel ook te zien in de source...
8)7 Joh. Als je nou had gezegd: K is speler 0 tot 3 dan was het al stukken duidelijker geweest.
Dragon707 schreef op dinsdag 12 mei 2009 @ 20:03:
... dan Loopt het hele script raar.
Wij zijn hier niet om voor jou te debuggen. Op z'n minst een fatsoenlijke omschrijving (en dus niet "loopt raar") is wel zo fijn voor ons om niet eerst in onze glazen bol te hoeven gaan kijken. Maar meer dan "loopt raar" zul je inderdaad, als je niet gedebugged hebt, kunnen zeggen. Daarom is debuggen zo belangrijk (en variabelenamen met betekenis en dus geen k maar "player" bijvoorbeeld).

Daarbij is VB6 geen "scripttaal" en dus spreken we niet van "script" maar van "code" of "programma" ;)

[ Voor 92% gewijzigd door RobIII op 12-05-2009 21:10 ]

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


Acties:
  • 0 Henk 'm!

  • xehbit
  • Registratie: Februari 2009
  • Laatst online: 26-08 22:19
Debugged. Maar geeft geen fouten. Hij tekent gewoon geen lijntjes op bepaalde plaatsen.

Afbeeldingslocatie: http://www.fileload.nl/uploads/images/c9bf9bca86.jpg

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Dragon707 schreef op dinsdag 12 mei 2009 @ 21:14:
Debugged. Maar geeft geen fouten.
Wiedes met "On Error Resume Next" erin :X
Dragon707 schreef op dinsdag 12 mei 2009 @ 21:14:
Hij tekent gewoon geen lijntjes op bepaalde plaatsen.
Je dénkt dat je gedebugged hebt, maar dat heb je niet. Heb je al eens naar je array bounds gekeken? Watches op variabelen gezet? Stap voor stap door je code gelopen met een breakpoint en de debugger? Desnoods met debug.print intermediate waardes of dumps van je arrays afgedrukt? Je maakt mij niet wijs dat je in die schamele paar regels code geen fout kunt vinden met de (toch wel aardig goeie) debugger van VS6. Nuh huh. No sirrrrreeee :P

[ Voor 6% gewijzigd door RobIII op 12-05-2009 21:23 ]

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


Acties:
  • 0 Henk 'm!

  • xehbit
  • Registratie: Februari 2009
  • Laatst online: 26-08 22:19
Ik zal zo wel eens de hele source uploaden,


Dat is dus niet de bedoeling

[ Voor 115% gewijzigd door Woy op 12-05-2009 21:38 . Reden: Was ff uploade :P ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Dat is dus niet de bedoeling. RobIII geeft je terecht een opmerking dat je wat beter moet debuggen. Het is hier dus niet de bedoeling om dan maar de volledige source te gaan dumpen, in de hoop dat wij het probleem voor je gaan zoeken. Relevante stukken code zien we graag, maar dus geen complete programma's.

Met "On Error Resume Next" negeer je gewoon eventuele foutmeldingen. Verder staan er nog meer handige tips in de FAQ die RobIII al aanhaalt. Heb je al wel eens een break-point gezet, en gekeken wat er precies in het stukje code gebeurt?

[ Voor 19% gewijzigd door Woy op 12-05-2009 21:43 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 00:53

Reptile209

- gers -

Ik was Woy net voor :). De relevante code staat eigenlijk al in Dragon707 in "[VB6] Fout met de X en Y as berekenen."

Ik ga het niet helemaal kado geven, maar je programma doet precies wat het moet doen: bij iedere timer die afgevuurd wordt, laat hij zien dat je verloren hebt. Hint: je moet dus niet alleen constateren dat iemand verliest (zoals je nu doet), maar daar ook een actie mee ondernemen in je programma (en niet stomweg je worm blijven tekenen). Voorbeeldje: als je een BSOD genereert met 'Speler 0 heeft verloren', stopt je programma en dan krijg je de melding niet meer. :+

[ Voor 14% gewijzigd door Reptile209 op 12-05-2009 21:46 ]

Zo scherp als een voetbal!


Acties:
  • 0 Henk 'm!

  • xehbit
  • Registratie: Februari 2009
  • Laatst online: 26-08 22:19
Dat heb ik ook al voledig weggehaald. MAar ik krijg erna nog steeds geen melding......

Het werkt verder gewoon niet, Ik ben er trouwens al bijna 7uur mee bezig met het zelfde probleem.

Acties:
  • 0 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 00:53

Reptile209

- gers -

Dragon707 schreef op dinsdag 12 mei 2009 @ 21:46:
Dat heb ik ook al voledig weggehaald. MAar ik krijg erna nog steeds geen melding......

Het werkt verder gewoon niet, Ik ben er trouwens al bijna 7uur mee bezig met het zelfde probleem.
Ga dan eens stap voor stap kijken waarom het niet doet wat je wil. Zet een break-point in de timer code en check dan eens stap voor stap (F8) wat er gebeurt. Kijk welke waarden de variabelen hebben (Watch of mouseover) en bedenk welke waarden ze volgens jou zouden moeten hebben. Kijk welke delen van de IF's er doorlopen worden, en of dat klopt met de logica die je in je hoofd had.

VB doet precies wat je vraagt, je vraagt alleen niet de juiste dingen! ;)

Zo scherp als een voetbal!


Acties:
  • 0 Henk 'm!

  • xehbit
  • Registratie: Februari 2009
  • Laatst online: 26-08 22:19
Reptile209 schreef op dinsdag 12 mei 2009 @ 21:43:
Ik was Woy net voor :). De relevante code staat eigenlijk al in Dragon707 in "[VB6] Fout met de X en Y as berekenen."

Ik ga het niet helemaal kado geven, maar je programma doet precies wat het moet doen: bij iedere timer die afgevuurd wordt, laat hij zien dat je verloren hebt. Hint: je moet dus niet alleen constateren dat iemand verliest (zoals je nu doet), maar daar ook een actie mee ondernemen in je programma (en niet stomweg je worm blijven tekenen). Voorbeeldje: als je een BSOD genereert met 'Speler 0 heeft verloren', stopt je programma en dan krijg je de melding niet meer. :+
Ja, dat weet ik. Maar het was alleen om even te kijken als je over een andere worm heen gaat ov er tegen aan botste dat er in de me.caption=... iets komt te staan om te kijken of het werkt. Maar dat is dus niet zo. En dat is het probleem ook. Want hij tekent door dat script niet verder,

Acties:
  • 0 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 00:53

Reptile209

- gers -

Dragon707 schreef op dinsdag 12 mei 2009 @ 21:51:
[...]
Want hij tekent door dat script niet verder,
Dat vraag je toch ook van VB? Je code zegt: als er een kill is, dan moet je een tekst afdrukken, anders moet je dingen tekenen. Je krijgt nu dus ofwel een tekst, ofwel een plaatje. Niet beiden.

En misschien blijft er wel een kill() op True staan, die eigenlijk helemaal niet meer True zou moeten zijn... debug it, understand it, learn from it! :)

Hieronder:
Dragon707 schreef op dinsdag 12 mei 2009 @ 21:57:
Dat snap ik, Heb je de code al eens ge-runt? Misschien zie jij dan wat ik bedoel. Met het probleem dat ik momenteel heb.
Dat ga ik niet doen (heb de link en je onmeunig lange passcode al niet meer en ook geen VB geinstalleerd) en ik denk dat niemand dat hier gaat doen. Daar leer je ook niks van! Je moet zelf kunnen begrijpen wat je code doet, en waarom dat anders is dan wat je verwachtte. D-E-B-U-G.

</slowchat>

[ Voor 51% gewijzigd door Reptile209 op 12-05-2009 22:00 ]

Zo scherp als een voetbal!


Acties:
  • 0 Henk 'm!

  • xehbit
  • Registratie: Februari 2009
  • Laatst online: 26-08 22:19
Dat snap ik, Heb je de code al eens ge-runt? Misschien zie jij dan wat ik bedoel. Met het probleem dat ik momenteel heb.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Maar heb je nu al eens een breakpoint gezet op de plek dat je denkt dat hij wat anders doet dan je denkt? Dan kun je daar gewoon kijken wat er verkeerd gaat. Zet desnoods aan het begin van je Timer methode een breakpoint. En haal A.U.B. de "On Error Resume Next" weg, dat is echt enorm fout, aangezien je er gewoon alle errors mee negeert.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • xehbit
  • Registratie: Februari 2009
  • Laatst online: 26-08 22:19
On Error Resume Next is al lang weg, Het is uiteindelijk toch gelukt. Ik heb gewoon de dood line anders gemaakt.

Kijk zo is het nu:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Private Sub Timer1_Timer()
    Dim k As Integer
    For k = 0 To 0

        If GetAsyncKeyState(keyup(k)) And stat(k) <> "GO:DOWN" Then stat(k) = "GO:UP"
        If GetAsyncKeyState(keydown(k)) And stat(k) <> "GO:UP" Then stat(k) = "GO:DOWN"
        If GetAsyncKeyState(keyleft(k)) And stat(k) <> "GO:RIGHT" Then stat(k) = "GO:LEFT"
        If GetAsyncKeyState(keyright(k)) And stat(k) <> "GO:LEFT" Then stat(k) = "GO:RIGHT"
    
        If stat(k) = "GO:LEFT" Then posX(k) = posX(k) - 1
        If stat(k) = "GO:RIGHT" Then posX(k) = posX(k) + 1
        If stat(k) = "GO:UP" Then posY(k) = posY(k) - 1
        If stat(k) = "GO:DOWN" Then posY(k) = posY(k) + 1
        
        If killline(posX(k), posY(k)) = True Then
            Me.Caption = "Speler " & k + 1 & " Heeft verloren!"
        Else
            level.PaintPicture p(k).Picture, posX(k) * 100, posY(k) * 100, 100, 100
            Me.Caption = killline(posX(k), posY(k)) & "-" & posX(k)
            killline(posX(k), posY(k)) = True
        End If
            
    Next k
End Sub

En het werkt zoals het moet werken.

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 21-09 10:43

Matis

Rubber Rocket

Dragon707 schreef op dinsdag 12 mei 2009 @ 22:11:
On Error Resume Next is al lang weg, Het is uiteindelijk toch gelukt. Ik heb gewoon de dood line anders gemaakt.

Kijk zo is het nu:
code:
1
[...]

En het werkt zoals het moet werken.
Mooi dat te horen, de code had je ook nog kunnen highlighten door

[code=vb]....[/code]

te gebruiken in je code tags. Dat leest stukken fijner!

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • danslo
  • Registratie: Januari 2003
  • Laatst online: 21-09 14:07
Of je leert gewoon te debuggen zodat je begrijpt wat er mis gaat en de volgende keer niet zo snel een vraag hoeft te stellen.
Pagina: 1