Mein Sternen Typ

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Raiden93

Betreff: Mein Sternen Typ

BeitragDo, Sep 30, 2010 8:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey ich habe zum Lernen von Types ein kleines Sternen Feld machen wollen das Funktioniert soweit auch nur habe ich nicht mehr als 10 Sterne sondern es Spawnen einfach immer mehr?
Code: [AUSKLAPPEN]
AppTitle "Neuer Test"
Graphics 800,600,32,2
SetBuffer BackBuffer()



Type SterneTyp
   Field X#,Y#,Speed#
End Type


Global Sterne.SterneTyp

Repeat
   Cls
   
   SterneFUNK()
   
   
   
   
   
   
   Flip 0
Until KeyHit(1)




Function SterneFUNK()
   For i=1 To 10
      Sterne=New SterneTyp
      Sterne\X# = Rand(1,800)
      Sterne\Y# = Rand(1,800)
   Next
      
   For Sterne=Each SterneTyp
      Oval Sterne\X#,Sterne\Y#,3,3
   Next
End Function
   

Lunatix

BeitragDo, Sep 30, 2010 8:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Kein Wunder, du fürst "SterneFunc()" bei jedem schleifendurchlauf erneut aus, d.h. bei 60 Frames per Secound hast du pro Sekunde 60*10 Sterne erstellt Wink

Schreib SterneFunc() vor die Schleife =)
[size=9]Pro|gram|mier|er: Ein Organismus, der Koffein in Software umwandelt.
Geben Sie eine beliebige 11-stellige Primzahl ein, um fortzusetzen...

Dice of Darkness

BeitragDo, Sep 30, 2010 13:48
Antworten mit Zitat
Benutzer-Profile anzeigen
1) Ich weiß nicht, ob es funktioniert, wenn man die Feldeinträge mit Komma getrennt, hintereinander schreibt. Ich würde es sicherheitshalber so machen:

Code: [AUSKLAPPEN]
Type SterneTyp
   Field X#
   Field Y#
   Field Speed#
End Type


2) "Sterne.SterneTyp" ist der Objektname der einzelnen Stern-Instanzen. Das heißt, es ist nicht eine Variable im klassischen Sinne, sondern ein Name für mehrere Objekte, die von einem Type erzeugt werden. Deshalb brauchst du es nicht als Global zu definieren.

3) Zum eigentlichen Problem hat Lunatix schon das richtige gesagt: Wenn du die Funktion innerhalb der Hauptschleife ausführst, werden pro Sekunde hunderte neue Sterne erzeugt. Du könntest es zum Beispiel so umschreiben, dass jedesmal, wenn du die Leertaste (oder sonstwas) drückst, neue Sterne entstehen und die alten gelöscht werden. Außerdem würde ich das Zeichnen der Sterne in eine separate Function packen:

Code: [AUSKLAPPEN]
AppTitle "Neuer Test"
Graphics 800,600,32,2
SetBuffer BackBuffer()



Type SterneTyp
    Field X#
    Field Y#
    Field Speed#
End Type

Repeat
   
    If KeyHit(57) Then   ;wenn die Leertaste gedrueckt wird
        Cls()                    ;loesche den Bildschirm (alte Sterne)
        LoescheSterne()   ;loesche die Instanzen der alten Sterne
        SterneFUNK()      ;erzeuge neue Sterne
    EndIf
   
    MaleSterne()           ;zeichne die Ovals für die Stern-Instanzen
   
    Flip 0
Until KeyHit(1)




Function SterneFUNK()
    For i=1 To 10
        Sterne.SterneTyp=New SterneTyp
        Sterne\X# = Rand(1,800)
        Sterne\Y# = Rand(1,800)
    Next
   
End Function


Function MaleSterne()
   
    For Sterne.SterneTyp=Each SterneTyp
        Oval Sterne\X#,Sterne\Y#,3,3
    Next
   
End Function


Function LoescheSterne()
   
    For Sterne.SterneTyp = Each SterneTyp
        Delete Sterne.SterneTyp
    Next
   
End Function



Ich hoffe, du kannst damit etwas anfangen und damit weiter arbeiten.


MfG, Dice of Darkness
Gratis Spiele, Musik, Tools

Raiden93

