Problem mit Types (die zigtausenste^^)

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

NForcer

Betreff: Problem mit Types (die zigtausenste^^)

BeitragMo, Mai 09, 2005 21:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, ich hab mal wieder ein Problem^^
Eigentlich dachte ich, ich hätte die Types schon einigermaßen verstanden, aber nun tritt ein Fehler auf, den ich so gar nicht verstehe :(

Code: [AUSKLAPPEN]

graphics 800,600,32,3
setbuffer backbuffer()

;Erstellt ein KontainerType generell für Einheiten^^ (ist erweiterbar für Flugzeuge, Boote usw.)
Type Einheit
   field ID
   field Status
   field Name$
   field X,Y
   field r,g,b
   field groesse
   field Angriff,Schaden
end type

;for i = 1 bis Anzahl der zu erstellenden Soldaten
for i = 1 to 2
;Hier werden 2 Einheiten des Typs Soldat erstellt und mir Variablen gefüttert
   Soldat.Einheit = new Einheit
   ;Der Name der speziefischen Einheit
   Soldat\Name = "Soldat"
   ;X , Y Koordinaten werden festgelegt
   Soldat\X = i*110 : Soldat\Y = 20
   ;Farbe wird eingestellt
   Soldat\r = 255 :Soldat\g = 0:Soldat\b = 0
   ;größe des Kästchens
   Soldat\groesse = 5
   ;Schaden
   Soldat\Schaden = 100
   ;Angriff
   Soldat\Angriff = 5
next

;Siehe Soldat, nur mit anderen Werten
for j = 1 to 2
   Panzer.Einheit = new Einheit
      Panzer\Name = "Panzer"
      Panzer\X = j*30 : Panzer\Y = 300
      Panzer\r = 0 : Panzer\g = 255 : Panzer\b = 0
      Panzer\groesse = 15
      Panzer\Schaden = 300
      Panzer\Angriff = 100
      ;Panzer\Status = 0
next

repeat
cls

;Hier werden ALLE Einheiten des Typs Soldat aufgerufen (um auf sie zugreifen zu müssen)
for Soldat.Einheit = each Einheit
   Color Soldat\r,Soldat\g,Soldat\b
   rect Soldat\X,Soldat\Y,Soldat\groesse,Soldat\groesse
next

;siehe Soldat
for Panzer.Einheit = each Einheit
   Color Panzer\r,Panzer\g,Panzer\b
   rect Panzer\X,Panzer\Y,Panzer\groesse,Panzer\groesse
next

if mousehit(1)
   aX = mousex()
   aY = mousey()
endif


      if mousedown(1)
         rect aX,aY,mousex()-aX,mousey()-aY,0
         
         for Soldat.Einheit = each Einheit
            if rectsoverlap(aX,aY,mousex()-aX,mousex()-aY,Soldat\X,Soldat\Y,Soldat\groesse,Soldat\groesse) then
               Soldat\Status = 1
            else
               Soldat\Status = 0
            endif
         next
         
         for Panzer.Einheit = each Einheit
            if rectsoverlap(aX,aY,mousex()-aX,mousex()-aY,Panzer\X,Panzer\Y,Panzer\groesse,Panzer\groesse) then
               Panzer\Status = 1
            else
               Panzer\Status = 0
            endif
         next
      endif

      
            ;Abfrage:
for Panzer.Einheit = each Einheit
      if Panzer\Status = 1
         text Panzer\X-5,Panzer\Y+20, Panzer\Schaden
      endif
next
for Soldat.Einheit = each Einheit
      if Soldat\Status = 1
         text Soldat\X-5,Soldat\Y+20, Soldat\Schaden
         text Soldat\X-5,Soldat\Y+40, Soldat\Name
      endif
next

text 10,10, aX
text 10,30,aY
flip
until keyhit(1)
   


bei den beiden Soldaten (alias, rote Punkte) klappts ja so wie es soll, aber bei den Panzern (alias grün) funktioniert das Auswahlviereck gar nicht :(
1. werden sie nicht da aktiviert, wo ihre Koordinaten sind, und den linken kann man gar nicht einzeln ansprechen...

Und ich finde in meinem Code absolut keinen Fehler :(

Hoffentlich wiss ihr wodrann es liegt und könnt mir helfen...

mfG NForcer
Danke in Vorraus
 

Roseman

Betreff: Re: Problem mit Types (die zigtausenste^^)

BeitragMo, Mai 09, 2005 23:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstmal:
Du hast (deinem Code nach) Types prinzipiell verstanden.
Ich kann dich in der Beziehung also beruhigen Wink .
Aber leider steckt in deinem Code (wie so oft) der Fehler im Detail,
in deinem Fall sind es einfach nur 2 falsche Buchstaben:

NForcer hat Folgendes geschrieben:

if rectsoverlap(aX,aY,mousex()-aX,mousex()-aY,Soldat\X,Soldat\Y,Soldat\groesse,Soldat\groesse) then
if rectsoverlap(aX,aY,mousex()-aX,mousex()-aY,Panzer\X,Panzer\Y,Panzer\groesse,Panzer\groesse)


Mein Lösungsvorschlag:
Ersetze jeweils beim zweiten Auftreten von MouseX() das X durch ein Y Wink

Mfg Roseman
 

NForcer

BeitragDi, Mai 10, 2005 0:03
Antworten mit Zitat
Benutzer-Profile anzeigen
ehm...wie soll ich sagen^^...
Danke... so ein Fehler ist echt schon peinlich^^
Ich werde vorerst kein BlitzEdit2 mehr nehmen...
bei Blitz3D wirds anders geschrieben... da wärs mir sofort ins auge gefallen^^

(BlitzEdit2: mousex() ; B3D: MouseX() )...

naja.. danke... jetzt klapts jedenfalls...

*schämend in ecke stell*
 

Bigfreddy

BeitragDi, Mai 10, 2005 15:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Kennt ihr die simpsons?
Da gibt's doch einen Kerl namens: Mou

MouSEX() Wink

man war des ein Schenkelklopfer Very Happy Very Happy


(sry, der musste sein)
 

NForcer

BeitragDi, Mai 10, 2005 17:05
Antworten mit Zitat
Benutzer-Profile anzeigen
den kerl den du meinst, der heisst Moe !
mit seiner Bar : Moe's Bar ^^

*ich musste erst 1min grübeln wen du meinst^^*
 

Bigfreddy

BeitragDi, Mai 10, 2005 17:06
Antworten mit Zitat
Benutzer-Profile anzeigen
oh...sry

Alfadur

BeitragDi, Mai 10, 2005 18:44
Antworten mit Zitat
Benutzer-Profile anzeigen
ich bin auch garnicht so sicher ob die art wie du types verwendest überhaupt funktioniert. denn du hast zwar das field ID in deinem type, ich schätze das ist um soldaten von panzern zu unterscheiden, aber du nutzt es nirgends. und wenn du mit einer for each schleife jeden eintrag vom type einheit durchgehst, dann spuckt er dir sowohl panzer als auch soldaten aus ...

also wenn du mit soldat.einheit = new einheit anlegst, dann entsteht zwar ein neuer type eintrag im type einheit, aber der wird dir dann in jeder for each schleife angezeigt, wenn du nicht weiter differenzierst. ich denke du hast types noch nicht hunderpro verstanden ... entweder du, oder ich. Smile
A Cray is the only computer that runs an endless loop in less than four hours.
 

NForcer

BeitragDi, Mai 10, 2005 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
deswegen hab ich die beiden Abfragen ja auch voneinander getrennt:
siehe>>
Code: [AUSKLAPPEN]

for Panzer.Einheit = each Einheit
      if Panzer\Status = 1
         text Panzer\X-5,Panzer\Y+20, Panzer\Schaden
      endif
next
for Soldat.Einheit = each Einheit
      if Soldat\Status = 1
         text Soldat\X-5,Soldat\Y+20, Soldat\Schaden
         text Soldat\X-5,Soldat\Y+40, Soldat\Name
      endif
next


also ich gehe die Types einmal für Soldat.Einheit durch
und einmal für Panzer.Einheit... und die kann er im Programm auch sehr gut unterscheiden^^...


Aber mal eine Grundsätzlichere Frage:
Angenommen, ich wöllte ein Grundgerüst für ein Strategiespiel machen, wie würdet ihr das da mit den Types machen?

Später sollens ja mal viel mehr versch. Einheiten etc. geben, da müsste ich ja einen wirklich enormen aufwand mit den For-Each schleifen betreiben...

zudem kommt, es soll mal 3 Parteien geben, die alle jeweils verschiedene Einheiten, Gebäude Tech-Tree's etc. haben... :(
Ich kann mir das irgendwie gar nicht so richtig vorstellen wie ich das angehen soll...
naja... ich werde die Frage vllt. mal für nen neuen Thread komplett neu Formulieren^^ oder ich komme in den nächsten Tagen auch selbst drauf^^

ach was ich noch Fragen wollte:

ich hatte mal versucht das so zu machen:
Code: [AUSKLAPPEN]

Dim Identify$(10)
Identify(1) = "HQ"
Type_Name = "TGebaeude"

for Identify$.Type_Name = each Type_Name ...

das geht leider nicht, aber ich hab mal was von Blitzarrays gehört, könnte man sowas damitmachen?
dann könnte ich ja sowas wie

Code: [AUSKLAPPEN]

for i = 1 to 10
for Identify(i).Type_Name = each Type_Name ...

Dann müsste ich nicht jeden Type eintrag einzeln durchgehen, sondern könnte das in einer Schleife^^...

Oder kennt ihr bessere Methoden, sodass man trotzdem noch eine Art Tech-tree (also man kann Gebäude B nur bauen wenn Gebäude A steht...)
hat.

Danke^^
mfG NoobForcer^^

Alfadur

BeitragDi, Mai 10, 2005 19:34
Antworten mit Zitat
Benutzer-Profile anzeigen
das mit den einheiten funktioniert so aber nicht wie du das vorhast, denn panzer oder soldat ist ja nur ein zeiger auf einen type eintrag... und wenn du die nicht differenzierst, werden alle types durchgegangen... wie man an folgendem programm sieht ...

BlitzBasic: [AUSKLAPPEN]

Type einheit
Field name$
End Type

soldat.einheit=New einheit
soldat\name$=\"Hans\"
panzer.einheit=New einheit
panzer\name$=\"A7V\"

Print \"Soldaten\"
For soldat.einheit=Each einheit
Print soldat\name$
Next
Print
Print \"Panzer\"
For panzer.einheit=Each einheit
Print panzer\name$
Next

WaitKey()


also machst du dir am besten ein paar consts

const Panzer=0
const Soldat=1

dann machste dir in den type eintrag noch ein field einheitentyp und weißt dann dem typ die konstante zu, in deinem programm mußt du dann checken ob ob die einheit eben ein soldat oder ein panzer ist und mußt danach die verschiedenen aktionen machen ... so würde ichs tun.

edit : in deinem programm funktioniert es, weil du wahrscheinlich immer nur eine einheit angewählt hast, und deswegen auch immer nur die daten von der einheit dastehen. aber das das jetzt ein panzer ist und das andere ein soldat, das weiß das programm eigentlich nicht. das weiß es erst wenn du dem type eintrag noch das entsprechende feld für panzer oder soldat zuweißt.

dann würde auch folgendes reichen

BlitzBasic: [AUSKLAPPEN]

For einheit.einheit=Each einheit
If einheit\einheitentyp=Panzer Then
process_panzer()
End If
If einheit\einheitentyp=Soldat Then
process_soldat()
End If
Next
A Cray is the only computer that runs an endless loop in less than four hours.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group