Function - Type als Parameter...

Übersicht BlitzBasic BlitzPlus

Neue Antwort erstellen

 

BlitzBirne

Betreff: Function - Type als Parameter...

BeitragDi, Jul 25, 2006 15:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich möchte mir das 50xe wiederholen von Code sparen...

1. Ich benutze 5 Types die die selbe Funktion durchlaufen sollen d.h. zb SPRITE

2. Die Types sind definiert und initiaslisiert.

der Pseudo-Code sieht ZB so aus:

Code: [AUSKLAPPEN]

Function CollitestALL()
         for S.Sprite = each Sprite
              TST_COLL( S)
         next

        For E.Enemy = each Enemy
              TST_COLL(E)
       next

    ; etc pp

end function


function TST_COLL(TST)

          ; Teste -TST -auf -Collision-Code
          ; zB TST\POSX...

end Function


Nun, so wie es oben steht funzt es natürlich nicht. Object und Handle werden zwar Blau eingefärbt, aber existieren wohl nicht in B+ Evil or Very Mad

Von Globals halte ich garnichts...

Hat da jemand eine Idee... ausser mich bei den entwicklern zu beschweren Wink






MfG

Jan_

Ehemaliger Admin

Betreff: Re: Function - Type als Parameter...

BeitragDi, Jul 25, 2006 15:27
Antworten mit Zitat
Benutzer-Profile anzeigen
verstehe deine frage nciht ganz.
Code: [AUSKLAPPEN]

Function CollitestALL()
         for S.Sprite = each Sprite
              TST_COLL( S)
         next

        For E.Enemy = each Enemy
              TST_COLL(E)
       next

    ; etc pp

end function


function TST_COLL(TST.enemy)

          ; Teste -TST -auf -Collision-Code
          TST\POSX = 1

end Function

; und nun nochmal ein return

function tst_neu.enemy()
 b.enemy=new enemy
 return b
end function


vielleicht war das was du suchtest.
between angels and insects

Rone

BeitragDi, Jul 25, 2006 15:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin,

Naja, entweder mit Object/Handle, oder du übergibst der function direct das Objek(glaube zumindest, dass das geht)

