bogosscamer
Messages postés5Date d'inscriptionmardi 15 mars 2005StatutMembreDernière intervention 6 novembre 2006
-
3 nov. 2006 à 01:27
bogosscamer
Messages postés5Date d'inscriptionmardi 15 mars 2005StatutMembreDernière intervention 6 novembre 2006
-
6 nov. 2006 à 23:08
salut à tous,
J' ai un sacré pb sur la tronche et je suis super nul en VB. Je voudrais simuler dans une picturebox le mouvement de chute de 1000 objets (carrés ) qui s'empilent les uns sur les autres à la fin de leur mouvement. Pour commencer, j'ai crée une form (form1), une picturebox(picture1), un bouton de commande(Commande1), un timer (timer1) et un shape (shape1). Mon code:
Dim t As Long
Dim x As Long
Private Sub Command1_Click()
t = 0
Picture1.ScaleMode = 3
Picture1.DrawWidth = 2
Timer1.Interval = 10
Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer()
t = t + 1
Shape1.Top = t
Shape1.Left = Picture1.ScaleWidth / 2
If t >= Picture1.ScaleHeight - 30 Then
x = Picture1.ScaleHeight - 30
Shape1.Top = x
End If
End Sub
C' est super nul comme code, ca marche et c'est très sympa. Mais il s'agit pour moi de le refaire avec 1000 éléments "intelligents" qui devront s'arreter chacun au contact du précédent et former une pile, là j'ai des soucis.
J'implore donc votre aide pour me guider dans ce projet. Tous les conseils, les suggestions, les documents (même les anecdotes lol) seront les bienvenues.
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 201934 3 nov. 2006 à 02:05
voila un exemple avec 2 Shapes
ChocBoule se trouve dans un module (dans un certain jeu de billard sur le site)
Dim R1 As Integer
Dim R2 As Integer
Dim D1 As Integer
Dim D2 As Integer
Dim Lx As Integer
Dim Ly As Integer
Dim vx1 As Double
Dim vx2 As Double
Dim vy1 As Double
Dim vy2 As Double
Dim xx1 As Double
Dim xx2 As Double
Dim yy1 As Double
Dim yy2 As Double
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 5 nov. 2006 à 15:58
Excuses acceptées, ami (mais ne recommence plus jamais, s'il te plait).
Alors voilà (n'oublie pas l'ajout du bouton Command2 pour arrêter, comme dit plus haut) :
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private dessuspile As Integer
Private arret As Boolean
Private deja As Boolean
Private nopile As Integer, t As Integer
Const nombreshapes = 10 ' remplace ici 4 par le nombre de shapes - 1 que tu veux avoir
Private Sub Command1_Click()
nopile = 0
Picture1.ScaleMode = 3
Picture1.DrawWidth = 2
For i = 0 To nombreshapes - 1
If Not deja Then
If i > 0 Then Load Shape1(i)
Shape1(i).Container = Picture1
End If
Shape1(i).Visible = False
Next
deja = True
arret = False
For i = 0 To nombreshapes - 1
Dim n As Integer
If arret Then Exit For
dessuspile = Shape1(0).Height * n
allons Shape1(i)
n = n + 1
If Shape1(i).Top < Shape1(i).Height Then
nopile = nopile + 1
n = 0
End If
Next
End Sub
Private Sub allons(noshape)
Dim fini As Boolean, t As Integer, x As Integer
noshape.Visible = True
t = 0
While Not fini
noshape.Top = t
'noshape.Left = ((Picture1.ScaleWidth - noshape.Left) / 2) + (nopile * (noshape.Width))
noshape.Left = (nopile * (noshape.Width))
If t >= Picture1.ScaleHeight - noshape.Height - dessuspile Then
x = Picture1.ScaleHeight - noshape.Height - dessuspile
noshape.Top = x
fini = Not fini
End If
t = t + 1
Sleep 1
DoEvents
Wend
End Sub
Private Sub stopit_Click()
arret = Not arret
nopile = 0
End Sub
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 3 nov. 2006 à 07:52
Tiens,
Inspire-toi de ceci que je viens de "fabriquer" très rapidement.
Sur une Form : un bouton de command Command1 et une pictureBox Picture1
Dans Picture1 : une shape nommée shape1 et sa propriété index = 0
Code :
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private dessuspile As Integer
Const nombreshapes = 4 ' remplace ici 4 par le nombre de shapes - 1 que tu veux avoir
Private Sub Command1_Click()
Picture1.ScaleMode = 3
Picture1.DrawWidth = 2
For i = 1 To nombreshapes
Load Shape1(i)
Shape1(i).Container = Picture1
Next
For i = 0 To nombreshapes
dessuspile = Shape1(0).Height * i
allons Shape1(i)
Next
End Sub
Private Sub allons(noshape)
Dim fini As Boolean, t As Integer, x As Integer
noshape.Visible = True
t = 0
While Not fini
noshape.Top = t
noshape.Left = (Picture1.ScaleWidth - noshape.Left) / 2
If t >= Picture1.ScaleHeight - noshape.Height - dessuspile Then
x = Picture1.ScaleHeight - noshape.Height - dessuspile
noshape.Top = x
fini = Not fini
End If
t = t + 1
Sleep 10
Wend
End Sub
bogosscamer
Messages postés5Date d'inscriptionmardi 15 mars 2005StatutMembreDernière intervention 6 novembre 2006 5 nov. 2006 à 01:39
Salut à tous
Tout d'abord, je tiens à remercier Daniel et jmfmarques qui ont bien voulu sacrifier un peu de leur temps pour cogiter sur mon problème et me proposer des orientations. Je leur suis immensement reconnaissant.
S'agissant du projet, j'ai beau me tordre les méninges, mais je n'arrive pas à exploiter à fond la solution (type billard) proposé par notre cher Gobillot (Daniel). Mais rassurez vous, je ne me décourage pas, je compte potasser au max pour profiter de la richesse des différents modules et modules de classe que j'ai pu y trouver.
Quand à la seconde solution, elle est toute à fait satisfaisante et correspond largement à mes attentes (même si j'ai eu du mal à le faire tourner), mais seulement je constate qu'il est très instable : si par exemple pendant l'exécution du programme, je déplace la form, le programme se plante. J'ai beau chercher mais j'arrive pas à savoir d'où vient ce problème.
D'autre part, pour pouvoir interrompre la simulation au cours de son exécution j'ai ajouté un bouton de commande puis j'ai essayé les instructions suivantes:
Private Sub Command2_Click()
Unload Me
End Sub
Private Sub Command2_Click()
End
End Sub
A chaque fois une surprise : je clique sur le bouton, soit le programme se plante soit il reste longtemps sans reagir ( c pas un pb de processeur ou de ram !) et lorsque je clique une seconde fois il s'arrête enfin. A ce niveau je me demande si c'est là la meilleure méthode pour arrêter ce programme.
Je m'arrête sur ce point de peur d'abuser de questions, tout simplement c'est le VB qui est fabuleux !
<strike>Esinus the best</strike>
Vous n’avez pas trouvé la réponse que vous recherchez ?
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 5 nov. 2006 à 08:14
Binjour bogosscanner :
Voilà des modifs pour l'arrêter en route et même pouvoir recommencer :
Il te faut ajouter un bouton de commande nommé stopit
Important : ne jamais quitter avant d'avoir arrêté, bien sur !
Les ajouts sont en rouge dans le code qui suit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private dessuspile As Integer
Private arret As Boolean
Private deja As Boolean
Const nombreshapes = 5 ' remplace ici 4 par le nombre de shapes - 1 que tu veux avoir
Private Sub Command1_Click()
Picture1.ScaleMode = 3
Picture1.DrawWidth = 2
For i = 1 To nombreshapes
If deja Then Exit For
Load Shape1(i)
Shape1(i).Container = Picture1
Next
deja = True
arret = False
For i = 0 To nombreshapes
If arret Then Exit For
dessuspile = Shape1(0).Height * i
allons Shape1(i)
Next
End Sub
Private Sub allons(noshape)
Dim fini As Boolean, t As Integer, x As Integer
noshape.Visible = True
t = 0
While Not fini
noshape.Top = t
noshape.Left = (Picture1.ScaleWidth - noshape.Left) / 2
If t >= Picture1.ScaleHeight - noshape.Height - dessuspile Then
x = Picture1.ScaleHeight - noshape.Height - dessuspile
noshape.Top = x
fini = Not fini
End If
t = t + 1
Sleep 10
DoEvents
Wend
End Sub
Private Sub stopit_Click()
arret = Not arret
End Sub
Bon week-End bogosscanner mais... dis-voir : on ne va pas tout te faire, quand-même ! Il te faut réfléchir un peu toi-même et adapter...(c'est celà, le développement).
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 5 nov. 2006 à 08:41
Un petit rajout attristé : évite de dire ailleurs que tu est parvenu à ce code (je n'ai pas aimé, "laurenjiongo")
Une petite précision : tu demandes "ailleurs" comment maintenant générer une autre pile...
Alors : une promesse : Je te le dirai également à la condition très claire que tu cesses de demander ailleurs des ajouts (que tu peux obtenir ici) à un code que tu as obtenu ici .
bogosscamer
Messages postés5Date d'inscriptionmardi 15 mars 2005StatutMembreDernière intervention 6 novembre 2006 5 nov. 2006 à 15:53
Méa culpa.
J'apprecie très sincérement ta franchise et je comprends que tu sois sérieusement offensé .bien je doute bien que ce soit suffisant, je te demande 50 000 fois des escuses et je te prie de bien vouloir les accepter. Une fois de plus ce vilain coté qui me pousse chaque fois à vouloir tout comprendre tout de suite et en passant à profiter sans vergogne des fruits du travail des autres, a repris le dessus. Je suis au bord du découragement et je me laisse aller à de telles pratiques falacieuses, honte à moi!
J'espère que tu pourras me pardonner.
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 6 nov. 2006 à 13:43
Alors, bogosscamer ?
Celà ne convient ou pas ?
Règle 2 : on n'ouvre jamais un sujet pour le laisser sans suite !
Résolu ? dis-le ...
Pas résolu ? dis pourquoi ...
Merci
bogosscamer
Messages postés5Date d'inscriptionmardi 15 mars 2005StatutMembreDernière intervention 6 novembre 2006 6 nov. 2006 à 23:08
Désolé du silence, je sais que tu brules d'impatience de connaitre le résultat. Le voilà donc : amplement satisfait !
Je peux donc me permettre de cloturer les débats bien que ... j'ai d'autres idées pour rendre le programme plus fun (et pas la moindre ligne de code !). Mais là j'ai compris la leçon. Je vais y consacrer personnellement du temps pour essayer par moi -même de produire quelque chose et ainsi progresser dans le VB. Ce sera difficile mais c'est ca l'apprentissage. Je sais que je puis compter sur votre aide éclairée à tout moment.
Une fois de plus merci.