Spielobjekten Eigenschaften für andere Objekte mitgeben?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

M0rgenstern

Betreff: Spielobjekten Eigenschaften für andere Objekte mitgeben?

BeitragDi, Dez 22, 2009 16:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Leute.

Ich sitz hier grade und programmier an was kleinem rum, hab jetzt aber ein rein logisches Problem.

Ich hab verschiedene Gegnertypen die alle unterschiedlichze Schüsse abgeben.
Das heißt: Verschiedene Bilder, die auch unterschiedlich animiert sind etc.

Wenn ich jetzt die SChüsse erstellen lasse, dann will ich nicht mit "select Gegner\Art" überprüfen welche Gegner den Schuss abgeben, denn bei vielen Gegnerarten wäre das ne riesen Abfrage.
Wie könnte ich das jetzt einrichten, dass die Schüsse immer die entsprechenden Eigenschaften haben, dioe zum jeweiligen Gegner gehören?

Ich hab mir überlegt dem Gegnertype als felder Eigenschaften zu geben die später an die Schüsse übergeben werden, aber dann hätte ich zwei types mit mehr oder weniger den gleichen Eigenschaften.

Das gleiche Problem habe ich eigentlich bei den Gegnern.
Bei einem höheren Level sollen auch andere Gegner, aber auch "alte" Gegner kommen.
Ich will jetzt aber nicht wieder mit If oder Select überprüfen.
Geht das ganze nicht etwas "dynamischer"?
Mir kommt das ganze sehr zusammengehackt vor.

Wäre echt toll wenn mir jemand helfen könnte... Mach mir schon die ganze Zeit Gedanken drüber aber komm auf kein Ergebnis.

Lg, M0rgenstern

Xeres

Moderator

BeitragDi, Dez 22, 2009 16:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Beim erstellen der Gegner gleich den passenden Schuss auswählen?
Wenn du mal ein bisschen (Pseudo-)Code hast, wie das aussehen soll...
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)

M0rgenstern

BeitragDi, Dez 22, 2009 16:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie meinst du das, gleich den passenden Schuss erstellen?

Also, ich könnte dir die FUnktion für die Gegner geben wie sie im Moment ist.
Code: [AUSKLAPPEN]
Function SetEnemy()
   
   For i = 1 To Rand(1,3)
      
      Gegner.TGegner = New TGegner
      
      Gegner\YPos# = Rand(34, 727)
      Gegner\XPos# = 1040
      Gegner\Speed# = Rnd(4.3,5.0)
      Gegner\SchussTimer = 1000
      Gegner\SchussStart = MilliSecs()
      Gegner\Image = Drache
      Gegner\FrameTimer = 70
      Gegner\FrameStart = MilliSecs()
      Gegner\Frame = 0
      Gegner\Dead = 0
      Gegner\Level = 1
      Gegner\Erfahrung = 20
      
   Next
   
   GegnerStart = MilliSecs()
   
End Function


Die verschiedenen Arten sind halt noch nicht eingefügt.
Das Problem ist halt, dass ich verschiedene Bilder mit verschieden vielen Frames habe.
Genau wie bei den Schüssen.

Momentan sieht das bei den Schüssen noch so aus:

Code: [AUSKLAPPEN]
Function MoveShoot()
   
   For Schuss.TSchuss = Each TSchuss
      
      If Schuss\Parent = "Spieler" Then
         
         Schuss\XPos# = SChuss\XPos# + Schuss\Speed#
         
         If ((Schuss\Frametimer + Schuss\FrameStart) < MilliSecs()) Then
            
            If Schuss\Frame >= 3 Then Schuss\FrameSChalter = 2
            If Schuss\Frame <= 0 Then Schuss\FrameSchalter = 1
            Select Schuss\FrameSChalter
               Case 1
                  Schuss\Frame = Schuss\Frame + 1
                  
               Case 2
                  Schuss\Frame = Schuss\Frame - 1
            End Select
            
            Schuss\FrameStart = MilliSecs()
               
         EndIf
         
         If Schuss\XPos > 1030 Then Schuss\Dead = 1
         
         
      EndIf
      
      If Schuss\Parent = "Gegner" Then
         
         Schuss\XPos# = Schuss\XPos# - Schuss\Speed#
         
         If ((Schuss\Frametimer + Schuss\FrameStart) < MilliSecs()) Then
            
            SChuss\Frame = SChuss\Frame + 1
            If SChuss\Frame > 1 Then Schuss\Frame = 0
            
            Schuss\FrameStart = MilliSecs()
         EndIf
         
         If SChuss\XPos# < -20 Then Schuss\Dead = 1
         
         
      EndIf
      
      If Schuss\Dead = 1 Then Delete Schuss.Tschuss
      
   Next
   
