Waffenwechsel wie umsetzen?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

M0rgenstern

Betreff: Waffenwechsel wie umsetzen?

BeitragMo, Apr 12, 2010 18:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Leute.
Ich habe grade ein kleines "OOP Problem".

UNdzwar möchte ich, dass man mit den Tasten 1 bis 6 die Waffen wechseln kann.
Die Waffen sind eine eigene Klasse und die gewählte Klasse ist ein Attribut der Spielerklasse.
Das Problem ist, dass es in BB Vorher so ausgesehen hat:

BlitzBasic: [AUSKLAPPEN]
If KeyDown(2) Then
Spieler\PGewWaffe\WReloadStVar = 0
Spieler\PGewWaffe = PW_Pistole
EndIf

If KeyDown(3) Then
Spieler\PGewWaffe\WReloadStVar = 0
Spieler\PGewWaffe = PW_MP
EndIf

If KeyDown(4) Then
Spieler\PGewWaffe\WReloadStVar = 0
Spieler\PGewWaffe = PW_Schrot
EndIf

If KeyDown(5) Then
Spieler\PGewWaffe\WReloadStVar = 0
Spieler\PGewWaffe = PW_MG
EndIf

If KeyDown(6) Then
Spieler\PGewWaffe\WReloadStVar = 0
Spieler\PGewWaffe = PW_Laser
EndIf

If KeyDown(7) Then
Spieler\PGewWaffe\WReloadStVar = 0
Spieler\PGewWaffe = PW_Magnum
EndIf


Die Variable PW_(NAME) war immer eine Instanz des Waffentypes.
Das Problem ist jetzt, dass die 6 Waffen in der main global deklariert werden und die Spielerklasse diese eben nicht kennt.

Die Frage ist jetzt: Wie sage ich der SPielerklasse welche Waffe im Moment ausgewählt ist, ohne jede einzelne Instanz der Waffenklasse zu übergeben?

Lg, M0rgenstern

DaysShadow

BeitragMo, Apr 12, 2010 19:08
Antworten mit Zitat
Benutzer-Profile anzeigen
So ganz verstehen tu ich dich nicht, aber das mag wohl an mir liegen Wink

Vielleicht hilft dir das bzw. kannst du mir sagen, ob das dem entspricht was du willst( nur sinngemäß, nicht benutzbar):

BlitzMax: [AUSKLAPPEN]
Type TWeapon

Field _damage:Int

'...usw usf.

End Type

Const PW_PISTOL:Int = 0
Const PW_RIFLE:Int = 1
Const PW_SHOTGUN:Int = 2

Global Weapons:TWeapon[ 6 ]

Weapons[ PW_PISTOL ] = New TWeapon.Init( param1, param2 ) 'Parameter für die Waffe halt
'Für die anderen 5 halt auch so

Type TPlayer

Field _weapon:TWeapon

Method Update:Int( )

If( KeyDown( KEY_1 ) )

_weapon = Weapons[ PW_PISTOL ]

End If

'usw usf.

End Method

End Type
Blessed is the mind too small for doubt

M0rgenstern

BeitragMo, Apr 12, 2010 19:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, das entspricht dem ganzen schon.
Aber dann gibt es zwei Probleme: 1. Ich müsste dann doch die Waffen übergeben, zumindest das zugehörige Array.
Und 2. Das ist denke ich nicht sooo dynamisch.
Aber das Problem hast du schon verstanden, keine Angst.
Oder geht das vielleicht gar nicht so dynamisch wie ich es mir vllt wünsche?

Lg, M0rgenstern

DaysShadow

BeitragMo, Apr 12, 2010 19:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, du musst niemals der Klasse TPlayer als solcher oder einer Instanz das ganze Array Weapons irgendwie bekannt machen(es ist ja global bekannt für alles und jeden), das ginge so wie ich es geschrieben habe, das Field _weapon würde immer nur eine Waffe aus Weapons bekommen.
Weiß auch gerade nicht was du dynamischer machen willst oder damit meinst..?

MfG DaysShadow
Blessed is the mind too small for doubt

M0rgenstern

BeitragMo, Apr 12, 2010 19:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, wenn ich mehrere Waffen habe, dan müsste ich das array entsprechend vergörßern und....

Ach nein, ist okay. Die Waffen selbst muss ich ja sowieso hardcoden, da ich die Variablen alle von Hand eintrage.

Vielen Dank, dann ist deine Lösung doch passend.

