Spiel: Schütz den Bunker

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2, 3  Weiter

Neue Antwort erstellen

Raiden93

Betreff: Spiel: Schütz den Bunker

BeitragSa, Sep 18, 2010 2:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo ich Programmiere gerade ein Minigame wo man in einem Bunker sitzt und Angreifer abwähren muss.

Nur weis ich jetzt nicht wie ich es hinkriege das ich nicht nur 1 Gegner habe sondern sagen wir mal 3.
Ich denke mal es wird in einer For schleife gemacht aber ich habe keine Ahnung wie ich es reallisieren könnte.
Ich würde mich freuen wenn ihr mir Tipps oder sogar Code Ausschnitte Posten könntet.

MeinCode:
Code: [AUSKLAPPEN]

;Project EndCore
;Anfang: 17.09.2010

Graphics 800,600,32,2
SetBuffer BackBuffer()
AppTitle "EndCore"
Global TimerFrame=CreateTimer(200)
HidePointer



;Laden von Daten
Global Spiel_Hintergrund_IMG = LoadImage ("GFX/SpielFeld.bmp")
Global Spiel_Mauer_IMG = LoadImage ("GFX/Mauer.bmp")
Global Spiel_Gegner1_IMG = LoadImage ("GFX/Gegner1.bmp")




;Variablen

Dim Gegner#(5,2)
Gegner#(1,1) = -100 ;Seite LinksRechts X
Gegner#(1,2) = Rand (50,550) ;Seite ObenUnter Y

Dim Spieler#(1,4)
Spieler#(1,1) = MouseX()
Spieler#(1,2) = MouseY()
Spieler#(1,3) = 3
Spieler#(1,4) = 3

Global Spiel_Modus = 2
Global Spiel_Upgrade_Mauer = 1
Global Spiel_Gegner1_Start = 1

Global Punkte = 0
Global Level = 2
Global Leben = 3




;Hauptschleife
Repeat
   Cls
   
   
   
   If Spiel_Modus = 0
      Spiel_Spieler_Maus()
   ElseIf Spiel_Modus = 1
      Spiel_Spieler_Maus()
   ElseIf Spiel_Modus = 2
      DrawImage Spiel_Hintergrund_IMG,0,0
      Spiel_Upgrade_Mauer_Function()
        Spiel_Gegner_Erstellen()
      Spiel_Spieler_Maus()
      Spiel_Status()
      Spiel_Lose()
      Spiel_Win()
   End If
   
   
   WaitTimer (TimerFrame)
   Flip 0
Until KeyHit (1)




;Funktionen
Function Spiel_Upgrade_Mauer_Function()
   Select Spiel_Upgrade_Mauer
      Case 1
         DrawImage Spiel_Mauer_IMG,600,0
   End Select
End Function

Function Spiel_Gegner_Erstellen()
   Select Level
      Case 1;Level 1
           DrawImage Spiel_Gegner1_IMG,Gegner#(1,1),Gegner#(1,2)
            Gegner#(1,1) = Gegner#(1,1) +1
           If  Gegner#(1,1) => 560
            Gegner#(1,1) = -100
            Gegner#(1,2) = Rand (50,550)
            Leben = Leben -1
           EndIf
           If MouseHit(1) And MouseDown(1)   
            If MouseX() => Gegner(1,1) And MouseX() =< Gegner(1,1)+50
               If MouseY() => Gegner(1,2) And MouseY() =< Gegner(1,2)+50
                  Gegner#(1,1) = -100
                    Gegner#(1,2) = Rand (50,550)
                      Punkte = Punkte +1
                 End If
               EndIf
           EndIf
      End If
   End Select
End Function

Function Spiel_Spieler_Maus()
   Color 255,0,0
   Oval MouseX(),MouseY(),3,3
End Function

Function Spiel_Status()
   Color 0,0,255
   Text 10,585,"Punkte: "+Punkte
   Text 150,585,"Leben: "+Leben
End Function

Function Spiel_Lose()
   If Leben =< 0
      Level = 0
      Text 400,585,"Verloren"
   End If