End Function


Weil der Type der SChüsse eben für Gegner und Spieler gilt.

Lg, M0rgenstern

Jamagin

BeitragDi, Dez 22, 2009 16:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Ich würde für jeden Gegner ein eigenes Type machen. Das mit dem Schußtimer ist schon ein sehr guter Ansatz. Hast du für jeden Gegner ein eigenes Type, dann ersparst du dir eine Menge an Abfragen - logisch oder?

lg. Jamagin Cool
Bevor du etwas neues beginnst, erledige das alte

Xeres

Moderator

BeitragDi, Dez 22, 2009 16:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du einen Gegner erstellst, weißt du, welche Art der sein soll - dann teilst du ihm gleich beim erstellen mit, welchen Schuss-Typ er verwenden soll - die kannst du dann allgemein behandeln.
Für die verschiedenen Bilder kannst du einen Type erstellen, der alle Informationen automatisch verwaltet.

Edit:
Jamagin hat Folgendes geschrieben:
Hast du für jeden Gegner ein eigenes Type, dann ersparst du dir eine Menge an Abfragen - logisch oder?
Nein, das ist absolut nicht logisch. Einen Type kann man allgemein behandeln, viele verschiedene Types muss man jeweils einzeln behandeln...
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)
  • Zuletzt bearbeitet von Xeres am Di, Dez 22, 2009 16:50, insgesamt einmal bearbeitet

M0rgenstern

BeitragDi, Dez 22, 2009 16:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Für jeden Gegner nen eigenen Type?
Wäre schön einfach, aber mir kommt das so vor als wären Types damit relativ falsch genutzt.
Das hört sich nicht gerade nach OOP an, sorry. Oder hab ich nen Denkfehler drin?

Lg, M0rgenstern

Edit: Xeres, sorry, aber ich weiß echt nicht genau wie du das meinst. Noch nen Type für Bilder oder wie?
Kannste mal bitte Pseudocode geben?

Lg, M0rgenstern

Jamagin

BeitragDi, Dez 22, 2009 16:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja klar - Denkfehler!!

Erstens bist du mit Types flexible und zweitens sollen ja deine Gegner verschiedene Eigenschaften bzw. Schüsse haben oder?

Ist das gleiche wie mit Autos, sind auch nicht alles Mercedes obwohl der Klassenbegriff "Auto" ist!!

Wenn du das nicht verstehst, werde ich dir einen kleinen Codeschnippsel hier reinstellen, okay?

lg. Jamagin Cool
Bevor du etwas neues beginnst, erledige das alte

Xeres

Moderator

BeitragDi, Dez 22, 2009 16:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Nur schnell hingeklatscht, das Prinzip kommt aber hoffentlich rüber:
BlitzBasic: [AUSKLAPPEN]
Type TImage
Field img
Field Frame, MaxFrame
Field ms_per_frame, time
End Type

Type TGegner
Field x,y
Field img.TImage
End Type

Function Create_Image.TImage(img, MaxFrame, msframe)
Local i.TImage = New TImage
i\img = img
i\MaxFrame = MaxFrame
i\ms_per_frame = msframe
Return i
End Function

Function DrawTImage(g.TGegner)
DrawImage(g\img\img , g\x, g\y, g\img\Frame)

;Automatisch nach der passenden Zeit Frame weiter schalten...
If g\img\ms_per_frame+ms < g\img\time Then
g\img\time = ms
g\img\Frame = (g\img\Frame+1)Mod g\img\MaxFrame
EndIf
End Function

Local bild = LoadImage(...)

Local Gegner.TGegner = New TGegner
Gegner\img = Create_Image(bild, 2, 1000)
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)

Jamagin

BeitragDi, Dez 22, 2009 17:06
Antworten mit Zitat
Benutzer-Profile anzeigen
@Morgenstern

