This repository was archived by the owner on May 1, 2026. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMap_Editor.frm
More file actions
2944 lines (2894 loc) · 166 KB
/
Map_Editor.frm
File metadata and controls
2944 lines (2894 loc) · 166 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
VERSION 5.00
Object = "{F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0"; "comdlg32.ocx"
Begin VB.Form Map_Editor
BackColor = &H80000004&
BorderStyle = 1 'Fixed Single
Caption = " Map Editor 1.0"
ClientHeight = 8055
ClientLeft = 600
ClientTop = 1770
ClientWidth = 8310
Icon = "Map_Editor.frx":0000
LinkTopic = "Form1"
MaxButton = 0 'False
MinButton = 0 'False
ScaleHeight = 8055
ScaleWidth = 8310
Begin MSComDlg.CommonDialog Operazioni
Left = 7680
Top = 7440
_ExtentX = 847
_ExtentY = 847
_Version = 393216
CancelError = -1 'True
End
Begin VB.Frame Frame1
Caption = "Editor"
BeginProperty Font
Name = "MS Sans Serif"
Size = 8.25
Charset = 0
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 8055
Left = 0
TabIndex = 0
Top = 0
Width = 8295
Begin VB.PictureBox Editor
BorderStyle = 0 'None
Height = 7575
Left = 120
ScaleHeight = 505
ScaleMode = 3 'Pixel
ScaleWidth = 537
TabIndex = 1
Top = 240
Width = 8055
End
End
Begin VB.Menu File
Caption = "&File"
Begin VB.Menu Nuovo
Caption = "&Nuovo"
End
Begin VB.Menu Carica_mappa
Caption = "Carica &Mappa"
Visible = 0 'False
End
Begin VB.Menu Barra1
Caption = "-"
Visible = 0 'False
End
Begin VB.Menu Salva
Caption = "&Salva"
Enabled = 0 'False
Visible = 0 'False
End
Begin VB.Menu Salva_con_nome
Caption = "Salva con &nome"
Enabled = 0 'False
Visible = 0 'False
End
Begin VB.Menu Barra
Caption = "-"
Visible = 0 'False
End
Begin VB.Menu Converti_mappa_in_3D
Caption = "&Converti mappa in &3D"
Enabled = 0 'False
Shortcut = ^C
Visible = 0 'False
End
Begin VB.Menu Linea4
Caption = "-"
Visible = 0 'False
End
Begin VB.Menu Stampa
Caption = "S&tampa"
Enabled = 0 'False
Visible = 0 'False
End
Begin VB.Menu Linea3
Caption = "-"
End
Begin VB.Menu Esci
Caption = "&Esci"
Shortcut = ^E
End
End
Begin VB.Menu Visualizza
Caption = "&Visualizza"
Begin VB.Menu Opzioni
Caption = "&Opzioni"
Checked = -1 'True
End
End
Begin VB.Menu m3D
Caption = "&3D"
Begin VB.Menu AvviaAnteprima
Caption = "A&vvia Anteprima"
Enabled = 0 'False
Shortcut = ^V
End
Begin VB.Menu StoppaAnteprima
Caption = "S&toppa Anteprima"
Enabled = 0 'False
Shortcut = ^T
End
End
Begin VB.Menu Lingua
Caption = "&Lingua"
Begin VB.Menu LItaliano
Caption = "&Italiano"
End
Begin VB.Menu LInglese
Caption = "In&glese"
End
End
Begin VB.Menu Info
Caption = "&?"
Visible = 0 'False
Begin VB.Menu Registra
Caption = "&Registra"
End
Begin VB.Menu InfoMapEditor
Caption = "&Informazioni su Map Editor 1.0"
End
End
End
Attribute VB_Name = "Map_Editor"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
'Dichiaro un oggetto di tipo Introduzione,ovvero la classe che mi sono costruito per
'creare una semplice animazione all'avvio del programma
Dim Animazione As New ClsIntroduzione
'Dichiaro un'oggetto di tipo ClsMappa3D,ovvero la classe che mi sono costruito al fine di
'visualizzare un'anteprima 3D della mappa corrente
Dim Mappa3D As New clsMappa3D
'Dichiaro un'oggetto di tipo Tele,ovvero la classe che mi permetterà di muovermi all'interno
'della mappa appena creata
Dim Telecamera As New ClsTele
'...e l'oggetto comandi che mi permetterà di ricevere input direttamente da mouse e tastiera
Dim Comandi As New InputEngine8
'Dichiaro un oggetto che mi servirà per effettuare alcuni effetti grafici come una sfumatura
'in entrata e in uscita
Dim Effetti As New GraphicEffect8
'La variabile Continua,serve da riconoscimento al motore 3D per verificare se siamo all'interno
'del ciclo principale,in cui vengono svolte tutte le funzioni del programma.
'Se questa assumerà il valore di false allora si uscirà dal ciclo e quindi dal programma
Dim Continua As Boolean
'Dichiaro una variabile che riferirà al programma quando viene scelto di costruire
'una nuova mappa e quindi quando dovrà terminare l'animazione
Dim Continua_Animazione As Boolean
'Dichiaro un'altra variabile simile alle due precedenti,con la sola differenza che questa
'riferirà al programma se si dovrà continuare a ciclare nel ciclo che permetterà di
'visualizzare la mappa corrente in 3D
Dim Continua_Anteprima_3d As Boolean
'Definisco due variabili di appoggio che manterranno il valore di larghezza e altezza della
'finestra 3D e più precisamente della picturebox "Editor".Queste mi torneranno utili quando
'dovrò disegnare il menù su schermo
Dim Larghezza As Single
Dim Altezza As Single
'Ora inizializzo le variabili che mi restituiranno le coordinate del mouse...
Dim MouseX As Long
Dim MouseY As Long
'...e quelle che riferiranno al motore 3D se ho premuto o il bottone sinistro del mouse,
'o quello destro,rispettivamente B1 e B2
Dim B1 As Integer
Dim B2 As Integer
'Ora mi servono altre due variabile che conterranno le coordinate del mouse però questa volta
'le definisco Single.Tutto ciò perchè molte funzioni predefinite richiedono i valori
'espressi in single
Dim SmouseX As Single
Dim SmouseY As Single
'Le variabili che seguono sono riferite alle righe e mi servono per salvare le coordinate
'temporanee della riga che stò analizzando
Dim TmpX1 As Single
Dim TmpX2 As Single
Dim TmpY1 As Single
Dim TmpY2 As Single
'...un indice di appoggio per i muri...
Dim AppI As Integer
'...e un indice di appoggio per i pavimenti e soffitti
Dim AppJ As Integer
'Definisco una variabile che indicherà lo stato di costruzione della nuova Riga
Dim Stato_riga As Integer
'Definisco una variabile che indicherà lo stato di costruzione del nuovo soffitto o pavimento
Dim Stato_sop As Integer
'Questa variabile invece mi serve per capire se è stata scelta la voce di menù
'Salva o Salva con nome
Dim SCN As Boolean
'Questa variabile invece mi serve per capire se è stata scelta la voce di menù Converti Mappa in 3D o
'aggiorna mappa 3D
Dim CM3D As Boolean
'Dichiaro una variabile booleana che mi servirà per capire se il menù di aiuto in modalità Anteprima 3D
'è aperto oppure chiuso
Dim MenùAiuto As Boolean
'Definisco una variabile che conterrà le coordinate del cursore di windows
Dim tmpWindowsMousePosition As POINTAPI
'Definisco la funzione che mi servirà per rilevare la posizione del cursore di windows
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Sub AvviaAnteprima_Click()
'Le istruzioni che seguono servono ad avvisare l'utente che la scalatura selezionata non è una delle migliori
'al fine di una corretta visualizzazione della mappa 3D in modalità Anteprima 3D,tuttavia egli potrà scegliere
'se continuare con l'operazione di Conversione oppure annullare e quindi selezionare una scala migliore
If VScale <= 9 Then
Dim RispostaContinuaAnteprima As VbMsgBoxResult
If LinguaS = "Italiano" Then RispostaContinuaAnteprima = MsgBox("Per una buona visualizzazione della mappa 3d in modalità Anteprima 3D e consigliabile selezionare una scalatura maggiore o uguale a 10!" + Chr(13) + " Vuoi comunque avviare la modalità Anteprima 3D in scala 1 :" + Str(VScale) + "? ", vbYesNo, "Avvio modalità Anteprima 3D")
If LinguaS = "Inglese" Then RispostaContinuaAnteprima = MsgBox("For a better view of 3d map in 3D preview modality you must choose a scale value major or equal then 10!" + Chr(13) + "Do you want aniway start 3D preview modality with 1 :" + Str(VScale) + " scale? ", vbYesNo, "3D preview modality start")
If RispostaContinuaAnteprima = vbNo Then GoTo Annulla
End If
'Questa condizione fa in modo che se è già stato visualizzato il messaggio dell'errore dello scale, non verrà visualizzato
'l'altra di conferma di entrata in modalità Anteprima 3D
If RispostaContinuaAnteprima <> vbYes Then
'Dichiaro una variabile che mi servirà per capire se cerrà deciso di proseguire con
'l'avvio della modalità anteprima 3D
Dim RispostaModalitàAnteprima3D As VbMsgBoxResult
'Assegno alla variabile sopra dichiarata il valore del tasto premuto in corrispondenza
'del messaggio visualizzato
If LinguaS = "Italiano" Then RispostaModalitàAnteprima3D = MsgBox("Attenzione! Si stà passando alla modalità Anteprima 3D!" + Chr(13) + " vuoi proseguire?", vbYesNo, "Avvio della modalità Anteprima 3D")
If LinguaS = "Inglese" Then RispostaModalitàAnteprima3D = MsgBox("Attention! The 3D preview modality will be started!" + Chr(13) + "Do you want continue?", vbYesNo, "3D preview modality start")
End If
'Richiamo dall'oggetto Mappa3D il metodo che mi permetterà di costruire una vera
'e propria mappa3d in base alle righe costruite sullo schermo
Mappa3D.Crea_Mappa_3D
'Se si ha il consenso da parte dell'utente allora si procederà con le operazioni
'di inizializzazione
If RispostaModalitàAnteprima3D = vbYes Or RispostaContinuaAnteprima = vbYes Then
'Riproduco un file sonoro riservato all'avvio della modalità Anteprima 3D
Suoni.Esegui_suono_AvviaAnteprima
'Impongo l avariabile continua con un valore false,in modo che si uscirà temporaneamete dall'editor
'e si avvierà il ciclo che mi permetterà di gironzolare tranquillamente all'interno
'della mappa appena creata
Continua = False
'Attivo la voce di menà StoppaAnteprima,in modo da permettere all'utente di tornare
'quando vuole a visualizzare l'editor vero e proprio
StoppaAnteprima.Enabled = True
'Inizializzo la variabile Continua_Anteprima_3D = True,in modo che si continuerà a ciclare
'finchè questa non assumerà il valore opposto = False
Continua_Anteprima_3d = True
'Disabilitò la voce di menù Avvia Anteprima in modo che non sia possibile selezionarla
'quando ci si trova in modalità Anteprima 3D
AvviaAnteprima.Enabled = False
'Avvio il ciclo di anteprima della mappa 3D
CicloAnteprima3D
'Quando si selezionerà la voce di menù StoppaAnteprima, si uscirà dal ciclo di anteprima 3D
'per ritornare all'editor vero e proprio.
'Inoltre reinizializzo la variabile continua con un valore booleano = true
Continua = True
'Si torna al ciclo dell'editor vero e proprio
Ciclo
End If
'Label Annulla
Annulla:
End Sub
Sub CicloAnteprima3D()
'---------------------------------------------------------------------------------------------
' Le suguenti variabili mi servono per ricavare tutti gli imput forniti dal mouse in modalità
' anteprima 3D al fine di poter apportare modifiche in tempo reale agli oggetti selezionati
'---------------------------------------------------------------------------------------------
'Dichiaro una variabile di appoggio che mi servirà per salvare il valore temporaneo
'del cursore del mouse sull'asse delle X
Dim TmpX As Long
'Dichiaro una variabile di appoggio che mi servirà per salvare il valore temporaneo
'del cursore del mouse sull'asse delle Y
Dim TmpY As Long
'Dichiaro una variabile che mi servirà per verificare se è stato premuto il tasto
'sinistro del mouse
Dim TmpB1 As Integer
'Dichiaro una variabile che mi servirà per verificare se è stato premuto il tasto
'destro del mouse
Dim TmpB2 As Integer
'Effettuo un'effetto di sfumatura in entrata in modo da rendere un pò più particolare
'il programma
Effetti.FadeIn
'Disattivo l'eventuale immagine di sfondo dell'editor che si aveva selezionato
Schermo.EnableBackground False
'Cambio il colore di sfondo da grigio a nero
Scena.SetSceneBackGround 0, 0, 0
'Richiama dall'oggetto Telecamera il metodo che inizializza tutte le variabili necessarie
'al corretto funzionamento della modalità Anteprima 3D
Telecamera.Inizializzazione_Variabili_Di_Comando
'Avvio un ciclo for che richiamerà da ogni oggetto creato il metodo Attiva_Oggetto,addetto
'al corretto posizionamento dello stesso all'interno della mappa 3D
For IOg = 0 To IOg
'Se l'oggetto attualmente analizzato non possiede un valore salvato all'interno del
'proprio campo chiave,allora questo verrà attivato.
If Oggetto(IOg).Key <> "" Then
'Chiamata al metodo Attiva_Oggetto
Oggetto(IOg).Attiva_Oggetto
End If
'Si passa all'oggetto successivo
Next
'Da qui inizia il vero e proprio CicloAnteprima3d,ovvero quel ciclo che permetterà
'all'utente,grazie all'aiuto delle classi ClsMappa3D,addetta alla conversione della mappa
'attuale in 3D,e alla classe ClsTele,che permette il movimento all'interno della stessa,
'di osservare la mappa appena costruita in modo assolutamente 3D,con tanto di movimento
'e cambio di direzione di visuale al suo interno
Do
DoEvents
'Cancello il contenuto dell'oggetto TV8
TV8.Clear
'Richiamo la funzione che allinea i form in caso questi venissero spostati
Allinea_form
'Richiamo la funzione che mi permetterà di far coincidere le coordinate del mouse
'di windows con quelle dell'editor
Setta_cursore
'Richiamo dall'oggetto Telecamera,il quale è stato definito di tipo ClsTele,il metodo
'che mi permetterà di verificare quale movimento dovrà compiere la Telecamera.
'Questo avverrà mediante la pressione dei tasti sulla tastiera
Telecamera.Controlla_Comandi
'Richiamo sempre dallo stesso oggetto,il metodo che mi permetterà,in base ai tasti
'premuti sulla tastiera,di muovermi all'interno della mappa3D appena costruita
Telecamera.Aggiorna_Comandi
'Renderizzo la mappa3D creata in modo che questa possa essere visibile
Scena.RenderAllMeshes
'Verifico se è stato premuto un pulsante del mouse,è nel caso in cui questo fosse accaduto
'richiamo la funzione Verifica_Selezione_Oggetto,il cui scopo è quello di verificare
'se è stato selezionato un oggetto
Comandi.GetAbsMouseState TmpX, TmpY, TmpB1, TmpB2
'Se è stato premuto il tasto sinistro del mouse richiamerò la funzione Verifica_Selezione_Oggetto
If TmpB1 <> 0 Then Verifica_Selezione_Oggetto TmpX, TmpY
'Se la variabile booleano MenùAiuto possiede il valore False,allora...
If MenùAiuto = False Then
'Richiamo la funzione che disegnerà semplicemente su schermo un piccolo box che informerà
'l'utente che alla pressione del tasto H si attiverà appunto il menù di aiuto che guiderà
'l'utente nelle operazioni di modifica dell'oggetto selezionato
Disegna_Box_Modifica_Oggetto
'Altrimenti...
Else
'Richiamo la funzione che disegnerà su schermo il menù che guiderà l'utente nelle operazioni
'di modifica dell'oggetto selezionato
Disegna_Menù_Modifica_Oggetto
'Richiamo la funzione che permetterà all'utente,a seconda del tasto premuto sulla tastiera,
'di apportere modifiche in tempo reale all'oggetto selezionato
Ricevi_Modifiche_Oggetto
End If
'Renderizzo tutto il contenuto dell'oggetto TV8 su schermo
TV8.RenderToScreen
'Continuo a ciclare finchè la variabile Continua_Anteprima_3D non sarà = False
Loop Until Continua_Anteprima_3d = False
'Effettuo un'effetto di dissolvenza in uscita
Effetti.FadeOut
'Se è stata precedentemente selezionata un'immagine da applicare come fondale dell'editor
'allora...
If Form_Opzioni.FondaleStatico = True And ImmagineSfondo <> "Nessuna" Then
'Ativo il fondale dell'editor
Schermo.EnableBackground True
'Carico come immagine di sfondo dell'editor,l'immagine che si aveva precedentemente
'selezionato
Schermo.LoadBackground ImmagineSfondo
End If
'Elimino tutte le Texture degli oggetti caricati all'interno della mappa 3D dall'oggetto
'FabbricaTexture
FabbricaTexture.DeleteAll
'Impongo alla variabile MenùAiuto il valore boleano False in modo che la prossima volta
'che si entrerà in modalità Antepima 3D venga disegnato solamente il Box che segnala che
'premendo il tasto P si attiverà il menù di modifica dell'oggetto
MenùAiuto = False
End Sub
Private Sub Carica_mappa_Click()
'Avvio la funzione che mi permetterà di caricare una mappa precedentemente
'creata e salvata
Carica_mappa_salvata
End Sub
Private Sub Esci_Click()
'Dichiaro una variabile che servirà al programma per capire quale bottone del messaggio viene
'premuto dall'utente
Dim Risposta As VbMsgBoxResult
'Viene visualizzato un messaggio che chiede all'utente se si vuole uscire dal programma
If LinguaS = "Italiano" Then Risposta = MsgBox("Sei sicuro di voler abbandonare il programma?", vbOKCancel, "Uscita dal programma")
If LinguaS = "Inglese" Then Risposta = MsgBox("Do you really want exit the program?", vbOKCancel, "Exit program")
'Se viene premuto il bottone OK...
If Risposta = vbOK Then
'Richiamo il metodo dalla Classe Sonora che riprodurra il file sonoro di uscita
'dal programma
Suoni.Esegui_suono_uscita
'Metto in pausa l'oggetto TV8 in modo che aspetterà che la riproduzione del file
'sonoro sia terminata prima di eseguire le istruzioni di uscita dal programma
TV8.Pause 2000
'...Pongo la variabile Continua e Continua_Animazione a stato false permettendomi così di uscire dal
'ciclo principale o se in esecuzione da quello di animazione e di conseguenza anche dal programma
Continua_Animazione = False
Continua = False
'Nel caso in cui si fosse in modalità Anteprima 3D il programma verrebbe terminato
'direttamente
If Continua_Anteprima_3d = True Then
End
End If
End If
End Sub
Private Sub File_Click()
'Alla pressione della voce di menù File richiamerò il metodo dalla classe sonora
'che riprodurrà il suono di menù
Suoni.Esegui_suono_menù
End Sub
Private Sub Form_Load()
'Dichiaro una variabile booleana che mi servirà per capire se la risoluzione di schermo del computer su cui è stato avviato
'il programma è errata (inferiore a 1024 X 768).
'Il suo valore verrà assegnato dalla funzione Problemi_Risoluzione è se questa restituirà il valore False, allora
'l'utente verrà informato della scorretta risoluzione di video è alla pressione del tasto OK, lo stesso programma
'verrà terminato, altrimenti l'esecuzione procederà normalmente
Dim Problemi_risoluzione_schermo As Boolean
'Assegnazione del valore della variabile Problemi_risoluzione_schermo tramite la funzione Problemi_Risoluzione
Problemi_risoluzione_schermo = (Problemi_Risoluzione)
'Se la variabile Problemi_risoluzione_video avrà assunto il valore True dopo l'assegnazione, allora verrà visualizzato il messaggio
'di errore
If Problemi_risoluzione_schermo = True Then
'Creazione del messaggio di erore dell'incorretta risoluzione video
If LinguaS = "Italiano" Then MsgBox "L'attuale risoluzione di schermo è " + Str(Screen.Width / Screen.TwipsPerPixelX) + " X " + Str(Screen.Height / Screen.TwipsPerPixelY) + Chr(13) + ". L'esecuzione del programma invece ridchiede una risoluzione video non inferiore a 1024 X 768. " + Chr(13) + "Risetta le impostazioni dello schermo e riavvia il programma!", vbOKOnly, "Risoluzione video incorretta!"
If LinguaS = "Inglese" Then MsgBox "The actual screen risolution is " + Str(Screen.Width / Screen.TwipsPerPixelX) + " X " + Str(Screen.Height / Screen.TwipsPerPixelY) + ". For Start the program you must set the screen resolution at 1024 X 768! " + Chr(13) + "Set the video and before start the program!", vbOKOnly, "Incorrect screen resolution"
'Il programma verrà interrotto
End
End If
'Richiamo la funzione per l'inizializzazione del motore 3D
Inizializza_3d
'Inizializzo con un valore iniziale tutte le variabili necessarie
Inizializza_Variabili
'Visualizza il form delle opzioni
Form_Opzioni.Show
'Mostro il form principale.Questa istruzione può risultare stupida,ma è assolutamente necessaria
'per avviare la grafica
Me.Show
'Richiamo il metodo dalla Classe Sonora che riprodurrà il file di Avvio del programma
Suoni.Esegui_suono_avvio
'Avvia il ciclo dell'animazione
Ciclo_Animazione
'Richiama il ciclo precedentemente descritto
Ciclo
'Questa funzione serve per distruggere tutti gli oggetti che mi sono creato
'per il funzionamento del programma
Distruggi_oggetti
'Esce dal programma
End
End Sub
Sub Inizializza_3d()
'Indico la directory iniziale da cui partire a ricercare tutti i file annessi al programma
TV8.SetSearchDirectory App.Path
'Avviamo il 3D in una finestra,e più precisamente all'interno di una picturebox
'chiamata Editor
TV8.Init3DWindowedMode Editor.hWnd
'Creo dei tipi di caratteri personalizzati che mi serviranno per disegnare il menù informazioni sullo schermo
Schermo.CreateUserFont "Carattere_personalizzato1", "Comic sans Ms", 10, True, False, False
Schermo.CreateUserFont "Carattere_personalizzato2", "Arial", 8, True, False, False
'Richiama il metodo dall'oggetto animazione che servirà ad evviare la sequenza
'introduttiva del programma
Animazione.Start
'Richiamo dall'oggetto Suoni il metodo che caricherà all'interno di se stesso il
'file sonoro da riprodurre quando ci si muoverà all'interno della mappa.
'Questo farà sembrare il programma più realistico,simulando il rumore dei passi
Suoni.Inizializza_Suoni
'Carico all'interno della scena un cursore da me costruito
Scena.LoadCursor "Images/pointer.bmp", TV_COLORKEY_BLACK, 16, 16
'Attivo il MipMapping.
'Il MipMapping è una particolare funzione 3D che mi permetterà di migliorare la grafica nella modalità
'Anteprima3D
Scena.EnableMipMapping True
End Sub
Sub Inizializza_Variabili()
'Dichiaro un indice che mi tornerà utile nell'assegnazione ai quattro angoli di ogni
'muro,pavimento e soffitto,dello stesso indice di solidità
Dim K As Integer
'Inizializziamo la variabile continua con un valore iniziale True
Continua = True
'Inizializziamo la variabile continua_animazione con un valore iniziale True
Continua_Animazione = True
'Dichiaro l'indice I con valore = 0
I = 0
'e lo stesso faccio anche per l'indice J
J = 0
'Dichiaro il numero massimo di linee = 0
Max = 0
'La somma dei soffitti + i pavimenti presenti all'interno della mappa attuale
Max2 = 0
'Il numero massimo di pavimenti
Max3 = 0
'E il numero massimo di soffitti
Max4 = 0
'Imposto lo stato iniziale della prima riga che verrà costruita
Stato_riga = 0
'Imposto lo stato iniziale del primo soffitto o pavimento che verrà creato
Stato_sop = 0
'Assegno alla variabile Larghezza il valore espresso in pixel della PictureBox in cui verrà
'inizializzato il 3D,ovvero la PictureBox Editor
Larghezza = Editor.ScaleWidth
'Faccio la stessa cosa anche per la variabile Altezza,solo che questa volta gli assegnerò
'intuitivamente il valore espresso in pixel dell'altezza della stessa PictureBox
Altezza = Editor.ScaleHeight
'Imposto un valore di partenza allo scale
VScale = 1
'Imposto la variabile ImmagineSfondo con il valore alfanumerico "Nessuna".
'Questo farà in modo che all'avvio del programma non venga caricata appunto nessuna
'immagine da applicare al fondale dell'editor
ImmagineSfondo = "Nessuna"
'Imposto dei valori di default a tutte e 10000 le righe dichiarate.Sarà compito dell'utente
'modificare in seguito a suo piacimento questi valori per ogni muro
For I = 0 To 10000
With Riga(I)
'Inizializzo l'altezza base del muro con un valore pari a 1000
.Altezza = 1000
'Inizializzo il numero di mattonelle base disposte in altezza sulla superfice
'del muro corrente
.NMattonelleALtezza = 10
'Inizializzo il numero di mattonelle base disposte in larghezza sulla superfice
'del muro corrente
.NMAttonelleLarghezza = 10
'Imposto a "Nessuna", l'immagine iniziale che dovrà essere disposta tante volte
'quanto il numero di mattonelle,sulla superfice del muro corrente
.Texture = "Nessuna"
'Imposto la proprietà iniziale che dovrà adottare il muro corrente,ovvero dovrà
'essere di tipo Normale
.Proprietà = "Normale"
'Assegno al muro corresnte il proprio nome iniziale,formato dalla parola
'"Muro" più l'indice della sua posizione all'interno della tabella Coordinate_Riga
.Nome = "Muro " + Str(I)
'Imposto i quattro angoli del muro con un grado di solidità iniziale
'pari a 0.5
For K = 0 To 3
With .ColVertici(K)
.A = 0.5
End With
'Passo ad esaminare il muro successivo
Next
End With
'Richiamo la funzione pubblica addetta alla reimpostazione del materiale specifico
'passato alla funzione stessa con il colore nullo (bianco)
Reimposta_materiale Riga(I).Materiale
Next
'Come per le righe, imposto anche per tutti e 10000 SoP (Soffitti o Pavimenti) dei valori
'di default.Anche qui sarà l'utente che potrà reimpostare questi valori a suo piacimento
For J = 0 To 10000
With SoP(J).CR
'Inizializzo il numero di mattonelle base disposte in altezza sulla superfice
'del pavimento / soffitto corrente
.NMattonelleALtezza = 20
'Inizializzo il numero di mattonelle base disposte in larghezza sulla superfice
'del pavimento / soffitto corrente
.NMAttonelleLarghezza = 20
'Imposto a "Nessuna", l'immagine iniziale che dovrà essere disposta tante volte
'quanto il numero di mattonelle,sulla superfice del pavimento / soffitto corrente
.Texture = "Nessuna"
'Imposto la proprietà iniziale che dovrà adottare il pavimento / soffitto corrente,
'ovvero dovrà essere di tipo Normale
.Proprietà = "Normale"
'Imposto i quattro angoli del pavimento / soffitto con un grado di solidità iniziale
'pari a 0.5
For K = 0 To 3
With .ColVertici(K)
.A = 0.5
End With
'Passo ad analizzare il pavimento / soffitto successivo
Next
End With
'Richiamo la funzione pubblica addetta alla reimpostazione del materiale specifico
'passato alla funzione stessa con il colore nullo (bianco)
Reimposta_materiale SoP(J).CR.Materiale
Next
'Inizializzo le coordinate iniziali della telecamera
With PosizioneTelecamera
.X = 100
.Y = 500
.Z = 100
End With
'Inizializzo la variabile Molt con un valore pari a 1,in modo da far capire al programma che le linee
'non sono state modificate dall'operazione di zoom
Molt = 1
'Inizializzo la variabile VCambiamentiGriglia con il valore 20,in modo che se non sono state ancora effettuate
'operazioni di zoom,e il controllo GrigliaControllataDaZoom è attivato,i quadrati della griglia avranno tutti dimensioni
'60 * 60
VCambiamentiGriglia = 60
'Richiamo la funzione addetta all'assegnazione iniziale dei colori dei vari componenti utilizzati dall'editor,
'ovvero il colore delle linee che rappresentano i muri,il colore delle linee che rappresentano i pavimenti,
'il colore delle linee che rappresentano i soffitti,ecc.
Inizializza_colori
'Inizializzo la variabile pubblica LinguaS ad "Italiano".
'Il programma interpreterà questa istruzione come lingua in cui avviare il programma
LinguaS = "Inglese"
'Richiamo la funzione che mi permetterà di tradurre il programma nella lingua desiderata
Traduci "Inglese"
End Sub
Sub Ciclo_Animazione()
'Da qui comincia il Ciclo_Animazione, ovvero quel ciclo che mi permetterà di ricreare,grazie all'ausilio
'della classe ClsIntroduzione,una piccola animazione che rappresenterà appunto la presentazione
'del programma
Do
DoEvents
'Richiama la funzione che allinea tutti i form
Allinea_form
'Richiamo la funzione che mi permetterà di allineare il cursore di window a quello
'dell'editor
Setta_cursore
'Ripulisce il contenuto dell'oggetto TV8
TV8.Clear
'Richiama dall'interno della classe Animazione la funzione che ruoterà gli anelli che
'compongono la sequenza introduttiva del programma
Animazione.Ruota_anelli
'Renderizza tutti il contenuto della scena corrente
Scena.RenderAllMeshes
'Questa istuzione mi servirà per renderizzare il terreno presente all'interno della classe ClsIntroduzione,
'affinchè sia visibile l'effetto neve
Animazione.Terreno.Render True
'Renderizza tutto il contenuto dell'oggetto TV8 su schermo
TV8.RenderToScreen
'Tutto questo avviene finchè la variabile continua_animazione non assumerà il valore da false
Loop Until Continua_Animazione = False
'Richiama dall'interno della classe animazione,la funzione che distruggera tutti gli oggetti
'presenti all'interno dell'animazione.Questo al fine di non lasciarne residui in memoria centrale
Animazione.Distruggi_Animazione
'L'istruzione che segue mi permetterà di avere una portata di angolo di visuale pari a PI * 20, e
'una di distanza pari a 10000.
'In poche parole mediante quaesta semplice funzione, è possibile vedere tutti quei muri,pavimenti,soffitti o
'oggetti che sono posti ad una distanza massima di 10000 dalla nostra posizione
Scena.SetViewFrustum 3.14159265359 * 20, 10000
End Sub
Sub Ciclo()
'Effettuo un effetto di sfumatura in entrata
Effetti.FadeIn 1000
'Imposto un colore di sfondo alla scena e quindi anche all'editor
Scena.SetSceneBackGround 0.5, 0.5, 0.5
Do
DoEvents
'Richiama la funzione che allinea tutti i form
Allinea_form
'Ripulisce il contenuto dell'oggetto TV8
TV8.Clear
'Richiama la funzione che,se selezionata l'opzione di visualizzazione griglia
'dal menù opzioni,disegnerà la griglia sullo schermo
Controlla_griglia
'Chiama la funzione che disegnerà le righe crete sullo schermo
Disegna_righe
'Richiama la funzione che verifica lo stato della tastiera e del mouse
Controlla_input
'Chiama la funzione che disegnerà una sorta di menù sullo schermo
Crea_menù
'Renderizza tutto il contenuto dell'oggetto TV8 su schermo
TV8.RenderToScreen
'Tutto questo avviene finchè la variabile continua non assumerà il valore False
Loop Until Continua = False
End Sub
Sub Controlla_input()
Dim Scroll As Boolean
'Richiamo la funzione che mi permetterà di far coincidere le coordinate del mouse di
'windows con quello dell'editor
Setta_cursore
'Se viene premuto sulla tastiera il pulsante S allora imporrò alla variabile Scroll
'il valore True
If Comandi.IsKeyPressed(TV_KEY_S) = True Then
Scroll = True
'Altrimenti questa avrà valore False
Else
Scroll = False
End If
'Se viene premuto il tasto Canc, quando è in costruzione un muro, un pavimento o un soffitto,
'la costruzione dello stesso verrà annullata,in modo tale che si possa iniziare a crearne un altro
'con nuove coordinate
If Comandi.IsKeyPressed(TV_KEY_DELETE) = True Then
'Se la variabile Stato_riga è diversa da 0, allora la reimposto in modo tale che si possa reiniziare
'a settare le coordinate iniziali del nuovo muro
If Stato_riga <> 0 Then Stato_riga = 0
'Nel caso in cui questa volta la variabile Stato_Sop avesse valore diverso da 0,la si reimposterebbe
'per risettare appunto le coordinate iniziali del nouvo pavimento o soffitto
If Stato_sop <> 0 Then Stato_sop = 0
End If
'Se la variabile Scroll a il valore True,allora richiamerò la funzione che mi servirà per simulare
'uno scrolling della mappa,ridimensionando tutte le righe presenti.
'Notare che alla funzione gli passo due valori che sono rispettivamente i valori del mouse
'al momento della pressione del tasto S
If Scroll = True Then Scorri_Mappa MouseX, MouseY
'Verifico se la variabile Scroll a valore False,lo stato attuale del mouse,cioè le sue coordinate e se viene premuto
'o il pulsante sinistro (B1) o quello destro (B2)
If Scroll = False Then
Comandi.GetAbsMouseState MouseX, MouseY, B1, B2
'Duplico le coordinate correnti del mouse da Long a Single
SmouseX = CSng(MouseX)
SmouseY = CSng(MouseY)
End If
'Queste istruzione mi permettono,se è stato selezionato dall'utente nel form delle opzioni,
'di poter visualizzare delle linee che fungeranno da ulteriore aiuto per l'allineamento
If Form_Opzioni.Linee_guida.Value = 1 Then
'Disegno la linea orizzontale
Schermo.DrawLine 0, SmouseY, Larghezza - 1, SmouseY, RGBA(CLG.R, CLG.G, CLG.B, 1)
'Disegno la linea verticale
Schermo.DrawLine SmouseX, 0, SmouseX, Altezza - 1, RGBA(CLG.R, CLG.G, CLG.B, 1)
End If
'Questo ciclo For è molto importante,ora vi spiegherò im perchè:
'Pensate di dover impostare le coordinate di una nuova linea perfettamente allineate
'a quelle di un'altra linea,che però è molto distante dall'altra.Come fare?
'I metodi sono due.O avere un occhio da "lince" e riuscire a scrutare perfettamente l'allineatura:
'cosa molto improbabile; oppure grazie al metodo sotto descritto,disegnare su schermo un piccolo rettangolo
'blu,sia sulle coordinate finale della nuova linea che verrà creta,sia sulle coordinate di tutte le
'linee a essa allineate,in modo da poter capire se le nuova linea e appunto,immaginariamente collegata.
'ATTENZIONE: Questo avverrà solamente se la checkbox Rileva_Allineamento è selezionata.
If Form_Opzioni.Rileva_allineamento.Value = 1 Then
For I = 0 To Max
If SmouseX = Riga(I).X1 Or SmouseY = Riga(I).Y1 Then
Schermo.DrawFilledBox SmouseX - 3, SmouseY - 3, SmouseX + 3, SmouseY + 3, RGBA(CAM.R, CAM.G, CAM.B, 1)
Schermo.DrawFilledBox Riga(I).X1 - 3, Riga(I).Y1 - 3, Riga(I).X1 + 3, Riga(I).Y1 + 3, RGBA(CAM.R, CAM.G, CAM.B, 1)
End If
If SmouseX = Riga(I).X2 Or SmouseY = Riga(I).Y2 Then
Schermo.DrawFilledBox SmouseX - 3, SmouseY - 3, SmouseX + 3, SmouseY + 3, RGBA(CAM.R, CAM.G, CAM.B, 1)
Schermo.DrawFilledBox Riga(I).X2 - 3, Riga(I).Y2 - 3, Riga(I).X2 + 3, Riga(I).Y2 + 3, RGBA(CAM.R, CAM.G, CAM.B, 1)
End If
If SmouseY = Riga(I).X1 Or SmouseY = Riga(I).Y1 Then
Schermo.DrawFilledBox SmouseX - 3, SmouseY - 3, SmouseX + 3, SmouseY + 3, RGBA(CAM.R, CAM.G, CAM.B, 1)
Schermo.DrawFilledBox Riga(I).X1 - 3, Riga(I).Y1 - 3, Riga(I).X1 + 3, Riga(I).Y1 + 3, RGBA(CAM.R, CAM.G, CAM.B, 1)
End If
If SmouseY = Riga(I).X2 Or SmouseY = Riga(I).Y2 Then
Schermo.DrawFilledBox SmouseX - 3, SmouseY - 3, SmouseX + 3, SmouseY + 3, RGBA(CAM.R, CAM.G, CAM.B, 1)
Schermo.DrawFilledBox Riga(I).X2 - 3, Riga(I).Y2 - 3, Riga(I).X2 + 3, Riga(I).Y2 + 3, RGBA(CAM.R, CAM.G, CAM.B, 1)
End If
Next
End If
'Invece, la funzione di quest'altro ciclo è la medesimo di quella sopra indicata,con la sola differenza che questa volta
'l'allineamento verrà visualizzato di colore Verde e in corrispondenza delle coordinate di tutti i
'pavimenti e soffitti creati.
'Anche questa volta tutto questo si verificherà solamente se la checkbox Rileva_Allineamento2 presente
'all'interno del Form_Opzioni, verrà selezionata
If Form_Opzioni.Rileva_Allineamento2.Value = 1 Then
For J = 0 To Max2
If SmouseX = SoP(J).CR.X1 Or SmouseY = SoP(J).CR.Y1 Then
Schermo.DrawFilledBox SmouseX - 3, SmouseY - 3, SmouseX + 3, SmouseY + 3, RGBA(CASOP.R, CASOP.G, CASOP.B, 1)
Schermo.DrawFilledBox SoP(J).CR.X1 - 3, SoP(J).CR.Y1 - 3, SoP(J).CR.X1 + 3, SoP(J).CR.Y1 + 3, RGBA(CASOP.R, CASOP.G, CASOP.B, 1)
End If
If SmouseX = SoP(J).CR.X2 Or SmouseY = SoP(J).CR.Y2 Then
Schermo.DrawFilledBox SmouseX - 3, SmouseY - 3, SmouseX + 3, SmouseY + 3, RGBA(CASOP.R, CASOP.G, CASOP.B, 1)
Schermo.DrawFilledBox SoP(J).CR.X2 - 3, SoP(J).CR.Y2 - 3, SoP(J).CR.X2 + 3, SoP(J).CR.Y2 + 3, RGBA(CASOP.R, CASOP.G, CASOP.B, 1)
End If
If SmouseX = SoP(J).X3 Or SmouseY = SoP(J).Y3 Then
Schermo.DrawFilledBox SmouseX - 3, SmouseY - 3, SmouseX + 3, SmouseY + 3, RGBA(CASOP.R, CASOP.G, CASOP.B, 1)
Schermo.DrawFilledBox SoP(J).X3 - 3, SoP(J).Y3 - 3, SoP(J).X3 + 3, SoP(J).Y3 + 3, RGBA(CASOP.R, CASOP.G, CASOP.B, 1)
End If
If SmouseX = SoP(J).X4 Or SmouseY = SoP(J).Y4 Then
Schermo.DrawFilledBox SmouseX - 3, SmouseY - 3, SmouseX + 3, SmouseY + 3, RGBA(CASOP.R, CASOP.G, CASOP.B, 1)
Schermo.DrawFilledBox SoP(J).X4 - 3, SoP(J).Y4 - 3, SoP(J).X4 + 3, SoP(J).Y4 + 3, RGBA(CASOP.R, CASOP.G, CASOP.B, 1)
End If
If SmouseY = SoP(J).CR.X1 Or SmouseY = SoP(J).CR.Y1 Then
Schermo.DrawFilledBox SmouseX - 3, SmouseY - 3, SmouseX + 3, SmouseY + 3, RGBA(CASOP.R, CASOP.G, CASOP.B, 1)
Schermo.DrawFilledBox SoP(J).CR.X1 - 3, SoP(J).CR.Y1 - 3, SoP(J).CR.X1 + 3, SoP(J).CR.Y1 + 3, RGBA(CASOP.R, CASOP.G, CASOP.B, 1)
End If
If SmouseY = SoP(J).CR.X2 Or SmouseY = SoP(J).CR.Y2 Then
Schermo.DrawFilledBox SmouseX - 3, SmouseY - 3, SmouseX + 3, SmouseY + 3, RGBA(CASOP.R, CASOP.G, CASOP.B, 1)
Schermo.DrawFilledBox SoP(J).CR.X2 - 3, SoP(J).CR.Y2 - 3, SoP(J).CR.X2 + 3, SoP(J).CR.Y2 + 3, RGBA(CASOP.R, CASOP.G, CASOP.B, 1)
End If
If SmouseY = SoP(J).X3 Or SmouseY = SoP(J).Y3 Then
Schermo.DrawFilledBox SmouseX - 3, SmouseY - 3, SmouseX + 3, SmouseY + 3, RGBA(CASOP.R, CASOP.G, CASOP.B, 1)
Schermo.DrawFilledBox SoP(J).X3 - 3, SoP(J).Y3 - 3, SoP(J).X3 + 3, SoP(J).Y3 + 3, RGBA(CASOP.R, CASOP.G, CASOP.B, 1)
End If
If SmouseY = SoP(J).X4 Or SmouseY = SoP(J).Y4 Then
Schermo.DrawFilledBox SmouseX - 3, SmouseY - 3, SmouseX + 3, SmouseY + 3, RGBA(CASOP.R, CASOP.G, CASOP.B, 1)
Schermo.DrawFilledBox SoP(J).X4 - 3, SoP(J).Y4 - 3, SoP(J).X4 + 3, SoP(J).Y4 + 3, RGBA(CASOP.R, CASOP.G, CASOP.B, 1)
End If
Next
End If
'Salvo il valore degli indici correnti su due variabili di appoggio
AppI = I
AppJ = J
'Se viene premuto il tasto sinistro del mouse e la variabile stato_riga=1 allora questo indicherà che la
'costruzione della riga attuale è complettata,quindi assegno le coordinate finali di questa,rispettivamente
'alla posizione attuale del mouse (valori X e Y),incremento il contatore per la costruzione di una nuova
'riga e aumento anche il valore della variabile Max che,ricordo,tiene il numero di righe già costruite,
'riporto la varibile stato_riga a valore 0,e infine,cosa più importante di tutte,eseguo un controllo
'IMPORTANTISSIMO che ora spiegherò...
'Se le coordinate di riga fossero impostate normalmente dove si trova il mouse,queste,
'se si trovassero a coincidere o all'inizio o alla fine,queste,non sarebbero perfettamente
'coincidenti,perchè ci sarebbe sempre un minimo errore,invece, adottando il metodo sotto
'descritto si può fare in modo che le coordinate delle nuova riga siano impostate in
'"Modo intelligente",assegnando le coordinate iniziali della nuova riga uguali
'alle coordinate della riga più vicina.Questo fa in modo che quando si dovranno creare
'i muri,si formino degli amgoli nella nostra mappa...
'Tutto questo avverrà solamente nel caso in cui l'utente premerà il pulsante Muri dal form
'delle opzioni
If Scelta_Oggetto = "Muro" Then
If B1 <> 0 And Stato_riga = 1 And SmouseX > 0 And SmouseX < Larghezza And SmouseY > 50 And SmouseY < Altezza Then
Riga(I).X2 = SmouseX
Riga(I).Y2 = SmouseY
For I = 0 To Max
TmpX1 = Riga(I).X1
TmpX2 = Riga(I).X2
TmpY1 = Riga(I).Y1
TmpY2 = Riga(I).Y2
If Riga(AppI).X2 > TmpX1 - 5 And Riga(AppI).X2 < TmpX1 + 5 And Riga(AppI).Y2 > TmpY1 - 5 And Riga(AppI).Y2 < TmpY1 + 5 Then
Riga(AppI).X2 = TmpX1
Riga(AppI).Y2 = TmpY1
Riga(AppI).SpigoloF = True
Riga(I).SpigoloI = True
ElseIf Riga(AppI).X2 > TmpX2 - 5 And Riga(AppI).X2 < TmpX2 + 5 And Riga(AppI).Y2 > TmpY2 - 5 And Riga(AppI).Y2 < TmpY2 + 5 Then
Riga(AppI).X2 = TmpX2
Riga(AppI).Y2 = TmpY2
Riga(AppI).SpigoloF = True
Riga(I).SpigoloF = True
End If
Next
'Ora aggiungo il muro appena creto all'oggetto Elenco_Muri presente all'interno del Form_Opzioni,
'in modo tale che questo possa essere selezionato in seguito per effettuarvi tutte le eventuali
'modifiche che l'utente riterrà opportune
Form_Opzioni.ElencoMuri.AddItem Riga(I).Nome
'Incemento la variabile I,in modo da passare al muro successivo di quello appena creato
I = I + 1
'Incremente la variabile Max,poichè il numero di muri preenti all'interno della mappa attuale
'è aumentato di 1
Max = Max + 1
'Riporto la variabile Stato_Riga alla sua impostazione iniziale,in modo che si possa
'ricominciare in seguito a costruire un nuovo muro
Stato_riga = 0
'Altrimenti se viene premuto il tasto destro del mouse, e lo stato_riga = 0,allora imposto le coordinate
'iniziali della nuova riga,rispettivamente alla posizione del mouse,e, ATTENZIONE,eseguo nuovamente
'il controllo precedentemente spiegato,però,questa volta,lo farò per le coordinate iniziali
'della nuova riga
ElseIf B2 <> 0 And Stato_riga = 0 And SmouseX > 0 And SmouseX < Larghezza And SmouseY > 50 And SmouseY < Altezza Then
Riga(I).X1 = SmouseX
Riga(I).Y1 = SmouseY
For I = 0 To Max
TmpX1 = Riga(I).X1
TmpX2 = Riga(I).X2
TmpY1 = Riga(I).Y1
TmpY2 = Riga(I).Y2
If Riga(AppI).X1 > TmpX1 - 5 And Riga(AppI).X1 < TmpX1 + 5 And Riga(AppI).Y1 > TmpY1 - 5 And Riga(AppI).Y1 < TmpY1 + 5 Then
Riga(AppI).X1 = TmpX1
Riga(AppI).Y1 = TmpY1
Riga(AppI).SpigoloI = True
Riga(I).SpigoloI = True
ElseIf Riga(AppI).X1 > TmpX2 - 5 And Riga(AppI).X1 < TmpX2 + 5 And Riga(AppI).Y1 > TmpY2 - 5 And Riga(AppI).Y1 < TmpY2 + 5 Then
Riga(AppI).X1 = TmpX2
Riga(AppI).Y1 = TmpY2
Riga(AppI).SpigoloI = True
Riga(I).SpigoloF = True
End If
Next
'Assegno alla variabile Stato_riga il valore 1,in modo da far capire al programma che sono già state
'impostate le coordinate iniziali del nuovo muro,e che quindi si dovrà passare ad assegnare le coordinate finali
Stato_riga = 1
End If
'Nel caso in cui invece l'utente premesse dal menù opzioni il pulsante per l'aggiunta di un pavimento allora
'si avvierà la stessa funzione sopra descritta,solamente che questa volta le linee intelligenti opereranno sulle
'coordinate dei muri, in modo da creare dei pavimenti assolutamente allineati con i limiti della stanza e quindi
'dei muri che la compongono
ElseIf Scelta_Oggetto = "Pavimento" Or Scelta_Oggetto = "Soffitto" Then
If B1 <> 0 And Stato_sop = 3 And SmouseX > 0 And SmouseX < Larghezza And SmouseY > 50 And SmouseY < Altezza Then
SoP(J).X4 = SmouseX
SoP(J).Y4 = SmouseY
For I = 0 To Max
TmpX1 = Riga(I).X1
TmpX2 = Riga(I).X2
TmpY1 = Riga(I).Y1
TmpY2 = Riga(I).Y2
If SoP(J).X4 > TmpX1 - 5 And SoP(J).X4 < TmpX1 + 5 And SoP(J).Y4 > TmpY1 - 5 And SoP(J).Y4 < TmpY1 + 5 Then
SoP(J).X4 = TmpX1
SoP(J).Y4 = TmpY1
SoP(J).CR.SpigoloI = True
ElseIf SoP(J).X4 > TmpX2 - 5 And SoP(J).X4 < TmpX2 + 5 And SoP(J).Y4 > TmpY2 - 5 And SoP(J).Y4 < TmpY2 + 5 Then
SoP(J).X4 = TmpX2
SoP(J).Y4 = TmpY2
SoP(J).CR.SpigoloF = True
End If
Next
'Se la costruzione appena creata è un Pavimento,allora...
If Scelta_Oggetto = "Pavimento" Then
'Assegno al Pavimento appena creato il suo nome,formato dalla parola "Pavimento" più
'l'indice della sua posizione all'interno della tabella Coordinate_SoP
If LinguaS = "Italiano" Then SoP(J).CR.Nome = "Pavimento " + Str(Max3 + 1)
If LinguaS = "Inglese" Then SoP(J).CR.Nome = "Floor " + Str(Max3 + 1)
'Aggiungo il Pavimento appena creato all'oggetto Elenco_SoP presnte all'interno
'del Form_Opzioni,in modo tale che l'utente potrà effettuarvi tutte le modifiche
'necessarie
Form_Opzioni.ElencoSoP.AddItem RTrim(SoP(J).CR.Nome)
'Inizializzo l'altitudine di default di ogni Pavimento uguale a 0
SoP(J).CR.Altitudine = 0
'Dichiaro che la costruzione appena creata è un Pavimento
SoP(J).Tipo = "Pavimento"
'Incremento la variabile Max3 di 1,ovvero quella variabile che tiene conto del numero
'di Pavimenti presenti all'interno della mappa attuale
Max3 = Max3 + 1
'Se invece la costruzione appena creata è un Soffitto,allora...
ElseIf Scelta_Oggetto = "Soffitto" Then
'Assegno al pavimento appena creato il suo nome,formato dalla parola "Soffitto" più
'l'indice della sua posizione all'interno della tabella Coordinate_SoP
If LinguaS = "Italiano" Then SoP(J).CR.Nome = "Soffitto " + Str(Max4 + 1)
If LinguaS = "Inglese" Then SoP(J).CR.Nome = "Ceiling " + Str(Max4 + 1)
'Aggiungo il Soffitto appena creato all'oggetto Elenco_SoP presnte all'interno
'del Form_Opzioni,in modo tale che l'utente potrà effettuarvi tutte le modifiche
'necessarie
Form_Opzioni.ElencoSoP.AddItem RTrim(SoP(J).CR.Nome)
'Inizializzo l'altitudine di default di ogni Soffitto uguale a 1000
SoP(J).CR.Altitudine = 1000
'Dichiaro che la costruzione appena creata è un Soffitto
SoP(J).Tipo = "Soffitto"
'Incremento la variabile Max4 di 1,ovvero quella variabile che tiene conto del numero
'di Soffitti presenti all'interno della mappa attuale
Max4 = Max4 + 1
End If
'Riporto la variabile Stato_Sop al suo valore iniziale in modo che in seguito si possa
'iniziare a costruire un nuovo Pavimento / Soffitto
Stato_sop = 0
'Incremento l'indice J,in modo che si possa passare al Pavimento / Soffitto successeivo
'a quello appena creato
J = J + 1
'Incremento la variabile Max2 che tiene conto del numero di Pavimenti più il numero di Soffitti
'presenti all'interno della mappa attuale
Max2 = Max2 + 1
'----------------------------
ElseIf B2 <> 0 And Stato_sop = 2 And SmouseX > 0 And SmouseX < Larghezza And SmouseY > 50 And SmouseY < Altezza Then
SoP(J).X3 = SmouseX
SoP(J).Y3 = SmouseY
For I = 0 To Max
TmpX1 = Riga(I).X1
TmpX2 = Riga(I).X2
TmpY1 = Riga(I).Y1
TmpY2 = Riga(I).Y2
If SoP(J).X3 > TmpX1 - 5 And SoP(J).X3 < TmpX1 + 5 And SoP(J).Y3 > TmpY1 - 5 And SoP(J).Y3 < TmpY1 + 5 Then
SoP(J).X3 = TmpX1
SoP(J).Y3 = TmpY1
SoP(J).CR.SpigoloI = True
ElseIf SoP(J).X3 > TmpX2 - 5 And SoP(J).X3 < TmpX2 + 5 And SoP(J).Y3 > TmpY2 - 5 And SoP(J).Y3 < TmpY2 + 5 Then
SoP(J).X3 = TmpX2
SoP(J).Y3 = TmpY2
SoP(J).CR.SpigoloF = True
End If
Next
Stato_sop = 3
'---------------------------------------
ElseIf B1 <> 0 And Stato_sop = 1 And SmouseX > 0 And SmouseX < Larghezza And SmouseY > 50 And SmouseY < Altezza Then
SoP(J).CR.X2 = SmouseX
SoP(J).CR.Y2 = SmouseY
For I = 0 To Max
TmpX1 = Riga(I).X1
TmpX2 = Riga(I).X2
TmpY1 = Riga(I).Y1
TmpY2 = Riga(I).Y2
If SoP(J).CR.X2 > TmpX1 - 5 And SoP(J).CR.X2 < TmpX1 + 5 And SoP(J).CR.Y2 > TmpY1 - 5 And SoP(J).CR.Y2 < TmpY1 + 5 Then
SoP(J).CR.X2 = TmpX1
SoP(J).CR.Y2 = TmpY1
SoP(J).CR.SpigoloI = True
ElseIf SoP(J).CR.X2 > TmpX2 - 5 And SoP(J).CR.X2 < TmpX2 + 5 And SoP(J).CR.Y2 > TmpY2 - 5 And SoP(J).CR.Y2 < TmpY2 + 5 Then
SoP(J).CR.X2 = TmpX2
SoP(J).CR.Y2 = TmpY2
SoP(J).CR.SpigoloF = True
End If
Next
Stato_sop = 2
'--------------
ElseIf B2 <> 0 And Stato_sop = 0 And SmouseX > 0 And SmouseX < Larghezza And SmouseY > 50 And SmouseY < Altezza Then
SoP(J).CR.X1 = SmouseX
SoP(J).CR.Y1 = SmouseY
For I = 0 To Max
TmpX1 = Riga(I).X1
TmpX2 = Riga(I).X2
TmpY1 = Riga(I).Y1
TmpY2 = Riga(I).Y2
If SoP(J).CR.X1 > TmpX1 - 5 And SoP(J).CR.X1 < TmpX1 + 5 And SoP(J).CR.Y1 > TmpY1 - 5 And SoP(J).CR.Y1 < TmpY1 + 5 Then
SoP(J).CR.X1 = TmpX1
SoP(J).CR.Y1 = TmpY1
SoP(J).CR.SpigoloI = True
ElseIf SoP(J).CR.X1 > TmpX2 - 5 And SoP(J).CR.X1 < TmpX2 + 5 And SoP(J).CR.Y1 > TmpY2 - 5 And SoP(J).CR.Y1 < TmpY2 + 5 Then
SoP(J).CR.X1 = TmpX2
SoP(J).CR.Y1 = TmpY2
SoP(J).CR.SpigoloF = True
End If
Next
Stato_sop = 1
End If
'----------------------------------------------
ElseIf Scelta_Oggetto = "Telecamera" Then
If B2 <> 0 Then
With PosizioneTelecamera
.X = SmouseX
.Z = SmouseY
Form_Opzioni.TelecameraX = Str(.X)
Form_Opzioni.TelecameraZ = Str(.Z)
End With
End If
End If
End Sub