BeitragDo, Sep 30, 2010 18:44
Antworten mit Zitat
Benutzer-Profile anzeigen
So ich habe es ein wenig anders gemacht ich hasse es wenn ich z.b nur Sterne machen will ganz viele Funktionen dafür machen zu müssen da kommentiere ich es lieber aus^^ guckt mal bitte über mein code und gebt mir Tipps was ich verbessern könnte eurer Meinung nach.

Und ein Tipp auch für Dice of Darkness du kannst es auch hinter einem Komma weiter schreiben habe ich aus Midimasters TuT.

Code: [AUSKLAPPEN]
AppTitle "Sterne Test"
Graphics 800,600,32,2
SetBuffer BackBuffer()



Type SterneTyp
    Field X# ,Y# ,Speed# ;Bewegung
End Type

Global Sterne.SterneTyp

Global Start = True

Repeat
    Cls()
   
    If Start = True  ;Sorgt dafür das die Function SterneFUNK nur 1 mal dürchläuft
      Start = False
        SterneFUNK()      ;Löscht und erstellt die Sterne
    EndIf
   
    MaleSterne()           ;zeichne die Ovals für die Stern-Instanzen
   
    Flip 0
Until KeyHit(1)




Function SterneFUNK()
   For Sterne.SterneTyp = Each SterneTyp
        Delete Sterne.SterneTyp
    Next
   
   Local i
    For i=1 To 80
        Sterne.SterneTyp=New SterneTyp
        Sterne\X# = Rand(1,800)
        Sterne\Y# = Rand(1,600)
    Next
End Function


Function MaleSterne()
   
    For Sterne.SterneTyp=Each SterneTyp
        Oval Sterne\X#,Sterne\Y#,3,3
      Sterne\X# = Sterne\X# -0.1
      If Sterne\X# <0
         Delete Sterne
         Sterne.SterneTyp=New SterneTyp
         Sterne\X# = Rand(800,800)
         Sterne\Y# = Rand(1,600)
      End If
    Next
   
End Function

das wurgel

BeitragDo, Sep 30, 2010 23:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest SterneFUNK auch einfach vor die Schleife packen und den Variablenkram weglassen. Aber an sich ist es schon die richtige Methode wenn man etwas nur einmal tun möchte.

Außerdem brauchst du Sterne wie Dice of Darkness schon gesagt hat nicht als Global zu definieren.
Guck dir Mal dieses Type-Beispiel an:
Code: [AUSKLAPPEN]
Local a.TDings=New TDings
a\einText="Kartoffel"

a=New TDings
a\einText="Möhre"

Local b.TDings
For b = Each TDings
    Print b\einText
Next

Type TDings
    Field einText$
End Type


Vielleicht hilft es dir weiter.
1 ist ungefähr 3

Raiden93

BeitragSo, Okt 03, 2010 11:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe die Sterne in meinem Spiel eingebaut und muss leider Feststellen das die Sterne über 1200 FPS weg ziehen gibt es keine Möglichkeit Sterne zu machen die weniger FPS ziehen?

Dice of Darkness

BeitragSo, Okt 03, 2010 15:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Wieso FPS "wegziehen"? Ist doch umso besser, wenn du eine hohe FPS-Rate hast, das zeigt zumindest dass dein Programm nicht besonders ressourcen-aufwendig ist^^.

Ne Spaß beiseite, um die FPS zu begrenzen nimmst du einfach einen Timer und packst den Befehl WaitTimer in die Hauptschleife. Allerdings wirkt sich der Timer dann natürlich auch auf das gesamte Programm aus (also wenn du zum Beispiel noch eine Funktion hast, wo der Spieler bei Tastendruck in eine Richtung läuft, dann wird er mit begrenztem Timer langsamer laufen und du musst eventuell die "Beschleunigung" anpassen).
Gratis Spiele, Musik, Tools

Raiden93

BeitragSo, Okt 03, 2010 15:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Das habe ich ja schon gemacht habe den Timer nur kurz abgeschaltet damit ich sehe wie viel FPS mein Spiel Unbegrenzt hat damit ich gucken kann wie viel FPS bei eingeschalteten Sternen ich habe und bei abgeschalteten.

Und bei Eingeschalteten habe ich 1200FPS weniger.