End Function

Function Spiel_Win()
   
End Function










 

PacMani

BeitragSa, Sep 18, 2010 2:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Types, Types, Types!
https://www.blitzforum.de/foru...hp?t=33551

Raiden93

BeitragSa, Sep 18, 2010 2:38
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm also mit dim Feldern gehts das also nicht?
 

PacMani

BeitragSa, Sep 18, 2010 2:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Types sind da doch deutlich flexibler.

Raiden93

BeitragSa, Sep 18, 2010 2:45
Antworten mit Zitat
Benutzer-Profile anzeigen
ok und wie sollte das dann in der For schleife aussehen das ist mein richtiges Problem ich weis nicht wie ich das machen soll.
 

PacMani

BeitragSa, Sep 18, 2010 2:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, also erstmal das Tutorial durchlesen, das ich dir verlinkt habe Wink

Dann bastelst du dir einen Type, der die wichtigen Daten für einen Gegner enthält, also Bild, X- und Y-Position, Geschwindigkeit, Munition, Lebenspunkte... was dir halt einfällt.

Darauf erstellst du 3 Variablen dieses Types, weil du 3 Gegner haben möchtest und initialisierst deren Bild, X- und Y-Position, Geschwindigkeit usw.

Wenn du dann gucken möchtest, ob du einen Gegner getroffen hast, musst du alle Typevariablen durchgehen:
Code: [AUSKLAPPEN]
Local GefundenerTyp.TypGegner
For GefundenerTyp = Each TypGegner
 ;hier kommt der Code hin, der für jeden Gegner ausgeführt werden soll
Next

hazumu-kun

BeitragSa, Sep 18, 2010 8:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde nicht 3 Variablen erstellen.
Da man sowieso immer alle Gegner gleichzeitig updaten sollte (Schritt weiterbewegen, Animationsframe ändern, wasauchimmer, schießen) reicht die for each Schleife.
Ein kleines Beispiel:
BlitzBasic: [AUSKLAPPEN]

Type Zombie
Field x,y
Field lebenspunkte
Field animframe
End Type

Local newZombie.Zombie
Local i
;Erstellt 10 neue Gegner vom Typ Zombie an zufälligen Bildschirmpositionen
For i=1 To 10
newZombie= New Zombie
newZombie\x= Rand (0,639)
newZombie\y= Rand (0,479)
newZombie\lebenspunkte= 100
newZombie\animframe=0
Next

[...]
;Dann irgendwo in der HAUPTSCHLEIFE:
UpdateZombies()
[...]

Function UpdateZombies()
Local updZombie.Zombie

For updZombie= Each Zombie
;Hier auf Kollisionen prüfen und evt. Lebenspunkte abziehen
;Bei 0 Lebenspunkten z.b.:
If updZombie\lebenspunkte<=0 Then
Delete updZombie ;Den Zombie löschen
Else
;Den aktuell gewählten Zombies weiterbewegen
;und/oder seinen Animationsframe ändern.
;Den Zombie einen Schuss mit irgendwas(Auge :D) abgeben lassen.
;etc...
EndIf
Next
End Function


Das mit den Animationsframes ist natürlich optional, aber das Grundprinzip müsste jetzt klar sein.

Das Management von vielen Datensätzen(Gegnereigenschaften hier) solltest du bei einer variablen Anzahl diesich häufig ändert nicht mit Dims lösen, stell dir vor du kommst in einen Level wo es 500 Gegner gibt, aber dein dim nur 200 schafft, dann müsstest du dich immer nach dem größten Level richten. Und wenn dann der User noch Level erstellen kann, müsstest du ihm eine Obergrenze aufdrücken.

Les das Tutorial bitte trotzdem noch, Types sind viel mächtiger als du jetzt aus meinem Beispiel sehen kannst.

P.s.: Man verzeihe mir mein goto in der for-each Schleife, mir fiel grade keine schönere Lösung ein, und ein goto für sinnvolle Zwecke schadet ja nicht.