Code: [AUSKLAPPEN]

; Diese Funktion erstellt eine Festung an den Koordinaten x, y
; frame = 0 bedeutet keine Animationsbilder
; hits = 4 bedeutet 4 Schüsse um die Festung zu zerstörung
Function Festung1(x, y)
   myfestung1.festung1type = New festung1type
   myfestung1\x = x
   myfestung1\y = y
   myfestung1\frame = 0
   myfestung1\hits = 4
End Function

; Diese Funktion zeichnet die Festung und wird permanent in der Spielschleife aufgerufen
; die Variable numdrills gibt an wieviele Gegnerobjekte aus der Festung rauskommen
; wenn diese kleiner ist als der vorgegebene Wert dann wird mittels eines Timers und Bereichsprüfung
; ob sich der Spieler in der Nähe der Festung befindet eine weitere Funktion aufgerufen, die die Gegnerobjekte erstellt
; mit dem drilltimer wird dann jeweils eine kleine Verzögerung verwaltet sodaß die Gegnerobjekte einen kleinen Abstand
; zwischen sich selbst haben, sonst wären ja alle auf einem Fleck
; Wenn die Festung aus dem Blickfeld verschwindet zB. linke Bildschirmseite dann soll dieses Objekt gelöscht werden.
; Da die Gegnerobjekte aber nur dann erstellt werden, wenn die Festung da ist und der Spieler sich in der Nähe befindet
; ist das eigentlich sehr flexibel...
; Die Namen der Variablen sind natürlich fantasie....
Function DrawFestung1()
   For myfestung1.festung1type= Each festung1type
      If numdrills<6
         If MilliSecs() > myfestung1\drilltimer
            If Abs(myfestung1\x-Scrollspeed-myship\x) < 160
               numdrills = numdrills + 1
               Enemy14( myfestung1\x-Scrollspeed+8, myfestung1\y )
               myfestung1\drilltimer = MilliSecs() + 128
            EndIf
         EndIf
      EndIf
      If myfestung1\x-Scrollspeed < -32
         Delete myfestung1
         numdrills=0
   Else
      DrawImage FE1, myfestung1\x-Scrollspeed, myfestung1\y, myfestung1\frame
      EndIf
   Next
End Function


Vielleicht hilft es dir ja weiter...!

Aja, und hier die Objekte für diese Festung

Code: [AUSKLAPPEN]

Function Enemy14(x,y)
      myenemy14.enemy14type = New enemy14type
      myenemy14\x = x
      myenemy14\y = y
      myenemy14\frame = 0
      myenemy14\maxframe = 9
End Function
Function DrawEnemy14()
   For myenemy14.enemy14type = Each enemy14type
      If MilliSecs() > myenemy14\frametimer
         myenemy14\frame = myenemy14\frame + 1
         If myenemy14\frame > myenemy14\maxframe
            myenemy14\frame = 0
         EndIf
            myenemy14\frametimer = MilliSecs()+50
      EndIf
      myenemy14\timerx=myenemy14\timerx+2
      If myenemy14\timerx>3 Then myenemy14\timerx=0:myenemy14\x=myenemy14\x-1
      If myenemy14\y>48 Then myenemy14\y=myenemy14\y-1
      If myenemy14\y=<48 Then myenemy14\x=myenemy14\x-2
      If myenemy14\x<-32
         Delete myenemy14
      Else
         DrawImage EN12, myenemy14\x, myenemy14\y, myenemy14\frame
      EndIf
   Next
End Function


lg. Jamagin Cool
  • Zuletzt bearbeitet von Jamagin am Di, Dez 22, 2009 17:09, insgesamt einmal bearbeitet

M0rgenstern

BeitragDi, Dez 22, 2009 17:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Achso meinst du das mit den Bildern.
Ja das ist super... Werd ich wohl dann so machen, dann wäre wenigstens das Problem gelöst.

Jetzt häng ich aber immernoch an dem eigentlichen Problem, also den Schüssen und die Arten der Gegner.

@Jamagin: poste mal bitte Nen Pseudocodeschnipsel, ich versteh zwar was du meinst, aber um bei deinem Beispiel zu bleiben, ich würd das bei mir so machen:

Code: [AUSKLAPPEN]
type TAuto
Field Marke$, PS, MaxSpeed, Beschleunigung#, Gewicht
end type