Xeres

Moderator

BeitragSo, Okt 03, 2010 16:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Zeichnest du Ovals? Die sind super langsam, weil recht komplexe Form. Zeichne vll. lieber eine Auswahl an Bildern.
Braucht es wirklich individuelle Sterne? Zeichne lieber eine kachelbares Bild mit Sternen darauf Arrow TileBlock, TileImage
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Raiden93

BeitragSo, Okt 03, 2010 16:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok so in der Art habe ich mir das wohl schon gedacht naja so kann ich die Sterne wenigstens beliebig ändern.

Raiden93

BeitragSo, Okt 03, 2010 17:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie kriege ich den mit TileBlock hin das die Sterne nicht gleich auftauchen sondern zufällig an einer Stelle ?

Code: [AUSKLAPPEN]
Graphics 800, 600, 32, 2
SetBuffer BackBuffer()

Global gfxBall = LoadImage("GFX\Stern.bmp")

Global test#

Repeat
   Cls
   
   
    TileBlock gfxBall,test,0
   
   test# = test# +0.3
   
   
   Flip 0
Until KeyHit(1)

Xeres

Moderator

BeitragSo, Okt 03, 2010 17:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Bild wiederholt sich logischerweise alle n * Breite Pixel. test# sollte also einen zufälligen Wert zwischen 0 und Breite erhalten.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Raiden93

BeitragSo, Okt 03, 2010 17:28
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm egal was für werte ich ihm auch gebe es bleibt gleich.

Code: [AUSKLAPPEN]
Graphics 800, 600, 32, 2
SetBuffer BackBuffer()

Global gfxBall = LoadImage("GFX\Stern.bmp")

Global test#

Repeat
   Cls
   
   TileBlock gfxBall,test#,500
   test# = Rnd(0.1,2)
   
   Flip 0
Until KeyHit(1)

Xeres

Moderator

BeitragSo, Okt 03, 2010 17:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Du setzt die X Variable auf Werte zwischen 0 und 2 Pixeln. Das ist vermutlich verdammt schwer zu sehen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Raiden93

BeitragSo, Okt 03, 2010 17:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Das einzige was sich hier ändert ist das das Bild weiter von links nach Rechts rutscht ich brauche aber Pausen in der Grafik so das es wie mein alter Code aussieht nur halt mit Bilder währe da nicht Types besser nur halt mit Bildern?

Xeres

Moderator

BeitragSo, Okt 03, 2010 17:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe die Befehle in der OH verlinkt - hast du nicht nachgelesen wie sie funktionieren, oder ist die Beschreibung da Unklar?
Wenn du es anders haben willst - mach es anders.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Raiden93

BeitragSo, Okt 03, 2010 17:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Dieser Grafikbefehl wird auf den kompletten Grafikbereich angewendet. Dabei wird der Grafikbereich mit einem Bild texturiert. Das heißt: das Bild wird solange wiederholt nebeneinander gezeichnet, bis der komplette Grafikbereich gefüllt ist

Ich habe mir es vorhin schon durchgelesen aber ich brauche ja Einzelne Bilder die nicht hintereinander gemalt werden sondern sollen die Bilder Vereinzelt gemalt werden.


EDIT: Ich habe es jetzt so gemacht.
Code: [AUSKLAPPEN]
Graphics 800,600,32,2
SetBuffer BackBuffer()

Type SterneTyp
   Field X#, Y#, Speed#
End Type

Global Sterne.SterneTyp




Global bild = LoadImage ("GFX/Stern.bmp")

For i=1 To 10
   Sterne.SterneTyp = New SterneTyp
   Sterne\X# = Rnd(1,800)
   Sterne\Y# = Rnd(1,600)
   Sterne\Speed# = Rnd(0.05,0.2)
Next



Repeat
   Cls
   
   
   For Sterne.SterneTyp = Each SterneTyp
      Sterne\X# = Sterne\X# +Sterne\Speed#
      DrawImage bild,Sterne\X#,Sterne\Y#
   Next
   
   For Sterne.SterneTyp = Each SterneTyp
      If Sterne\X# > 850
         Sterne\X# = -50
      End If
   Next
   
   
   
    Flip 0
Until KeyHit(1)

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group