Spielobjekten Eigenschaften für andere Objekte mitgeben?
Übersicht

![]() |
M0rgensternBetreff: Spielobjekten Eigenschaften für andere Objekte mitgeben? |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
Bevor du etwas neues beginnst, erledige das alte |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
Bevor du etwas neues beginnst, erledige das alte |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nur schnell hingeklatscht, das Prinzip kommt aber hoffentlich rüber:
BlitzBasic: [AUSKLAPPEN] Type TImage |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Jamagin |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 ![]() |
||
- Zuletzt bearbeitet von Jamagin am Di, Dez 22, 2009 17:09, insgesamt einmal bearbeitet
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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! ![]() lg. Jamagin ![]() |
||
Bevor du etwas neues beginnst, erledige das alte |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die SChüsse haben ja nen eigenen Type.
Oder wie genau meinst du das? |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group