Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Rapid Ball - MainForm.vb

MainForm.vb

Caricato da: Ale96
Scarica il programma completo

  1. Imports System.Drawing.Drawing2D
  2. 'così facilito alcun oprazioni di battitura
  3. Public Class MainForm
  4.     Dim BitmapGame As New Bitmap(1000, 700)
  5.     Dim g As Graphics = Graphics.FromImage(BitmapGame)
  6.     'g "avvolge" bitmapgame disegnandole sopra ciò che serve
  7.     Dim BallLocation As Point 'posizione della palla
  8.     Dim SolidsSurfaces As New List(Of Rectangle) 'superfici solide
  9.     Dim Traps As New List(Of Rectangle) 'trappole
  10.     Dim ApplicationState As State = State.NotPlayng 'lo stato di gioco
  11.     Dim rnd As New Random
  12.     Dim level As Byte = 1
  13.     Dim score As Integer = 0
  14.     Dim lives As Byte = 3
  15.     Private Sub RemoveLive()
  16.         If lives = 0 Then 'se le vite sono 0 il gioco termina
  17.             GameRefresh.Stop()
  18.             ApplicationState = State.NotPlayng
  19.             If score > 10000 Then 'ma se l'utente ha pù di 10.000 punti il computer regala un'altra possibilità al giocatore (se la vuole) e la dovrà pagare 10.000 punti
  20.                 If MessageBox.Show("Puoi trasformare 10.000 punti in una vita per continuare a giocare procedere?", Me.Text, MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
  21.                     'se l'utente accetta gli si regala una vita e riparte
  22.                     score -= 10000
  23.                     lives += 1
  24.                     SolidsSurfaces.Clear()
  25.                     Traps.Clear()
  26.                     SolidsSurfaces.Add(New Rectangle(350, 350, 300, 25))
  27.                     Traps.Add(New Rectangle(rnd.Next(0, 15) * 50, 450, 300, 25))
  28.                     SolidsSurfaces.Add(New Rectangle(rnd.Next(0, 15) * 50, 550, 300, 25))
  29.                     SolidsSurfaces.Add(New Rectangle(rnd.Next(0, 15) * 50, 650, 300, 25))
  30.                     BallLocation = New Point(425, 300)
  31.                     Exit Sub
  32.                 End If
  33.             End If
  34.             If MessageBox.Show("Hai totalizzato " & score & "punti" & Chr(10) & "Vuoi fare un'altra partita?", Me.Text, MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
  35.                 NewGame() 'se l'utente vuole inizia un nuovo gioco
  36.                 Exit Sub
  37.             Else
  38.                 Application.Exit() 'altrimenti si chiude la finstra
  39.                 'volendo avrei potuto usare Me.Close, ma Application.Exit interrompe i processi
  40.                 'e libera le unità di memoria del programma, chiudendolo
  41.             End If
  42.         Else
  43.             lives -= 1 'per chi non lo sapesse "Lives -= 1" = "Lives = Lives - 1"
  44.             LblLives.Text = "Vite: " & lives 'viene mostrato all'utente che ha una vita in meno
  45.             SolidsSurfaces.Clear() 'vengono cancellate tutte le informazioni di un precedente gioco
  46.             Traps.Clear()
  47.             SolidsSurfaces.Add(New Rectangle(350, 350, 300, 25))
  48.             Traps.Add(New Rectangle(rnd.Next(0, 15) * 50, 450, 300, 25))
  49.             SolidsSurfaces.Add(New Rectangle(rnd.Next(0, 15) * 50, 550, 300, 25))
  50.             SolidsSurfaces.Add(New Rectangle(rnd.Next(0, 15) * 50, 650, 300, 25))
  51.             BallLocation = New Point(425, 300)
  52.         End If
  53.     End Sub
  54.     Private Function IsOnObject(ByVal rect As Rectangle) As objects 'Attenzione: restituisc l'oggetto a contatto con la palla e non sovrapposto
  55.         'per trovare l'oggetto a contatto con una superficie solida verifica per tutte queste ultime se
  56.         'almeno uno dei due punti del bordo inferiore di rect appartenga al bordo superiore della superfice
  57.         'se ciò avviene vuol dire che rect è sopra la superficie
  58.         For Each SolidSurface As Rectangle In SolidsSurfaces
  59.             If (rect.Y + rect.Height = SolidSurface.Y And (rect.X > SolidSurface.X And rect.X < SolidSurface.X + SolidSurface.Width)) _
  60.             Or (rect.Y + rect.Height = SolidSurface.Y And (rect.X + rect.Width > SolidSurface.X And rect.X + rect.Width < SolidSurface.X + SolidSurface.Width)) Then
  61.                 Return objects.SolidSurface
  62.                 Exit Function
  63.             End If
  64.         Next
  65.         'altrimenti si va avanti e si verifica lo stesso con le trappole, solo che qui il computer
  66.         'concede un leggero margine d'errore
  67.         For Each trap As Rectangle In Traps
  68.             If (rect.Y + rect.Height = trap.Y And (rect.X - 20 > trap.X And rect.X + 20 < trap.X + trap.Width)) _
  69.             Or (rect.Y + rect.Height = trap.Y And (rect.X + rect.Width - 20 > trap.X And rect.X + rect.Width + 20 < trap.X + trap.Width)) Then
  70.                 'fose vi siete chiesti cosa siano quei +20 e -20, sono il magrine di errore che il computer concede all'utente
  71.                 Return objects.Trap
  72.                 Exit Function
  73.             End If
  74.         Next
  75.         'altrimenti se la funzione non si è interrotta prima vuol dire che rect non è a contatto con nulla
  76.         Return objects.Null
  77.     End Function
  78.     Enum State
  79.         Playng
  80.         Paused
  81.         NotPlayng
  82.     End Enum
  83.     Enum objects
  84.         Null
  85.         SolidSurface
  86.         Trap
  87.     End Enum
  88.     Private Sub ChangePause() Handles PausaToolStripMenuItem.Click
  89.         If ApplicationState = State.Playng Then
  90.             PausaToolStripMenuItem.Checked = True
  91.             GameRefresh.Stop()
  92.             ApplicationState = State.Paused
  93.         ElseIf ApplicationState = State.Paused Then
  94.             PausaToolStripMenuItem.Checked = False
  95.             GameRefresh.Start()
  96.             ApplicationState = State.Playng
  97.         End If
  98.     End Sub 'Cambia lo stato di pausa-non pausa
  99.  
  100.     'se non avete voglia di leggere questa sub vi dico solo che disegna sullo schermo
  101.     ' alcuni elementi del gioco.
  102.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  103.         g.SmoothingMode = SmoothingMode.AntiAlias
  104.         g.Clear(Color.Azure)
  105.         'vine crato lo sfondo azzurro chiaro
  106.         Dim pen As New Pen(Color.Black, 4)
  107.         Dim brush As New LinearGradientBrush(New PointF(0, 0), New PointF(50, 0), Color.Black, Color.White)
  108.         Dim blend As New ColorBlend(3)
  109.         blend.Positions = New Single() {0.0, 0.3, 1.0}
  110.         blend.Colors = New Color() {Color.Black, Color.Gray, Color.White}
  111.         brush.InterpolationColors = blend
  112.         'in questo modo si imposta la sfumatura, in questo caso composta da 3 colori
  113.         For temp As Integer = 0 To 1000 Step 50 'ovvero ad ogni next temp += 50
  114.             g.DrawLines(Pens.DarkGray, New PointF() {New PointF(temp + 12.5, 0), New PointF(temp + 25, 50), New PointF(temp + 37.5, 0)})
  115.             g.DrawLines(Pens.DarkGray, New PointF() {New PointF(temp + 12.5, 700), New PointF(temp + 25, 650), New PointF(temp + 37.5, 700)})
  116.             'vengono disegnati i bordi segettati in alto e in basso
  117.             g.FillPolygon(brush, New PointF() {New PointF(temp + 12.5, 0), New PointF(temp + 25, 50), New PointF(temp + 37.5, 0)})
  118.             g.FillPolygon(brush, New PointF() {New PointF(temp + 12.5, 700), New PointF(temp + 25, 650), New PointF(temp + 37.5, 700)})
  119.             'vengono quindi riempiti con colori sfunati
  120.         Next
  121.         g.DrawRectangle(pen, New Rectangle(0, 0, 999, 699))
  122.         'viene disegnato un rettanglolo nero intorno all'immagine
  123.         g.Flush() 'la classe graphics disegna tutti gli elmenti sulla bitmap
  124.         PbxGame.Image = BitmapGame
  125.     End Sub
  126.     Private Sub PbxGame_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
  127.         If ApplicationState = State.Playng Then
  128.             Select Case e.KeyCode
  129.                 Case Keys.Escape
  130.                     GameRefresh.Stop()
  131.                     ApplicationState = State.NotPlayng
  132.                     Application.DoEvents()
  133.                     If MessageBox.Show("Sei sicuro di voler uscire?", Me.Text, MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
  134.                         Application.Exit()
  135.                     End If
  136.                     ApplicationState = State.Playng
  137.                 Case Keys.Left
  138.                     If Not (BallLocation.X - 10 < 0) Then 'la palla si muove a sinistra solo se si può muovere a sinistra
  139.                         BallLocation = New Point(BallLocation.X - 10, BallLocation.Y)
  140.                     End If
  141.                 Case Keys.Right
  142.                     If Not (BallLocation.X + 60 > 1000) Then 'la palla si muove a dstra solo se si può muovere a destra
  143.                         BallLocation = New Point(BallLocation.X + 10, BallLocation.Y)
  144.                     End If
  145.                 Case Keys.Up
  146.                     If Not (BallLocation.X - 10 < 0) Then 'la palla si muove a sinistra solo se si può muovere a sinistra
  147.                         BallLocation = New Point(BallLocation.X - 10, BallLocation.Y)
  148.                     End If
  149.                 Case Keys.Down
  150.                     If Not (BallLocation.X + 60 > 1000) Then 'la palla si muove a dstra solo se si può muovere a destra
  151.                         BallLocation = New Point(BallLocation.X + 10, BallLocation.Y)
  152.                     End If
  153.                 Case Keys.A
  154.                     If Not (BallLocation.X - 10 < 0) Then 'la palla si muove a sinistra solo se si può muovere a sinistra
  155.                         BallLocation = New Point(BallLocation.X - 10, BallLocation.Y)
  156.                     End If
  157.                 Case Keys.S
  158.                     If Not (BallLocation.X + 60 > 1000) Then 'la palla si muove a dstra solo se si può muovere a destra
  159.                         BallLocation = New Point(BallLocation.X + 10, BallLocation.Y)
  160.                     End If
  161.                 Case Keys.P
  162.                     ChangePause()
  163.             End Select
  164.         ElseIf ApplicationState = State.Paused Then
  165.             If e.KeyCode = Keys.Escape Then ' se l'utente clicca esc gli vine chiesto se vuole uscire
  166.                 If MessageBox.Show("Sei sicuro di voler uscire?", Me.Text, MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
  167.                     Application.Exit()
  168.                     'se dice di si (quindi non ha cliccato per sbaglio) allora l'applicazione termina
  169.                 End If
  170.             Else
  171.                 ChangePause()
  172.             End If
  173.         Else
  174.             If e.KeyCode = Keys.Escape Then ' se l'utente clicca esc gli vine chiesto se vuole uscire
  175.                 If MessageBox.Show("Sei sicuro di voler uscir?", Me.Text, MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
  176.                     Application.Exit()
  177.                     'se dice di si (quindi non ha cliccato per sbaglio) allora l'applicazione termina
  178.                 End If
  179.             Else
  180.                 NewGame()
  181.             End If
  182.         End If
  183.     End Sub 'importante, serve a permettere all'utente di manovrare la palla
  184.     Private Sub GameRefresh_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GameRefresh.Tick
  185.         g.SmoothingMode = SmoothingMode.AntiAlias
  186.         'viene aggiornata l'immagine
  187.         Dim pen As New Pen(Color.Black, 4)
  188.         Dim brush As New LinearGradientBrush(New PointF(0, 0), New PointF(50, 0), Color.Black, Color.White)
  189.         Dim blend As New ColorBlend(3)
  190.         blend.Positions = New Single() {0.0, 0.3, 1.0}
  191.         blend.Colors = New Color() {Color.Black, Color.Gray, Color.White}
  192.         brush.InterpolationColors = blend
  193.         'in questo modo si imposta la sfumatura, in questo caso composta da 3 colori
  194.         g.Clear(Color.Azure)
  195.         'vine crato lo sfondo
  196.         'viene disegnata la palla
  197.         g.DrawEllipse(Pens.DarkRed, New Rectangle(BallLocation.X, BallLocation.Y, 50, 50))
  198.         g.FillEllipse(Brushes.Red, New Rectangle(BallLocation.X, BallLocation.Y, 50, 50))
  199.         If BallLocation.Y <= 40 Or BallLocation.Y >= 620 Then
  200.             'se la palla è troppo in alto o in basso vuol dire che ha colpito
  201.             'o il bordo superiore o quello inferiore quindi viene eliminata una vita
  202.             RemoveLive()
  203.             Exit Sub
  204.         End If
  205.         Select Case IsOnObject(New Rectangle(BallLocation.X, BallLocation.Y, 50, 50))
  206.             Case objects.SolidSurface
  207.                 'se sotto la palla c'è una superficie solida la palla vine trascinata in alto da essa.
  208.                 BallLocation = New Point(BallLocation.X, BallLocation.Y - 5)
  209.             Case objects.Trap
  210.                 'se la palla urta una trappola vine eliminata una vita
  211.                 RemoveLive()
  212.                 Exit Sub
  213.             Case Else
  214.                 BallLocation = New Point(BallLocation.X, BallLocation.Y + 15)
  215.                 'come avrete forse notato la palla cade più velocemente di quanto sale
  216.                 'inoltre se la palla è "in volo" (in realtà è caduta libera) il computer da un bonus di punti
  217.                 score = score + 2
  218.         End Select
  219.         'vengono disegnate le suprfici solide
  220.         For index As Integer = 0 To SolidsSurfaces.Count - 1
  221.             g.DrawRectangle(New Pen(Color.DarkBlue, 2), SolidsSurfaces(index))
  222.             g.FillRectangle(Brushes.Blue, SolidsSurfaces(index))
  223.             SolidsSurfaces(index) = New Rectangle(SolidsSurfaces(index).X, SolidsSurfaces(index).Y - 5, SolidsSurfaces(index).Width, SolidsSurfaces(index).Height)
  224.         Next
  225.         'e le trappole
  226.         For index As Integer = 0 To Traps.Count - 1
  227.             For temp As Integer = Traps(index).X To Traps(index).X + Traps(index).Width - 50 Step 50 'ovvero ad ogni next temp += 50
  228.                 g.DrawLines(Pens.DarkGray, New PointF() {New PointF(temp + 12.5, Traps(index).Y + Traps(index).Height), New PointF(temp + 25, Traps(index).Y + Traps(index).Height - 50), New PointF(temp + 37.5, Traps(index).Y + Traps(index).Height)})
  229.                 'vengono disegnati i bordi segettati in alto
  230.                 g.FillPolygon(brush, New PointF() {New PointF(temp + 12.5, Traps(index).Y + Traps(index).Height), New PointF(temp + 25, Traps(index).Y + Traps(index).Height - 50), New PointF(temp + 37.5, Traps(index).Y + Traps(index).Height)})
  231.                 'vengono quindi riempiti con colori sfunati
  232.             Next
  233.             g.DrawLine(New Pen(Color.Brown, 6), Traps(index).X, Traps(index).Y + Traps(index).Height, Traps(index).X + Traps(index).Width, Traps(index).Y + Traps(index).Height)
  234.             'infine sotto viene disegnata una linea marrone per coprire la parte inferiore dei triangoli disegnati sopra
  235.             Traps(index) = New Rectangle(Traps(index).X, Traps(index).Y - 5, Traps(index).Width, Traps(index).Height)
  236.         Next
  237.         'la superficie 0 è quella più in alto quindi sarà la prima ad essere distrutta, quando ciò
  238.         'avvinene la superficie subito sotto sarà la superficie 0 e si riparte da capo
  239.         'le superfici sono ordinate in alto quelle con indice minore e in basso quelle con indice maggiore
  240.         'per verificare meglio il funzionamento di cio inserite questo codice nel for precedente
  241.         'e fate partire l'applicazione, i numerini indicheranno l'indice di ogni rettangolo
  242.         'g.DrawString(index, Me.Font, Brushes.Black, SolidsSurfaces(index).X, SolidsSurfaces(index).Y)
  243.         If SolidsSurfaces(0).Location.Y = (-25) Then
  244.             'quando una superficie raggiunge questa posizione non si vede più, quindi la si elimina
  245.             'per liberare memoria
  246.             SolidsSurfaces.RemoveAt(0)
  247.         End If
  248.         'lo stesso vale per le trappole
  249.         If Traps(0).Location.Y = (-25) Then
  250.             Traps.RemoveAt(0)
  251.         End If
  252.         'essendo ordinate quella con maggiore indice dovrebbe essere più in basso, quindi se se ne deve
  253.         'creare un'altra ci si baserà sulla posizione di quella.
  254.         'lo stesso vale per le trappole
  255.         If SolidsSurfaces(SolidsSurfaces.Count - 1).Y = 600 Or Traps(Traps.Count - 1).Y = 600 Then
  256.             'il computer deve generare nuove superfici altrimenti la pallina cadrebbe
  257.             'quando la superficie più in basso ha come coordinata y 600 è abbastanza in alto per
  258.             'permettere la creazione di una nuova superficie
  259.             'il computer manterrà sullo schermo sempre una trappola
  260.             If Traps.Count = 1 Then
  261.                 Traps.Add(New Rectangle(rnd.Next(0, 15) * 50, 700, 300, 25))
  262.             Else
  263.                 SolidsSurfaces.Add(New Rectangle(rnd.Next(0, 15) * 50, 700, 300, 25))
  264.             End If
  265.         End If
  266.         For temp As Integer = 0 To 950 Step 50 'ovvero ad ogni next temp += 50
  267.             g.DrawLines(Pens.DarkGray, New PointF() {New PointF(temp + 12.5, 0), New PointF(temp + 25, 50), New PointF(temp + 37.5, 0)})
  268.             g.DrawLines(Pens.DarkGray, New PointF() {New PointF(temp + 12.5, 700), New PointF(temp + 25, 650), New PointF(temp + 37.5, 700)})
  269.             'vengono disegnati i bordi segettati in alto e in basso
  270.             g.FillPolygon(brush, New PointF() {New PointF(temp + 12.5, 0), New PointF(temp + 25, 50), New PointF(temp + 37.5, 0)})
  271.             g.FillPolygon(brush, New PointF() {New PointF(temp + 12.5, 700), New PointF(temp + 25, 650), New PointF(temp + 37.5, 700)})
  272.             'vengono quindi riempiti con colori sfunati
  273.         Next
  274.         g.DrawRectangle(pen, New Rectangle(0, 0, 999, 699))
  275.         'viene disegnato un rettanglolo nero intorno all'immagine
  276.         g.Flush() 'la classe graphics disegna tutti gli elmenti sulla bitmap
  277.         PbxGame.Image = BitmapGame
  278.         score += 2 'Vengono aggiunti due punti
  279.         LblScore.Text = "Punti: " & score
  280.     End Sub
  281.     Private Sub NewGame() Handles NuovaPartitaToolStripMenuItem.Click
  282.         SolidsSurfaces.Clear() 'vengono cancellate tutte le informazioni di un precedente gioco
  283.         Traps.Clear()
  284.         SolidsSurfaces.Add(New Rectangle(350, 350, 300, 25))
  285.         Traps.Add(New Rectangle(rnd.Next(0, 15) * 50, 450, 300, 25))
  286.         SolidsSurfaces.Add(New Rectangle(rnd.Next(0, 15) * 50, 550, 300, 25))
  287.         SolidsSurfaces.Add(New Rectangle(rnd.Next(0, 15) * 50, 650, 300, 25))
  288.         score = 0
  289.         LblScore.Text = "Punti: 0"
  290.         lives = 3
  291.         LblLives.Text = "Vite: 3"
  292.         LblLevel.Text = "Livello: " & level
  293.         GameRefresh.Interval = 25 * (6 - level) 'in base al livello si sceglie la velocità.
  294.         BallLocation = New Point(425, 300)
  295.         PausaToolStripMenuItem.Checked = False
  296.         GameRefresh.Start()
  297.         ApplicationState = State.Playng
  298.     End Sub
  299.     Private Sub ToolStripMenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem1.Click
  300.         ToolStripMenuItem2.Checked = False
  301.         ToolStripMenuItem3.Checked = False
  302.         ToolStripMenuItem4.Checked = False
  303.         ToolStripMenuItem5.Checked = False
  304.         level = 1
  305.     End Sub
  306.     Private Sub ToolStripMenuItem2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem2.Click
  307.         ToolStripMenuItem1.Checked = False
  308.         ToolStripMenuItem3.Checked = False
  309.         ToolStripMenuItem4.Checked = False
  310.         ToolStripMenuItem5.Checked = False
  311.         level = 2
  312.     End Sub
  313.     Private Sub ToolStripMenuItem3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem3.Click
  314.         ToolStripMenuItem1.Checked = False
  315.         ToolStripMenuItem2.Checked = False
  316.         ToolStripMenuItem4.Checked = False
  317.         ToolStripMenuItem5.Checked = False
  318.         level = 3
  319.     End Sub
  320.     Private Sub ToolStripMenuItem4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem4.Click
  321.         ToolStripMenuItem1.Checked = False
  322.         ToolStripMenuItem2.Checked = False
  323.         ToolStripMenuItem3.Checked = False
  324.         ToolStripMenuItem5.Checked = False
  325.         level = 4
  326.     End Sub
  327.     Private Sub ToolStripMenuItem5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem5.Click
  328.         ToolStripMenuItem1.Checked = False
  329.         ToolStripMenuItem2.Checked = False
  330.         ToolStripMenuItem3.Checked = False
  331.         ToolStripMenuItem4.Checked = False
  332.         level = 5
  333.     End Sub
  334.     Private Sub EsciToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles EsciToolStripMenuItem.Click
  335.         Application.Exit()
  336.     End Sub
  337. End Class
  338.  
  339. 'Breve spiegazione del funzionamento del gioco, se volete capirlo in dettaglio leggete il codice
  340. 'inizio: creare superficie al centro con sopra palla.
  341. 'Il timer serve a aggiornare la finestra di gioco dopo un tot di tempo
  342. 'ciò che appare sullo schermo è la rappresentazione grafica delle
  343. 'variabili dichiarate all'inizio, quindi se quelle cambiano l'immagine sullo
  344. 'schermo cambierà al suo nuovo aggiornamento
  345. 'la difficoltà del gioco è direttamente proporzionale all'itervallo di tempo fra 2 tick consecutivi del timer