Virtueller Spielautomat

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von NoIde.

    Virtueller Spielautomat

    Hallo liebe Leute.

    Nach einigen Programmen die ich bereits mit eurer Hilfe und Ideen programmiert habe, bin ich nun dabei ein weiteres zu erarbeiten.
    Habe mir einen 32 Zoll Touch Screen zugelegt und würde mir dort einen Spielautomaten mit einem Spiel erstellen wollen.
    So viel zur Idee.
    Bevor ich allerdings beginn, habe ich mir im Vorfeld Gedanken gemacht wie ich, die einzelnen Bilder oder Zahlen auf dem Walzen oder auch Scheiben (wie auf einem richtigen Spielautomat),
    so hin bekomme das es aussieht als würden diese sich bewegen bzw. drehen.

    Da ich noch nicht mal mehr eine Idee bzw. Ansatz habe, würde ich mich gerne an euch wenden.
    Würde mich freuen wenn mir jemand einen Tip, Ideen, oder Vorschläge hätte.

    Danke Euch im vorraus... :)
    Hey,

    also ich würde 3D Models mit Blender erstellen und die Texturen "Backen". Ich selbst würde das ganze Spiel dann mit der blender GameEngine machen, wenn du Python kannst, ist es recht easy.

    Wenn du das mit VB machen möchtest, kannst du die 3D-Modelle auch mit z.B. MonoGame nuzten, sieht besser aus als nur so tun als ob sich die Walzen sich drehen.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    @NoIde
    Hey danke für deinen Tipp, allerdings habe ich mit Python noch nicht gearbeitet und MonoGame sagt mir leider auch nix, werde mich mal schlau machen.
    Sonst hättest du keine Idee, wenn ich rein bei VB bleiben möchte, oder ist es garnicht möglich ??

    @Nolde
    Ist es richtig das ich MonoGame nur mit VS nutzen kann?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Otti“ ()

    Möglich ist das. Es ist allerdings möglich das dir die Performance nicht ausreicht.

    Mal Grob beschrieben wie es man machen könnte.
    Also prizipiell kannst du einfach die Position von Bildern ändern(z.B. oben nach unten) um das als Walzendrehung wahrzunehmen. Damit es schneller aussieht, kannst du einen Blur-Filter nutzen, aber um aber die Performance nicht dafür runter zudrücken, die Filter nicht in Echtzeit anwenden. Könnte man SpriteSheets nehmen, wo dann verschiedene Blurstärken schon gerendert sind. Da die Bilder ja nur innerhalb des Walzenbereichs sichtbar sein sollen, kann man nur bestimmte bereiche des aktuellen Spritesheetindex(nenn ich einfach mal) malen. Je schneller die Walze um so höher dein SpriteSheetIndex. Wobei nicht für jedes Bild ein extra SpriteSheet genutzt werden muss, kann alles in einem Image sein, z.B. (nicht pixel) x0 kein blur, x1 Blur, x2 Blur verstärken usw., auf der Y Achse steigend dann die weiteren Symbole.



    Sogar mit WPF kannst du 3D-Models nutzen, irgendwo hier im Forum habe ich mal eine Beispielprojekt gefunden. Finde es gerade aber nicht mehr wieder.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „NoIde“ ()

    Ich kann dir mal eine einfache Walze machen, wird aber morgen oder übermorgen sein. Viel zu tun, gerade sitze ich an einem Tool um meine AsusAura-Hardware ansteuern zu können, habe das für das SDK von Asus gerade mal den Wrapper fertig(nochmal neu gemacht) und sitze nun dran eine App dafür zu Designen.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    So habs doch schon gemacht, brauchte ein wenig Ablenkung. Dies nur ist exemplarisch gedacht, so sollte aber ersichtlich sein, wie ich das in etwa meinte. Das Spritesheet ist 150x250 PX gross, jedes "Feld" im Sheet hat eine Grösse von 50 x 50 PX.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private WithEvents Ticker As New Timer With {.Interval = 1}
    3. Private Roll As New Roller()
    4. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    5. Ticker.stop()
    6. End Sub
    7. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    8. DoubleBuffered = True
    9. TrackBar1.Maximum = 3
    10. Ticker.Start()
    11. End Sub
    12. Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    13. Roll.DrawRoller(e.Graphics, TrackBar1.Value)
    14. End Sub
    15. Private Sub Ticker_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Ticker.Tick
    16. Invalidate(Roll.Rect)
    17. End Sub
    18. End Class
    19. Public Class Roller
    20. Private Rand As New Random
    21. Public Sub New()
    22. For i = 0 To 3
    23. Fields(i) = New RollerField
    24. Fields(i).Rect = New Rectangle(Rect.X, Rect.Y + 50 * i, 50, 50)
    25. Fields(i).IconIndex = Rand.Next(0, 5)
    26. Next
    27. End Sub
    28. Public Rect As New Rectangle(100, 100, 50, 150)
    29. Private Sheet As Bitmap = My.Resources.sheet
    30. Private Fields(3) As RollerField
    31. Private OffSet As Integer = 1
    32. Public Sub DrawRoller(ByVal g As Graphics, ByVal speed As Integer)
    33. g.DrawRectangle(Pens.Black, Rect)
    34. Dim src As Rectangle
    35. Dim dest As Rectangle
    36. For i = 0 To 3
    37. Select Case i
    38. Case 0
    39. src = New Rectangle((speed - 1) * 50, Fields(i).IconIndex * 50 + 50 - OffSet, 50, OffSet)
    40. dest = New Rectangle(Fields(i).Rect.X, Fields(i).Rect.Y, 50, OffSet)
    41. Case 1, 2
    42. src = New Rectangle((speed - 1) * 50, Fields(i).IconIndex * 50, 50, 50)
    43. dest = New Rectangle(Fields(i).Rect.X, Fields(i).Rect.Y - 50 + OffSet, 50, 50)
    44. Case 3
    45. src = New Rectangle((speed - 1) * 50, Fields(i).IconIndex * 50, 50, 50 - OffSet)
    46. dest = New Rectangle(Fields(i).Rect.X, Fields(i).Rect.Y - 50 + OffSet, 50, 50 - OffSet)
    47. End Select
    48. If speed = 0 Then
    49. src.X = speed * 50
    50. End If
    51. g.DrawImage(Sheet, dest, src, GraphicsUnit.Pixel)
    52. Next
    53. OffSet += speed * 4
    54. If OffSet >= 51 Then
    55. Fields(3).IconIndex = Fields(2).IconIndex
    56. Fields(2).IconIndex = Fields(1).IconIndex
    57. Fields(1).IconIndex = Fields(0).IconIndex
    58. Fields(0).IconIndex = Rand.Next(0, 5)
    59. OffSet = 1
    60. End If
    61. End Sub
    62. End Class
    63. Public Class RollerField
    64. Public Rect As Rectangle
    65. Public IconIndex As Integer
    66. Public BlurIndex As Integer
    67. End Class




    Otti schrieb:

    Ist es richtig das ich MonoGame nur mit VS nutzen kann?


    Das weiss ich nicht. Kann sein das es so ist, musst du mal auf der MonoGame HP gucken.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „NoIde“ ()

    Du siehst ja das Bild mit den Zahlen in Post 1? Rechtsklick auf das Bild, Grafik speichern unter...
    Füge es zu deinen Ressourcen hinzu und du kannst den Code testen.

    Alternativ kannste natürlich ein eigenes Spritesheet nehmen, aber damit es mit diesem Code funktioniert, muss es min 150x250 px gross sein, jedes Feld im Sheet 50x50px.

    Natürlich kannst du auch ein fach so eine Bitmap instanzieren ohne ressource zu nutzen.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „NoIde“ ()

    @Nolde

    Hey Danke...war heute morgen ein bischen früh für mich :/ , habe ich bereits getestet.
    Laufen tut es, allerdings sieht es sehr überschnitten aus im lauf...ist das das was du meinstest???

    Ist ja schon fast wie ich es mir vorstelle, aber geht das auch mit einzelnen Bilder aus Ressourcen??
    Bilder
    • Bild.PNG

      2,54 kB, 82×182, 147 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Otti“ ()

    Ist auch machbar, wobei ich das so einfacher finde. Du kannst ein Mehrdimensionalen Array von Bitmaps nehmen, oder auch einzelne Instanzen, wobei es dann m.M.n komplizierter ist.

    Edit: @Otti
    Vllt. bringt dich etwas weiter, stell dir das Sheet wie ein Koordinatensystem vor, jedes "Feld/einzeles Bild" in dem koordinatensystem hat eine fest grösse.

    Also Bild reihe 1 Bild 1 'null basierter index
    x=0 * bildbreite
    y=0 * bildbreite

    reihe 1 bild 2
    x= 1 * bildbreite
    y = 0 * bildbreite

    reihe 2 bild 2
    x= 1 * bildbreite
    y = 1 * bildbreite

    usw.


    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „NoIde“ ()

    Machst es noch einfacher. Auf x hast du dann immer 0. Vllt. hilft dir diese Bild etwas. Die x Achse habe ich da jetzt nicht drin, bleibt ja bei einer spalte. Img Heigth auf dem Bild = die Höhe des einzelnes Bildes im Sheet.

    Bilder
    • Unbenannt.png

      6,2 kB, 244×600, 6 mal angesehen
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    Hab das mal vereinfacht. Wenn du das mit den Sheet jetzt soweit verstanden hast auf der Y-Achse, sollte das jetzt kein problem sein.
    Füge eine variable oder kanstante in der klasse Roller hinzu:

    VB.NET-Quellcode

    1. Const SpriteHeigth As Integer = 50


    So dann die Sub DrawRoller

    VB.NET-Quellcode

    1. Public Sub DrawRoller(ByVal g As Graphics, ByVal speed As Integer)
    2. g.DrawRectangle(Pens.Black, Rect)
    3. Dim src As Rectangle
    4. Dim dest As Rectangle
    5. For i = 0 To 3
    6. Select Case i
    7. Case 0
    8. src = New Rectangle(0, Fields(i).IconIndex * SpriteHeigth + SpriteHeigth - OffSet, SpriteHeigth, OffSet)
    9. dest = New Rectangle(Rect.X, Fields(i).Rect.Y, SpriteHeigth, OffSet)
    10. Case 1, 2
    11. src = New Rectangle(0, Fields(i).IconIndex * SpriteHeigth, SpriteHeigth, SpriteHeigth)
    12. dest = New Rectangle(Rect.X, Fields(i).Rect.Y - SpriteHeigth + OffSet, SpriteHeigth, SpriteHeigth)
    13. Case 3
    14. src = New Rectangle(0, Fields(i).IconIndex * SpriteHeigth, SpriteHeigth, SpriteHeigth - OffSet)
    15. dest = New Rectangle(Rect.X, Fields(i).Rect.Y - SpriteHeigth + OffSet, SpriteHeigth, SpriteHeigth - OffSet)
    16. End Select
    17. g.DrawImage(Sheet, dest, src, GraphicsUnit.Pixel)
    18. Next
    19. OffSet += speed * 4
    20. If OffSet >= Rect.Height \ 3 Then
    21. Fields(3).IconIndex = Fields(2).IconIndex
    22. Fields(2).IconIndex = Fields(1).IconIndex
    23. Fields(1).IconIndex = Fields(0).IconIndex
    24. Fields(0).IconIndex = Rand.Next(0, 5)
    25. OffSet = 1
    26. End If
    27. End Sub


    In meiner Mappe ist das dann sofort lauffähig. Och in der Klasse RollerField war noch eine ungenutzte Variable.
    BlurIndex, da ja weitere Spalten(im Sheet) wegfallen, kannst du sie nun auch entfernen.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.