global Auto.TAuto = new TAuto
Auto\Marke = "Porsche"
Auto\PS = 300
Auto\MaxSpeed = 260
Auto\Beschleunigung# = 1.5
Auto\Gewicht = 700

global Auto.TAuto = new TAuto
Auto\Marke = "Mercedes"
Auto\PS = 210
Auto\MaxSpeed = 200
Auto\Beschleunigung# = 0.9
Auto\Gewicht = 680


Oder Meintest du das anders?

Lg, M0rgenstern

robotx

BeitragDi, Dez 22, 2009 17:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]


Type TGegner
   Field id
   Field xpos#, ypos
   Field art
   Field bild
   Field schussStaerke
End Type


Type TemplateGegner
   Field name$
   Field bild
   Field schussStaerke
   Field geschwindigkeit
End Type

Global TemplateGegner.TemplateGegner

Function dieTemplatesAllerGegnerladen ()
.......
End Function


Function SetEnemy (typ$)
 
            Gegner.TGegner = New TGegner
     
                 Gegner\YPos# = Rand(34, 727)
                 Gegner\XPos# = 1040

                For TemplateGegner = EachIn TemplateGegner.TemplateGegner
                   If TemplateGegner.name = typ
                        Gegner\bild  =   TemplateGegner\bild
                        Gegner\schussStaerke = TemplateGegner\schussStaerke
                         ...........
                   Endif
              Next

End Function




EDIT: "Nur eine Sache: Es müsste eigentlich in der Abfrage TemplateGegner\name = typ sein, oder? nicht .name. "
Sry, da bin ich wohl bei BMax gelandet!
www.botbomb.robotzgames.de
www.robotzgames.de
  • Zuletzt bearbeitet von robotx am Di, Dez 22, 2009 17:50, insgesamt einmal bearbeitet

M0rgenstern

BeitragDi, Dez 22, 2009 17:16
Antworten mit Zitat
Benutzer-Profile anzeigen
WOW RobotX, das ist genail.
Erst dachte ich: Was soll das? Das sind doch wieder If Abfragen.
Aber dann hab ich gemerkt, wie das ganze funktioniert.

Nur eine Sache: Es müsste eigentlich in der Abfrage TemplateGegner\name = typ sein, oder? nicht .name.
Das ganze könnte ich dann auch noch für die SChüsse machen.
Vielen Dank.

@ Jamagin.
Ich versteh, was dein Code macht, aber was hat er mit der ganzen Sache hier zu tun?


Lg, M0rgenstern

Jamagin

BeitragDi, Dez 22, 2009 17:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist ja nur ein Beispiel von mir gewesen wie du es machen könntest, weil die Grundfrage ja war, verschiedene Gegner - verschiedene Schüsse!

Na gut, dann lieg ich halt falsch, sorry!

I sag nix mehr! Shocked

lg. Jamagin Cool
Bevor du etwas neues beginnst, erledige das alte

Xeres

Moderator

BeitragDi, Dez 22, 2009 17:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest, wie robotx gepostet hat, Templates oder ein Klassensystem verwenden (per name oder direkter per Variable). Und/oder du packst Schüsse in einen Eigenen Type... Das selbe wie bei den Bildern: Alles ganz allgemein abhandeln. So brauch man eigentlich keine - oder nur in Spezialfällen - gesonderte Abfragen.
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)

M0rgenstern

BeitragDi, Dez 22, 2009 17:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Die SChüsse haben ja nen eigenen Type.
Oder wie genau meinst du das?

Xeres

Moderator

BeitragDi, Dez 22, 2009 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Etwas Missverständlich; Ich meinte, du kannst jedem Gegner eine Schuss-Klasse geben, die die Eigenschaften für das Projektil (das, was man auf dem Bildschirm als Kugel/Zauber sieht) bestimmt. Dann könntest du Waffen und Gegner in jeder Kombination benutzen.
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)

M0rgenstern

BeitragDi, Dez 22, 2009 17:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Achso, also, dass ich die BIlder für dich SChüsse genauso gestalte wie die Gegner, also wie du das gezeigt hast?
Ja, das hätte ich jetzt sowieso gemacht.
Wenn man schon dabei ist^^

Lg, M0rgenstern

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group