Benvenuto! Per postare e godere delle funzionalità del forum registrati, occorrono pochi secondi ed è gratis!

[RISOLTO][Aiuto] .X e .Y Random in un Panel
(Questo messaggio è stato modificato l'ultima volta il: 19/08/2011, 16:07 da Cato97.)

Coder
Messaggi: 633
Discussioni: 57
Registrato: 04-2011
Mix: 0
Come faccio ad impostare la posizione PictureBox2.Location.X e PictureBox2.Location.Y in un punto qualsiasi nel Panel1 ogni volta che viene compiuta un'azione specifica?

14/08/2011, 14:17
#1
Cerca
(Questo messaggio è stato modificato l'ultima volta il: 14/08/2011, 16:32 da digger.)

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
Allora, non fare troppo caso allo stile di programmazione etc, ma il concetto dovrebbe essere questo di questo piccolo esempio di codice.
Ho messo un panel, un picturebox all'interno e un button all'esterno giusto per creare l'evento.
Ad ogni pressione del button2 il picturebox si sposta all'interno del panel.

    VBNET Programming
  1. Public Class Form1
  2.  
  3. Private rnd_x, rnd_y As Integer
  4.  
  5. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  6. rnd_x = CInt(Int(((Panel1.Width - PictureBox1.Width) * Rnd()) + 1))
  7. rnd_y = CInt(Int(((Panel1.Height - PictureBox1.Height) * Rnd()) + 1))
  8.  
  9. Dim a As New System.Drawing.Point(rnd_x, rnd_y)
  10. PictureBox1.Location = a
  11.  
  12. End Sub
  13.  
  14. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  15. Randomize()
  16. End Sub
  17. End Class




digger
14/08/2011, 16:30
#2
Cerca

Coder
Messaggi: 633
Discussioni: 57
Registrato: 04-2011
Mix: 0
un +1 per digger!! u.u ora però vorrei dire all'applicazione che se la PictureBox2, "tocca", anche non completamente, la PictureBox3, deve incrementare il punteggio in una Label (si, sto creando un gioco)... volevo usare:

    VBNET Programming
  1. With PictureBox2
  2. If .Left = PictureBox3.Location.X And .Top = PictureBox3.Location.Y Then
  3. pnt.Text += 1
  4. End If
  5. End With


però questo va bene solo nel caso in cui la PictureBox2, si sovrapponga completamente alla PictureBox3... mi sapresti dire un'altro modo per fare come ti ho detto? (un'altro +1 in ballo Asd )

14/08/2011, 17:47
#3
Cerca

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
non ho modo di fare prove ora, ma ad occhio e croce dovrebbe essere cosi,
quindi non ti scrivo il codice ma "pseudocodice" per farti capire il concetto, il codice scrivilo tu...

immagina che la picturebox abbia x1 a sinistra e x2 a destra (x1+width) e ce abbia y1 in alto e y2 in basso (y1+height) praticamente devi controllare le coordinate x1 e x2 del primo picture con le x1 e x2 del secondo e vedere se "colliderebbero" in orizzontale.
A questo punto fai lo stesso per le y, poi metti insieme i 2 controlli, colliderebbe in orizzontale, colliderebbe in verticale, allora collidono.
Ovvero

se pb1.x1>=pb2.x1 e pb1.x1<=pb2.x2
oppure
pb1.x2>=pb2.x1 e pb1.x2<=pb2.x2
allora possibile_collisione_x

se pb1.y1>=pb2.y1 e pb1.y1<=pb2.y2
oppure
pb1.y2>=pb2.y1 e pb1.y2<=pb2.y2
allora possibile_collisione_y

se possibile_collisione_x e possibile_collisione_y allora COLLISIONE

Oppure potresti girare il controllo AL CONTRARIO, che magari viene anche meglio,
ovvero controlli tutti i casi in cui i due NON collidono, se li escludi tutti, allora collidono.
Overo,
se la prima picture è tutta a sinistra della seconda, non collidono
se la prima picture è tutta a destra della seconda, non collidono
se la prima picture è tutta sopra la seconda, non collidono
se la prima picture è tutta sotto la seconda, non collidono
se nessuno dei precedenti,allora COLLIDONO

e per fare sti controlli, fai come prima, ovvero ad es. per vedere se la p1 è sopra la p2 fai
se p1.y2<p2.y1 allora sopra, non collidono
capito? per gli altri stesso concetto

In realtà fare tutti sti check mi fa un po' schifo, devo pensare se esiste un modo migliore Smile

Se te ne viene in mente uno fammi sapere
ciaps




digger
14/08/2011, 20:12
#4
Cerca
(Questo messaggio è stato modificato l'ultima volta il: 15/08/2011, 22:21 da Cato97.)

Coder
Messaggi: 633
Discussioni: 57
Registrato: 04-2011
Mix: 0
cosa intendi per x1 a sinistra, x2 a destra, y1 in alto e y2 in basso?

EDIT: ho tirato fuori questa schifezza:

Spoiler:
    VBNET Programming
  1. Private rnd_x, rnd_y As Integer
  2. Dim xp1 = PictureBox1.Location.X + PictureBox1.Width
  3. Dim xp2 = PictureBox2.Location.X + PictureBox2.Width
  4. Dim x1 = PictureBox1.Location.X
  5. Dim x2 = PictureBox2.Location.X
  6. Dim yp1 = PictureBox1.Location.Y + PictureBox1.Height
  7. Dim yp2 = PictureBox2.Location.Y + PictureBox2.Height
  8. Dim y1 = PictureBox1.Location.Y
  9. Dim y2 = PictureBox2.Location.Y
  10. If xp1 >= xp2 Or xp1 <= x2 And yp1 >= yp2 Or yp1 <= y2 Then
  11. pnt.Text += 1
  12. rnd_x = CInt(Int(((Panel1.Width - PictureBox2.Width) * Rnd()) + 1))
  13. rnd_y = CInt(Int(((Panel1.Height - PictureBox2.Height) * Rnd()) + 1))
  14. Dim a As New System.Drawing.Point(rnd_x, rnd_y)
  15. PictureBox2.Location = a
  16. End If


(naturalmente sono solo i codici interessati)

e questo è il risultato del debug:

[Per vedere i link devi REGISTRARTI.]


RI-EDIT:
sono ruscito a risolvere il problema sopra indicato, però il codice non funziona a dovere...

RI-RI-EDIT:

ho provato con questo mettendolo in un timer, in modo che è sempre in grado di localizzare la posizione, però quando la pb1 è sulla pb2 cmq nn funziona:

Spoiler:
    VBNET Programming
  1. If PictureBox1.Location.X = PictureBox2.Location.X Then
  2. pnt.Text += 1
  3. rnd_x = CInt(Int(((Panel1.Width - PictureBox2.Width) * Rnd()) + 1))
  4. rnd_y = CInt(Int(((Panel1.Height - PictureBox2.Height) * Rnd()) + 1))
  5. Dim a As New System.Drawing.Point(rnd_x, rnd_y)
  6. PictureBox2.Location = a
  7. ElseIf PictureBox1.Location.X = PictureBox2.Location.Y Then
  8. pnt.Text += 1
  9. rnd_x = CInt(Int(((Panel1.Width - PictureBox2.Width) * Rnd()) + 1))
  10. rnd_y = CInt(Int(((Panel1.Height - PictureBox2.Height) * Rnd()) + 1))
  11. Dim a As New System.Drawing.Point(rnd_x, rnd_y)
  12. PictureBox2.Location = a
  13. ElseIf PictureBox1.Location.Y = PictureBox2.Location.X Then
  14. pnt.Text += 1
  15. rnd_x = CInt(Int(((Panel1.Width - PictureBox2.Width) * Rnd()) + 1))
  16. rnd_y = CInt(Int(((Panel1.Height - PictureBox2.Height) * Rnd()) + 1))
  17. Dim a As New System.Drawing.Point(rnd_x, rnd_y)
  18. PictureBox2.Location = a
  19. ElseIf PictureBox1.Location.Y = PictureBox2.Location.Y Then
  20. pnt.Text += 1
  21. rnd_x = CInt(Int(((Panel1.Width - PictureBox2.Width) * Rnd()) + 1))
  22. rnd_y = CInt(Int(((Panel1.Height - PictureBox2.Height) * Rnd()) + 1))
  23. Dim a As New System.Drawing.Point(rnd_x, rnd_y)
  24. PictureBox2.Location = a
  25. ElseIf PictureBox2.Location.X = PictureBox1.Location.X Then
  26. pnt.Text += 1
  27. rnd_x = CInt(Int(((Panel1.Width - PictureBox2.Width) * Rnd()) + 1))
  28. rnd_y = CInt(Int(((Panel1.Height - PictureBox2.Height) * Rnd()) + 1))
  29. Dim a As New System.Drawing.Point(rnd_x, rnd_y)
  30. PictureBox2.Location = a
  31. ElseIf PictureBox2.Location.X = PictureBox1.Location.Y Then
  32. pnt.Text += 1
  33. rnd_x = CInt(Int(((Panel1.Width - PictureBox2.Width) * Rnd()) + 1))
  34. rnd_y = CInt(Int(((Panel1.Height - PictureBox2.Height) * Rnd()) + 1))
  35. Dim a As New System.Drawing.Point(rnd_x, rnd_y)
  36. PictureBox2.Location = a
  37. ElseIf PictureBox2.Location.Y = PictureBox1.Location.X Then
  38. pnt.Text += 1
  39. rnd_x = CInt(Int(((Panel1.Width - PictureBox2.Width) * Rnd()) + 1))
  40. rnd_y = CInt(Int(((Panel1.Height - PictureBox2.Height) * Rnd()) + 1))
  41. Dim a As New System.Drawing.Point(rnd_x, rnd_y)
  42. PictureBox2.Location = a
  43. ElseIf PictureBox2.Location.Y = PictureBox1.Location.Y Then
  44. pnt.Text += 1
  45. rnd_x = CInt(Int(((Panel1.Width - PictureBox2.Width) * Rnd()) + 1))
  46. rnd_y = CInt(Int(((Panel1.Height - PictureBox2.Height) * Rnd()) + 1))
  47. Dim a As New System.Drawing.Point(rnd_x, rnd_y)
  48. PictureBox2.Location = a
  49. End If



RI-RI-RI-EDIT Asd :
diciamo che ho risolto... mi accontento con questo:
Spoiler:
    VBNET Programming
  1. If PictureBox1.Location.X = PictureBox2.Location.X And PictureBox1.Location.Y = PictureBox2.Location.Y Then
  2. pnt.Text += 1
  3. rnd_x = CInt(Int(((Panel1.Width - PictureBox2.Width) * Rnd()) + 1))
  4. rnd_y = CInt(Int(((Panel1.Height - PictureBox2.Height) * Rnd()) + 1))
  5. Dim a As New System.Drawing.Point(rnd_x, rnd_y)
  6. PictureBox2.Location = a
  7. End If




14/08/2011, 21:15
#5
Cerca

WarRock Hacks Coder
Messaggi: 940
Discussioni: 47
Registrato: 03-2011
Mix: 0
perchè hai oscurato il nome del progetto?? Happywide

15/08/2011, 17:08
#6
Cerca

Iscritto
Messaggi: 2,216
Discussioni: 102
Registrato: 03-2011
Mix: 0
(15/08/2011, 17:08)Skyline@69 Ha scritto:

[Per vedere i link devi REGISTRARTI.]

perchè hai oscurato il nome del progetto?? Happywide

perchè sta creando un programma per dominare il mooondooooooo o.o

15/08/2011, 17:14
#7
Cerca

Coder
Messaggi: 633
Discussioni: 57
Registrato: 04-2011
Mix: 0
(15/08/2011, 17:08)Skyline@69 Ha scritto:

[Per vedere i link devi REGISTRARTI.]

perchè hai oscurato il nome del progetto?? Happywide
lo scoprirete "presto"... se riesco a concluderlo xD


15/08/2011, 19:56
#8
Cerca
(Questo messaggio è stato modificato l'ultima volta il: 16/08/2011, 17:24 da digger.)

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
ciao Cato, hai fatto un po' di pasticci? Tounge
non funziona perchè finchè i check li fai con = invece che con <= >= avrai sempre bisogno che i 2 pb combacino esattamente.

Quanto a x1 e x2, semplicemente x1 è la location.x mentre x2 è location.x+width

questo vale sia per la pb1 che per la pb2, invece tu hai mischiato un po' le cose, per questo probabilmente non ti funziona.
Dopo di che per le y è la stessa cosa.
y1 è location.y mentre y2 è location.y+height
questo per entrambe le pb ovvero
pb1.x1
pb1.x2
pb1.y1
pb1.y2

pb2.x1
pb2.x2
pb2.y1
pb2.y2

e quindi i checks li devi fare tra le x1, x2 di pb1 e le x1, x2 di pb2 e lo stesso per le y



digger
16/08/2011, 17:20
#9
Cerca
(Questo messaggio è stato modificato l'ultima volta il: 16/08/2011, 23:51 da Cato97.)

Coder
Messaggi: 633
Discussioni: 57
Registrato: 04-2011
Mix: 0
avevo provato con questo ma non fungeva...
Spoiler:
    VBNET Programming
  1. Dim xp1 = PictureBox1.Location.X + PictureBox1.Width
  2. Dim xp2 = PictureBox2.Location.X + PictureBox2.Width
  3. Dim x1 = PictureBox1.Location.X
  4. Dim x2 = PictureBox2.Location.X
  5. Dim yp1 = PictureBox1.Location.Y + PictureBox1.Height
  6. Dim yp2 = PictureBox2.Location.Y + PictureBox2.Height
  7. Dim y1 = PictureBox1.Location.Y
  8. Dim y2 = PictureBox2.Location.Y
  9. If xp1 >= xp2 Or xp1 <= x2 And yp1 >= yp2 Or yp1 <= y2 Then
  10. pnt.Text += 1
  11. rnd_x = CInt(Int(((Panel1.Width - PictureBox2.Width) * Rnd()) + 1))
  12. rnd_y = CInt(Int(((Panel1.Height - PictureBox2.Height) * Rnd()) + 1))
  13. Dim a As New System.Drawing.Point(rnd_x, rnd_y)
  14. PictureBox2.Location = a
  15. End If


in attesa di una tua risposta, provo a ragionarci un po' su... magari risolvo da solo Happywide

EDIT: porca pu***na mi sto rintrucillendo :@
ho usato questo codice ma dà questo errore... il code penso sia quello giusto (ho fatto quello che mi dicevi... credo Asd )
Spoiler:
    VBNET Programming
  1. Dim pb1_x1 = PictureBox1.Location.X
  2. Dim pb1_x2 = PictureBox1.Location.X + Width
  3. Dim pb1_y1 = PictureBox1.Location.Y
  4. Dim pb1_y2 = PictureBox1.Location.Y + Height
  5. Dim pb2_x1 = PictureBox2.Location.X
  6. Dim pb2_x2 = PictureBox2.Location.X + Width
  7. Dim pb2_y1 = PictureBox2.Location.Y
  8. Dim pb2_y2 = PictureBox2.Location.Y + Height
  9. Dim collisione_x, collisione_y As Boolean
  10.  
  11. If pb1_x1 >= pb2_x1 And pb1_x1 <= pb2_x2 Or pb1_x2 >= pb2_x1 And pb1_x2 <= pb2_x2 Then
  12. collisione_x = True
  13. ElseIf pb1_y1 >= pb2_y1 And pb1_y1 <= pb2_y2 Or pb1_y2 >= pb2_y1 And pb1_y2 <= pb2_y2 Then
  14. collisione_y = True
  15. End If
  16. If collisione_x = True & collisione_y = True Then
  17. pnt.Text += 1
  18. rnd_x = CInt(Int(((Panel1.Width - PictureBox2.Width) * Rnd()) + 1))
  19. rnd_y = CInt(Int(((Panel1.Height - PictureBox2.Height) * Rnd()) + 1))
  20. Dim a As New System.Drawing.Point(rnd_x, rnd_y)
  21. PictureBox2.Location = a
  22. End If



[Per vedere i link devi REGISTRARTI.]


RI-EDIT: ho provato anche con quest'altro codice ma non ha nessun effetto... come se il controllo non contenesse codice

Spoiler:
    VBNET Programming
  1. Dim pb1_x1 = PictureBox1.Location.X
  2. Dim pb1_x2 = PictureBox1.Location.X + Width
  3. Dim pb1_y1 = PictureBox1.Location.Y
  4. Dim pb1_y2 = PictureBox1.Location.Y + Height
  5. Dim pb2_x1 = PictureBox2.Location.X
  6. Dim pb2_x2 = PictureBox2.Location.X + Width
  7. Dim pb2_y1 = PictureBox2.Location.Y
  8. Dim pb2_y2 = PictureBox2.Location.Y + Height
  9. Dim collisione_x, collisione_y As Integer
  10.  
  11. If (pb1_x1 > pb2_x1 And pb1_x1 < pb2_x2) Or (pb1_x2 > pb2_x1 And pb1_x2 < pb2_x2) Then
  12. collisione_x = True
  13. ElseIf (pb1_y1 > pb2_y1 And pb1_y1 < pb2_y2) Or (pb1_y2 > pb2_y1 And pb1_y2 < pb2_y2) Then
  14. collisione_y = True
  15. End If
  16. If (collisione_x = True) And (collisione_y = True) Then
  17. pnt.Text += 1
  18. rnd_x = CInt(Int(((Panel1.Width - PictureBox2.Width) * Rnd()) + 1))
  19. rnd_y = CInt(Int(((Panel1.Height - PictureBox2.Height) * Rnd()) + 1))
  20. Dim a As New System.Drawing.Point(rnd_x, rnd_y)
  21. PictureBox2.Location = a
  22. End If


basta me ne vado a dormire -.-"

16/08/2011, 21:35
#10
Cerca

Coder
Messaggi: 633
Discussioni: 57
Registrato: 04-2011
Mix: 0
up up up!

18/08/2011, 1:12
#11
Cerca

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
l'ultimo pezzo di codice che hai scritto , quello che dici che non fa niente, è quello giusto, giustamente hai tolto & e ci hai messo AND, quello che ti rimane da sistemare è che hai messo ELSIF che non c'entra proprio niente.
Fatto cosi se hai collisione_x NON avrai mai collisione_y quindi per forza che non fa niente.
Ma non devi mettere nemmeno else, semplicemente devi lasciare 2 linee separate di if.
Un if per la collisione x e poi un if per la collisione y capito?



digger
18/08/2011, 15:17
#12
Cerca
(Questo messaggio è stato modificato l'ultima volta il: 18/08/2011, 15:32 da Luca360.)

Iscritto
Messaggi: 63
Discussioni: 6
Registrato: 04-2011
Mix: 0
io avrei fatto una cosa del genere...
    VBNET Programming
  1. ' dimensione del panel : 307;208
  2. Dim a As New Random
  3. Dim b As New Random
  4. Dim x As Integer = a.Next(1, 307)
  5. Dim y As Integer = b.Next(1, 20<img src="https://hackmix.altervista.org/images/smilies/cool.png" alt="Cool" title="Cool" class="smilie smilie_56" />
  6. PictureBox1.Location = New Point(x, y)



Se vogliam fare le cose fatte per bene :
    VBNET Programming
  1. sub randomPic(height as integer, width as integer)
  2. Dim a As New Random
  3. Dim b As New Random
  4. Dim x As Integer = a.Next(1, width)
  5. Dim y As Integer = b.Next(1, height)
  6. PictureBox1.Location = New Point(x, y)
  7. end sub
  8. 'Usandola : randompic(208,307)



18/08/2011, 15:24
#13
Cerca

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
la classe random non l'ho mai usata il risultato è lo stesso, quindi se ti piace va bene anche cosi,l'hai testato per vedere che numeri ti da?





digger
18/08/2011, 15:29
#14
Cerca

Coder
Messaggi: 633
Discussioni: 57
Registrato: 04-2011
Mix: 0
digger, ho risolto con questo:

    VBNET Programming
  1. Dim collisione_x, collisione_y As Boolean
  2. Dim pb1_x1 = PictureBox1.Location.X
  3. Dim pb1_x2 = PictureBox1.Location.X + PictureBox1.Width
  4. Dim pb1_y1 = PictureBox1.Location.Y
  5. Dim pb1_y2 = PictureBox1.Location.Y + PictureBox1.Height
  6. Dim pb2_x1 = PictureBox2.Location.X
  7. Dim pb2_x2 = PictureBox2.Location.X + PictureBox2.Width
  8. Dim pb2_y1 = PictureBox2.Location.Y
  9. Dim pb2_y2 = PictureBox2.Location.Y + PictureBox2.Height
  10. collisione_x = (pb1_x1 >= pb2_x1 And pb1_x1 <= pb2_x2) Or (pb1_x2 >= pb2_x1 And pb1_x2 <= pb2_x2)
  11. collisione_y = (pb1_y1 >= pb2_y1 And pb1_y1 <= pb2_y2) Or (pb1_y2 >= pb2_y1 And pb1_y2 <= pb2_y2)
  12. If collisione_x And collisione_y Then
  13. My.Computer.Audio.Play(My.Resources.pacman_eat, AudioPlayMode.Background)
  14. pnt.Text += 1
  15. rnd_x = CInt(Int(((Panel1.Width - PictureBox2.Width) * Rnd()) + 1))
  16. rnd_y = CInt(Int(((Panel1.Height - PictureBox2.Height) * Rnd()) + 1))
  17. Dim a As New System.Drawing.Point(rnd_x, rnd_y)
  18. PictureBox2.Location = a
  19. End If



ora però non riesco a fare un'altra cosa e cioè che quando la pb1 si scontra con il panel devo generare un'evento... ho provato con lo stesso codice delle pb (cambiando il codice dove serve) ma non funziona... come posso fare? Sad

18/08/2011, 15:32
#15
Cerca


Discussioni simili
Discussione Autore Risposte Letto Ultimo messaggio
  [aiuto] No segnale su sapphire R9 280. Pocciox 5 1,103 14/01/2015, 22:11
Ultimo messaggio: digger
  aiuto portatile oirad94 1 827 22/12/2014, 16:27
Ultimo messaggio: Admin
  Aiuto Nella Definizone Rokys091 9 1,764 25/11/2014, 10:24
Ultimo messaggio: digger



Utenti che stanno guardando questa discussione: 1 Ospite(i)