EDIT: Korrigiert, siehe posts von pacman und hubsi unten.
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent
  • Zuletzt bearbeitet von hazumu-kun am So, Sep 19, 2010 12:32, insgesamt einmal bearbeitet

Raiden93

BeitragSa, Sep 18, 2010 9:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok das hat mir schon weiter geholfen ich werde jetzt erstmal lernen mit types umzugehen.
 

PacMani

BeitragSa, Sep 18, 2010 9:44
Antworten mit Zitat
Benutzer-Profile anzeigen
hazumu-kun hat Folgendes geschrieben:

P.s.: Man verzeihe mir mein goto in der for-each Schleife, mir fiel grade keine schönere Lösung ein, und ein goto für sinnvolle Zwecke schadet ja nicht.

Wieso? Geht das nicht mit Else? Smile

Hubsi

BeitragSa, Sep 18, 2010 10:16
Antworten mit Zitat
Benutzer-Profile anzeigen
hazumu-kun hat Folgendes geschrieben:
BlitzBasic: [AUSKLAPPEN]
If updZombie\lebenspunkte<=0 Then
updZombie= Null ;Den Zombie löschen



Null hebt die Verlinkung auf, löscht aber nicht den Eintrag. Bitte für sowas Delete verwenden. Das Goto läßt sich dann auch recht einfach mit einer temporären Variable umgehen:
BlitzBasic: [AUSKLAPPEN]
tmp_int=False
If updZombie\lebenspunkte<=0 Then
tmp_int=True
EndIf
; Noch anderer Code

If tmp_int Then Delete updZombie
; Schleifenende
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Raiden93

BeitragSa, Sep 18, 2010 14:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey ich würde gern wissen ob ich von midimaster die Darstellung für mich selbst vereinfachen könnte.

Seine:
Code: [AUSKLAPPEN]
Type PlayerTyp
   Field X#, Y#, Speed#
   Field Waffen$
   Field Leben%
End Type

Type GegnerTyp
   Field X#, Y#
   Field WaffenTyp%
   Field Leben%, KampfPower%
End Type


Meins:
Code: [AUSKLAPPEN]

Type PlayerTyp
   Field X#
   FieldY#
   Field  Speed#
   Field Waffen$
   Field Leben%
End Type

Type GegnerTyp
   Field X#
   Field Y#
   Field WaffenTyp%
   Field Leben%
   Field KampfPower%
End Type


Geht das auch?

BladeRunner

Moderator

BeitragSa, Sep 18, 2010 14:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie wäre es mit ausprobieren?
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

count-doku

BeitragSa, Sep 18, 2010 14:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Klar.
Ob du immer eine neue Field Zeile beginnst, oder alles in eine schreibst ist egal.
Es erleichtet nur den Durchblick es etwas zu sortieren.

z.B.:
BlitzBasic: [AUSKLAPPEN]
Type PlayerTyp
Field X#,Y#,Speed# ; Bewegung
Field Waffen$,Munition% ;Waffen
Field Leben%,Ruessi%
End Type


lg,
count-doku
  • Zuletzt bearbeitet von count-doku am Sa, Sep 18, 2010 14:22, insgesamt einmal bearbeitet

Raiden93

BeitragSa, Sep 18, 2010 14:22
Antworten mit Zitat
Benutzer-Profile anzeigen
ich bin gerade bei meinem Vater und da habe ich meine Programme nicht
 

Sterbendes Lüftlein

BeitragSa, Sep 18, 2010 14:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Text entfernt

Raiden93

BeitragSa, Sep 18, 2010 16:06
Antworten mit Zitat
Benutzer-Profile anzeigen
danke für den Tipp sieht besser aus ^^ und ein titel sollte ja auch möglichst oben stehen.So habe jetzt ein wenig rum experimentiert aber verstehe noch nicht ganz warum die kugeln niocth gespawnt werden.
Code: [AUSKLAPPEN]
;Lernen von Types
;Anfang: 18.09.2010

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

Graphics 800,600,32,2
Global Spieler.SpielerTyp
SetBuffer BackBuffer()

Spieler=New SpielerTyp
Spieler\Speed=0.05
Spieler\Y =500