Dankeschön.

Lg, M0rgenstern

DaysShadow

BeitragMo, Apr 12, 2010 19:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du nicht hardcoden willst und die Waffen auslagern willst kannst du dir auch einen minimalen Parser dafür schreiben, hab ich auch mal gemacht und das geht relativ(!) einfach solange es nicht komplizierter wird Wink

MfG DaysShadow
Blessed is the mind too small for doubt

M0rgenstern

BeitragMo, Apr 12, 2010 19:46
Antworten mit Zitat
Benutzer-Profile anzeigen
UNd wie genau soll das funktionieren?
Bzw (bitte nicht schlagen): Was ist ein Parser?

Also, ich möchte das ganze so wenig hardcoden und so dynamisch wie (mir) möglich schreiben, da das Projekt schon etwas größer ist.
Ich schreibe mein Alien Shooter 2D auf BMAx neu.

Lg, M0rgenstern

mpmxyz

BeitragMo, Apr 12, 2010 19:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Stichwort: Wikipedia Wink
Einfach:
Wenn du z.B. einen Ini-Parser verwendest, kannst du deine Waffendefinitionen so speichern:
Code: [AUSKLAPPEN]
[Weapon]
   Damage="100"
   Reloadtime="1000"
   Name="Die Kanone"
   etc.
[/Weapon]
[Weapon]
...

Falls du zu faul bist: Im Forum müssten solche Teile auch für BlitzMax herumschwirren.
Der Vorteil der Inis gegenüber von direkt/byteweise abgespeicherten Daten ist, dass man sie direkt mit einem Texteditor bearbeiten kann.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

DaysShadow

BeitragMo, Apr 12, 2010 19:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Öhm, soweit ich das verstanden habe etwas das Text einliest und ihn in einer bestimmten Art und Weise auswertet.
Macht die BlitzMax IDE ja auch, die wertet ja den Code auch erst aus ob er richtig ist von der Syntax her usw.

Der sehr sporadische "Parser" hier:
BlitzMax: [AUSKLAPPEN]
Type TParser

Field _source:String
Field _objects:Int

Field _block:Int
Field _actualLine:String
Field _actualLineNumber:Int

Field _provinces:TSceProvince[]
Field _actualProvince:Int

Field _logStream:TStream
Field _errors:Int
Field _parseTime:Float

Method Init:TParser( source:String )

_source = source
_objects = 0
_block = 0
_actualLine = ""
_actualLineNumber = 0
_provinces = Null
_actualProvince = 0

_logStream = WriteStream("parseLog.txt")

Return Self

End Method

Method GetAmount:Int()

If _objects > 0 Return _objects

Local stream:TStream = ReadStream(_source)

Repeat

If stream.ReadLine().Contains("province") _objects:+ 1

Until stream.Eof()

stream.Close()

Return _objects

End Method

Method SetProvinces:Int(provinces:TSceProvince[])

_provinces = provinces

End Method

Method ParseFile:Int()

Local stream:TStream = ReadStream(_source)

If stream = Null Return False

_parseTime = MilliSecs()

Repeat

_actualLine = stream.ReadLine().Replace(" ", "")
_actualLineNumber:+ 1

If Not _block

If _actualLine.Contains("province")

If _actualLine.Contains("=")

If _actualLine.Contains("{")

_block = True
_provinces[_actualProvince] = New TSceProvince

Else

_actualLine = stream.ReadLine().Replace(" ", "")
_actualLineNumber:+ 1

If _actualLine.Contains("{")

_block = True
_provinces[_actualProvince] = New TSceProvince

Else

_logStream.WriteLine("Error in line " + (_actualLineNumber - 1) + "/" + _actualLineNumber + ": keyword province found but no block begin({) found")
_errors:+ 1

End If

End If
Else

_logStream.WriteLine("Error in line " + _actualLineNumber + ": keyword province found but operator(=) is missing")
_errors:+ 1

End If

End If

Else

If _actualLine.Contains("name")

If _actualLine.Contains("=")

_provinces[_actualProvince].SetName( Mid( _actualLine, _actualLine.Find("=") + 2, _actualLine.length - (_actualLine.Find("=") ) ).Replace("_", " " ) )

Else

_logStream.WriteLine("Error in line " + _actualLineNumber + ": keyword name found but operator(=) is missing")
_errors:+ 1

End If

Else If _actualLine.Contains("color")

If _actualLine.Contains("=")