Also So:
Code: [AUSKLAPPEN]
Function CreateSprite(x1#,y1#)
   l.Sprite=New Sprite
   ...
   Return handle(l)
End Function

Function check(id)
  obj.Sprite=OBJECT.Sprite(id)
 ...
End Function


oder so:
Code: [AUSKLAPPEN]
Function CreateSprite.Sprite(x1#,y1#)
   l.Sprite=New Sprite
   ...
   Return l
End Function

Function check(s.Sprite)
   ...
End Function

mfg
Rone
 

BlitzBirne

BeitragDi, Jul 25, 2006 15:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für Eure Antworten Very Happy

Sorry, das ich nicht dabeischrieb was ich genau meinte...

Ich möchte 5 verschiedene Types über EINE Function auf Kollision Testen.
Diese Types wie Sprite, Tile etc sind bereits erstellt (mit new)
Wenn ich diese Function weglassen würde, müsste ich etwa sowas proggen (Pseudocode):
Code: [AUSKLAPPEN]

Function Test_Colli()
           For S. Sprite = each Sprite
                   ;Kompletten Collisionstest - Code
          next
           For T. Tile = each Tile
                   ;Kompletten Collisionstest - Code
          next

        ; usw
end Function


Da ich es aber über EINE Function machen möchte ist das hier der PSEUDO-Code:

Code: [AUSKLAPPEN]

Function CollitestALL()
         for S.Sprite = each Sprite
              TST_COLL( S)    ; <----- DA KLEMMTS !
         next

        For E.Enemy = each Enemy
              TST_COLL(E)
       next

    ; etc pp

end function


function TST_COLL(TST)   ; <---- HIER KLEMMTS !

          ; Teste -TST -auf -Collision-Code
          ; zB TST\POSX...         <---- HIER KLEMMTS ! TST nicht vorhanden...

end Function




Ich hoffe jetzt ist es eindeutiger, was ich meine Wink


Wenn es nötig ist, den Original Code zu zeigen, bitte bescheidgeben ( will nicht unnötig platz einnehmen)



MfG
 

Dreamora

BeitragDi, Jul 25, 2006 16:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Da wird auch der Originalcode nichts helfen. Das geht aus prinzip nicht. Dazu müsstest du BlitzMax besitzen, das Vererbung unterstützt.

In Blitz3D musst du für jeden Type eine eigene Funktion schreiben.
Deswegen am einfachsten einen neuen Type "TCollision" den du als Field bei allen types drin hast und dann nur den Testen.
TCollision enthält dabei die für die Kollision notwendigen Informationen
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

BlitzBirne

BeitragDi, Jul 25, 2006 16:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke, Drea Very Happy

Das ist natürlich auch eine Möglichkeit.

Nur Vererbung braucht man dafür doch nicht (für das was ich vorhabe), denn ich will ja nur DAS bestimmte Type übergeben, was ich auf Kollision testen möchte.

D.H:

Ich grase alle Sprites (ZB) ab, und Teste in einer Function, ob die Maus (bzw die virtuelle Position Laughing ) innerhalb eines Vierecks dieses Sprites ist (BoundingBox)

Naja. Ich probiers auf jeden Fall aus Smile



MfG
 

Dreamora

BeitragDi, Jul 25, 2006 16:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Nun das geht auch.
Aber dann musst du für jeden Type eine Funktion schreiben, weil du kannst über die gleiche Übergabe nicht verschiedene Types übergeben (dafür wäre dann Vererbung notwendig damit du als Übergabetype den "Grundtype" nehmen könntest).

Wenn du natürlich keine Kollision untereinander benötigst, sind 5 einzelne Kollisionsfunktionen kein Problem Smile

Aber ansonsten würde ich die Kollisionsdaten abstrahieren, so das du es mit einer einzigen Funktion machen kannst und die types unter einander auch kollidieren lassen kannst.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

BlitzBirne

BeitragDi, Jul 25, 2006 17:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Mir ist da grad ne unnütze Idee gekommen...

Wenn ich nur 1 Type erstelle, mit allen Daten von den anderen (die FIELDS)
den ich dann zb OBJ nenne, brächte ich ja nur 1 Type abgrasen....

ABER....

dann müsste ich auch ALLES durch den Wolf drehen....

D.H.:

Alles ob es nötig ist, oder nicht:

* in der Kollionstestschleife druchzählen lassen
* auf Bewegt oder nicht testen
* ob es ein Item ist... wenn ich dies aufsammeln will
* .... zuviel Laughing

Also ich denke das würde dann doch absolut keinen Sinn machen...

warum hat B+ dieses Feature bloss nicht... ich finds zum kotzen Rolling Eyes

Vielleicht sollte ich mich doch ernster mit C++ beschäftigen *schnief*
Was aber schade ist, denn B+ macht auch Spass... find ich...



MfG
 

Dreamora

BeitragDi, Jul 25, 2006 17:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Es geht auch problemlos mit BB
Aber man muss sich wie in C++ auch, erst gedanken darüber machen wie man es machen möchte und es erst dann machen ... sonst muss man es halt mehrfach schreiben. (ok das muss man meistens selbst dann noch weil man später eine erweiterung reinpacken will die beim besten willen nicht ohne veränderung der struktur möglich ist)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

BlitzBirne

BeitragDi, Jul 25, 2006 17:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Joar Smile

Nur in C++ hätt ich das Problem mit den Zeigern nicht... Shocked

Mit C++ brächte ich mir ja dann keine Notlösungen suchen Wink





MfG

BladeRunner

Moderator

BeitragDi, Jul 25, 2006 19:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Nun, denn schein C++ ja adäquat zu sein.
Aber mal im ernst: wenn Du nur die Koordinaten einer Bounding box übergeben willst mach für die Box nen eigenen Type (TColBox), pack die Koordinaten da hinein und mach diesen Type als field Deiner anderen Types.

zB.

Code: [AUSKLAPPEN]
Type Tsprite
   Field image
   Field Col.Tcolbox
End Type

Type TColbox
   Field x
   Field y
   Field w
   Field h
End Type

Function CreateSprite.Tsprite()
   a.tsprite = New tsprite
   a\col = New Tcolbox
   Return a
End Function


Function Collision(col.TColbox,x,y)
   If x >= col\x And x <= col\x + col\w Then
      If y >= col\y And y <= col\y + col\h Then
         Return 1 ;Kollision
      EndIf
   EndIf
   Return 0
End Function

SeedRnd MilliSecs()

a.Tsprite = CreateSprite()

Repeat
a\col\x = Rand (300)
a\col\y = Rand (300)
a\col\w = Rand (300)
a\col\h = Rand (300)
x = Rand (640)
y = Rand (480)

Print "x:"+x+" y:"+y+" ("+a\col\x+"|"+a\col\y+")-("+(a\col\x+a\col\w)+"|"+(a\col\y+a\col\h)+")"
If collision (a\col,x,y) Then Print "Kolli!!!!"
WaitKey()
Until KeyHit(1)
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
 

BlitzBirne

BeitragDi, Jul 25, 2006 21:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Ui. Shocked

Ich muss sagen, ein Interessanter Code Very Happy

Auf die Idee, ein Type in einem Field eines Types zu Packen, bin ich noch nicht gekommen Laughing

Da werd ich mir mal was mit brauen Cool



Danke an alle Exclamation





MfG
 

Dreamora

BeitragMi, Jul 26, 2006 0:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Dreamora hat Folgendes geschrieben:

Deswegen am einfachsten einen neuen Type "TCollision" den du als Field bei allen types drin hast und dann nur den Testen.
TCollision enthält dabei die für die Kollision notwendigen Informationen


Wäre vielleicht nützlich wenn du Tips liest ohne das du funktionieren Code bekommst den du Copy Pasten kannst ...
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

BlitzBirne

BeitragMi, Jul 26, 2006 11:01
Antworten mit Zitat
Benutzer-Profile anzeigen
UPS Embarassed
Zitat:

... bei allen types DRIN hast....



das DRIN hab ich wohl überlesen, sorry Shocked

Copy - Paste benutz ich grundsätzlich nicht. Ich finds nett wenn man das ANSCHAULICH zeigt, damit man auch zusammenhänge leichter versteht (für die Allgemeinheit)
Ich bin natürlich auch Absolut dagegen, seien eigenen Kopf nicht zu benutzen, indem man nichtmal nen Ansatz von selbstdenken zeigt - und alles stück für Stück vorgekaut bekommen will.




MfG

Neue Antwort erstellen


Übersicht BlitzBasic BlitzPlus

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group