Repeat
   Cls
   
   For i = 1 To 20
      Oval Spieler\X, Spieler\Y, 10, 10
   Next
   Spieler\X = Spieler\X +Spieler\Speed
   Flip 0
Until KeyHit(1)

count-doku

BeitragSa, Sep 18, 2010 16:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Also bei mir funzt das.
Es wandert eine Kugel von links nach rechts....

Insgesamt werden wohl 20 gemalt, aber alle übereinander:
BlitzBasic: [AUSKLAPPEN]
 For i = 1 To 20
Oval Spieler\X, Spieler\Y, 10, 10;alle auf gleicher Position
Next


Um mehrere zu erstellen, müsstest du mehrmals BlitzBasic: [AUSKLAPPEN]
Spieler=New SpielerTyp
Spieler\Speed=0.05
Spieler\Y =500
aufrufen.
Natürlich mit unterschiedlichen y werten oder geschwindigkeiten, damit man sie sieht.

bsp.:
BlitzBasic: [AUSKLAPPEN]
;Lernen von Types
;Anfang: 18.09.2010

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

Graphics 800,600,32,2
Global Spieler.SpielerTyp
SetBuffer BackBuffer()

For i=1 To 20;20 Kugeln erstellen.
Spieler=New SpielerTyp
Spieler\Speed=Rnd(0.01,0.25);Zufällige Geschw
Spieler\Y =Rnd(10,600-10); Zufällige Y Startpos
Next

Repeat
Cls

For Spieler.SpielerTyp=Each SpielerTyp
Oval Spieler\X, Spieler\Y, 10, 10
Spieler\X = Spieler\X +Spieler\Speed
Next

Flip 0
Until KeyHit(1)



Noch besser wäre es natürlich, die Kugeln zu löschen, wenn sie aus dem Bildschirm raus sind und
sie nicht nur einmal sondern auf eine bestimmte Bedingung zu erstellen:
BlitzBasic: [AUSKLAPPEN]
;Lernen von Types
;Anfang: 18.09.2010

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

Graphics 800,600,32,2
Global Spieler.SpielerTyp
SetBuffer BackBuffer()

For i=1 To 20
Spieler=New SpielerTyp
Spieler\Speed=Rnd(0.01,0.25)
Spieler\Y =Rnd(10,600-10)
Next

Repeat
Cls

For Spieler.SpielerTyp=Each SpielerTyp
Oval Spieler\X, Spieler\Y, 10, 10
Spieler\X = Spieler\X +Spieler\Speed#
If Spieler\X>800
Delete Spieler.SpielerTyp
End If
Next
If MouseHit(1) ;Maus links
Spieler=New SpielerTyp
Spieler\Speed=Rnd(0.01,0.25)
Spieler\Y =MouseY()
End If
Flip 0
Until KeyHit(1)

Natürlich könntest du eine feste Geschwindigkeit einstellen,
allerdings sieht man dann Kugeln, die vom gleichen Startpunkt im gleichem Moment starten nicht.


lg,
count

Raiden93

BeitragSa, Sep 18, 2010 18:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo ich habe mal ne Frage bei den Types

Spieler.SpielerTyp

Ist das "Spieler" die Hauptkategorie und "SpielerTyp" die Unterkategorie oder wie soll ich das verstehen?
 

PacMani

BeitragSa, Sep 18, 2010 18:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein... steht doch alles in Midimasters Tutorial.

Spieler ist eine Variable von der "Kategorie" SpielerTyp in diesem Falle.
Bei Hulk.TypMonster wäre "Hulk" eine Variable von der Kategorie TypMonster.

FireballFlame

BeitragSo, Sep 19, 2010 3:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Pac-Man hat Folgendes geschrieben:
"Kategorie"
Datentyp Wink

Ist eigentlich das gleiche wie bei anderen Variablen auch.
Bei "Text$" ist der Datentyp String, bei "Zahl#" ist er Float, bei "Spieler.SpielerTyp" ist er SpielerTyp.
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

Gehe zu Seite 1, 2, 3  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group