_provinces[_actualProvince].SetColor( Int( Mid( _actualLine, _actualLine.Find("=") + 2, _actualLine.length - (_actualLine.Find("=")) ) ) )

Else

_logStream.WriteLine("Error in line " + _actualLineNumber + ": keyword color found but operator(=) is missing")
_errors:+ 1

End If

Else If _actualLine.Contains("taxes")

If _actualLine.Contains("=")

_provinces[_actualProvince].SetTaxes( Int( Mid( _actualLine, _actualLine.Find("=") + 2, _actualLine.length - (_actualLine.Find("=")) ) ) )

Else

_logStream.WriteLine("Error in line " + _actualLineNumber + ": keyword taxes found but operator(=) is missing")
_errors:+ 1

End If

Else If _actualLine.Contains("}")

_block = False
_actualProvince:+ 1

End If

End If

Until stream.Eof()

stream.Close()

_parseTime = MilliSecs() - _parseTime

_logStream.WriteLine("~nFile parsed in " + Mid( String( _parseTime ), 1, 4 ) + " seconds " + "with " + _errors + " errors and " + _objects + " objects")

Return True

End Method

End Type


Kann das hier auswerten bzw. lade ich damit Sachen ein Wink :

Code: [AUSKLAPPEN]
province = {

   name    = NSEA1
   color    = $FF0E1C66
   taxes    = 0

}


Der "Parser" an sich ist auf das Projekt zugeschnitten, also undymanisch, aber er funktioniert und gibt auch Fehler aus z.B. wenn die erste geschweifte Klammer fehlt oder so...^^

MfG DaysShadow
Blessed is the mind too small for doubt

M0rgenstern

BeitragMo, Apr 12, 2010 20:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Achso.
Also im Prinzip sowas wie ne kleine Scriptsprache.
Hm... Werde mal ins Codearchiv gucken, was mir aber eigentlich nicht so lieb ist.
Es funktioniert jetzt mit dem Array, aber eventuell schreibe ich später einen Parser.

Lg, M0rgenstern.

Vielen Dank.

Xeres

Moderator

BeitragMo, Apr 12, 2010 20:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bin sehr zufrieden mit dem XML Parser von Brucey.
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)

BladeRunner

Moderator

BeitragMo, Apr 12, 2010 21:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Oder Du benutzt Chaos.Clone und speicherst einmal die Liste mit allen Waffen und lädst die dann ein Smile
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

M0rgenstern

BeitragMo, Apr 12, 2010 21:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Was genau ist denn jetzt Chaos.Clone?

Lg, M0rgenstern

BladeRunner

Moderator

BeitragMo, Apr 12, 2010 21:20
Antworten mit Zitat
Benutzer-Profile anzeigen
https://www.blitzforum.de/foru...hp?t=33951
das ist Chaos.Clone.
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

Goodjee

BeitragMo, Apr 12, 2010 21:22
Antworten mit Zitat
Benutzer-Profile anzeigen
das ist aber der absolute overkill das hier zu benutzen für seine 10waffen...
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

BladeRunner

Moderator

BeitragMo, Apr 12, 2010 21:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Es kostet ihn ein paar Byte Speicher auf der Platte, ist beliebig erweiterbar und kostet ihn - so er denn das Laden nur einmalig zu Beginn erledigt - kaum Resourcen. Und all das mit einer Handvoll zeilen Code. Wo ist da der Overkill?
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

Goodjee

BeitragMo, Apr 12, 2010 21:29
Antworten mit Zitat
Benutzer-Profile anzeigen
ähm, ich sag mal so: Man kann zu fuß zum bäcker gehn um brötchen zu holen oder man nimmt den lamborghini Wink
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

BladeRunner

Moderator

BeitragMo, Apr 12, 2010 21:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Da sein Spiel ja nicht nur aus waffen und deren Wechsel bestehen wird gibt es sicher noch mehr Arbeit für das Modul.
Zudem: Wenn ich deinen Vergleich ernst nehme dürften wir kein Blitz benutzen, denn das bietet massig Luxus für den Spieleprogrammierer. Graphik mit einer Befelhszeile initialisieren? das ist Luxus pur...
Wink
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

Goodjee

BeitragMo, Apr 12, 2010 21:34
Antworten mit Zitat
Benutzer-Profile anzeigen
vermutlich ist es einfach persönliche vorliebe bzw subjektives empfinden...ich finds halt übertrieben, aber macht was ihr wollt Very Happy
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group