Sachen einsammeln (es will nicht deleten )

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Dottakopf

Betreff: Sachen einsammeln (es will nicht deleten )

BeitragMi, Jan 03, 2007 20:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Guten Abend zusammen !

Also mein Problem besteht darin, dass mein player keine sachen einsammelt (in meinem fall ein baum Mesh). Die Bäume erstellen und das hineinsetzten in die Welt hab ich schon hinbekommen.

Ich vermute das Problem liegt in der Kollisionsabfrage mit einen der Bäume.

Ich stell hier mal meinen code rein : (im 2D hats so immer gefuntzt)
und ja ich habe vorher die Onlinehilfe aufgesucht ! Hab auch in der erweiterten Suche gestöbern. Leider nichts brauchbares gefunden.

naja wie gesagt hier der code :

Code: [AUSKLAPPEN]


Global info.rubin, type_rubin

;------------------------

;type
Type rubin
   Field rb_x
   Field rb_y
   Field rb_z
End Type

Restore rubin_lv
Read anzahl

For i = 1 To anzahl      
   info.rubin = New rubin   
   Read rb_x,rb_y,rb_z         
   info\rb_x = rb_x         
   info\rb_y = rb_y
   info\rb_z = rb_z
Next       


;rubine
For info.rubin = Each rubin
   
    baum = LoadMesh("pfad..\baum01.b3d")
    EntityType baum, type_rubin
    PositionEntity baum,info\rb_x,info\rb_y,info\rb_z

Next

; //// Hauptschleife \\\\

functionen

;------------------


;rubine einsammeln
  For info.rubin = Each rubin

    If EntityCollided(player,type_rubin) Then

         Delete info.rubin
    End If

  Next

End Function

;rubine malen
.rubin_lv
Data 3
Data 20,0,20
Data 25,0,20
Data 30,0,20


Für eure Hilfe danke ich schon einmal im vorraus !

NightPhoenix

BeitragMi, Jan 03, 2007 23:10
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn du info.rubin löschst ist dein typ gelöscht.... dein objekt was du aufsammeln willst ist aber unabhängig vom typ erstellt worden:
Code: [AUSKLAPPEN]
baum = LoadMesh("pfad..\baum01.b3d")


in dem type oben muss also mindestens noch stehen:
Code: [AUSKLAPPEN]
field baum


dann müsstet du zum erstellen schreiben:

Code: [AUSKLAPPEN]
info\baum = LoadMesh ....



danach machst du einfach folgendes:

Code: [AUSKLAPPEN]
HideEntity Info\baum
(wenn du es nicht löschen willst wie du bereits sagtest)

zum löschen freeentity benutzen


hoffe konnte helfen und hoffe wirklich ich hab dir das jetz richtig erklärt! Wink
mfg.

Dottakopf

BeitragDo, Jan 04, 2007 12:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke erstmal !!

hab das alles so gemacht wie du mir es erklärt hattes (und es war auch gut nachvollziehbar Surprised )
Doch Funzen tuts leider immer noch nicht. Sad

Also ich hab den Baum in die type s aufgenommen inetwa so:
Code: [AUSKLAPPEN]

Type rubin
   Field rb_x
   Field rb_y
   Field rb_z
   Field baum  ;baum nei

End Type

Restore rubin_lv
Read anzahl

For i = 1 To anzahl      
   info.rubin = New rubin   
   Read rb_x,rb_y,rb_z      
   info\rb_x = rb_x         
   info\rb_y = rb_y
   info\rb_z = rb_z

;kann es sein das hier noch der baum mit rein muss ?? :oops:

Next       



dan das ganze erstellet mit: info\baum = loadmesh(..)
(entitytype = type_rubin)

So und etza beim "löschen" hab ich es zuerst so gemacht:


Code: [AUSKLAPPEN]

 For info.rubin = Each rubin

    If EntityCollided(player,type_rubin) Then ;ist da die coll falsch ????

        FreeEntity info\baum

    End If

  Next


aber da tut sich nix. Dann hab ich mal statt "freeentity info\baum " einfach nur "end" eingegeben. So wollte ich überprüfen ob über haupt ne Kollision stattfindet. ----> nix passierte.

Ich mach bestimmt irgendwo n blöden Noobi fehler und ich find ihn ned Embarassed

Vielleicht weist du ja n gutes 3D tut wo genau sowas behandelt wird? Wäre echt cool !
  • Zuletzt bearbeitet von Dottakopf am Do, Jan 04, 2007 13:07, insgesamt einmal bearbeitet

Dottakopf

BeitragDo, Jan 04, 2007 12:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke erstmal !!

hab das alles so gemacht wie du mir es erklärt hattes (und es war auch gut nachvollziehbar Surprised )

hab in die type s den baum auf genommen inetwa so:
Code: [AUSKLAPPEN]

Type rubin
   Field rb_x
   Field rb_y
   Field rb_z
   Field baum  ;baum nei

End Type

Restore rubin_lv
Read anzahl

For i = 1 To anzahl      
   info.rubin = New rubin   
   Read rb_x,rb_y,rb_z      
   info\rb_x = rb_x         
   info\rb_y = rb_y
   info\rb_z = rb_z

;kann es sein das hier noch der baum mit rein muss ?? :oops:

Next       



dan das ganze erstellet mit: info\baum = loadmesh(..)
(entitytype = type_rubin)

So und etza beim "löschen" hab ich es zuerst so gemacht:


Code: [AUSKLAPPEN]

 For info.rubin = Each rubin

    If EntityCollided(player,type_rubin) Then ;ist da die coll falsch ????

        FreeEntity info\baum

    End If

  Next


aber da tut sich nix. Dann hab ich mal statt "freeentity info\baum " einfach nur "end" eingegeben. So wollte ich überprüfen ob über haupt ne Kollision stattfindet. ----> nix passierte.

Ich mach bestimmt irgendwo n blöden Noobi fehler und ich find ihn ned Embarassed

Vielleicht weist du ja n gutes 3D tut wo genau sowas behandelt wird? Wäre echt cool !

Goldini

BeitragDo, Jan 04, 2007 13:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Probier den Code: [AUSKLAPPEN]

Global info.rubin, type_rubin

;------------------------

;type
Type rubin
   Field rb_x
   Field rb_y
   Field rb_z
End Type

Restore rubin_lv
Read anzahl

const type_rubin=1,Player=2
collisions Player,type_rubin,2,3

For i = 1 To anzahl       
   info.rubin = New rubin   
   Read rb_x,rb_y,rb_z         
   info\rb_x = rb_x         
   info\rb_y = rb_y
   info\rb_z = rb_z
Next       

cam=createcamera()
entitytype cam,Player
entityradius cam,5


;rubine
For info.rubin = Each rubin
   
    baum = LoadMesh("pfad..\baum01.b3d")
    EntityType baum, type_rubin
    PositionEntity baum,info\rb_x,info\rb_y,info\rb_z

Next

; //// Hauptschleife \\\\

functionen

;------------------


;rubine einsammeln
  For info.rubin = Each rubin

    If EntityCollided(player,type_rubin) Then

         Delete info.rubin
    End If

  Next

End Function

;rubine malen
.rubin_lv
Data 3
Data 20,0,20
Data 25,0,20
Data 30,0,20


Mfg Very Happy
Mit diesen Zeilen danke ich einer Person, die mich für so wichtig hält, dass sie sogar einen Club nach mir benannt hat!
Danke! Very Happy

Dottakopf

BeitragDo, Jan 04, 2007 13:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Goldini !

Hab mir deinen Code mal genau angeguckt und etz funzt des mit dem einsammeln.

musste eine collisonsabfrage schreiben:
(collisons type_player,type_rubin,2,2)

und ich hatte vergessen einen der types (type_rubin) einen wert zuzuweisen! ^^ (damit die kollision klappt)

So aber irgendetwas hab ich dan doch falsch gemacht ! Denn seitdem ich das geändert habe stimmt die Positionnierung der Bäume nicht mehr !
Aber warum ??? Laut meinem "mapdata" müssten sie eine schöne linie im abstand von 5 bilden. doch die machen da was sie wollen ^^
Auch sammel ich alle bäume auf einmal ein dabei will ich ja baum für baum einsammeln.

Puh (schweis abwisch)
Hoffentlich konnte ich euch mein Problem verständlich machen.
Bitte schaut euch des mal kurz an. Irgendwo is der wurm drin.
thx schon mal für eure Mühe!


Code: [AUSKLAPPEN]


;bäume\rubine malen

.rubin_lv
Data 3
Data 20,0,20
Data 25,0,20
Data 30,0,20


Irgendwas mache ich hier ganzschön falsch :
So siehts momentan bei mir aus.


Code: [AUSKLAPPEN]


Global info.rubin, type_rubin = 1
Global baum,rubin
;------------------------


;type
Type rubin
   Field rb_x
   Field rb_y
   Field rb_z
   Field baum

End Type

Restore rubin_lv
Read anzahl

For i = 1 To anzahl      
   info.rubin = New rubin   
   Read rb_x,rb_y,rb_z      
   info\rb_x = rb_x         
   info\rb_y = rb_y
   info\rb_z = rb_z

Next       


;rubine erstellen

For info.rubin = Each rubin
   
    info\baum = LoadMesh("pfad..\3D\gfx\baum01.b3d")
    EntityType info\baum,type_rubin
    PositionEntity info\baum,info\rb_x,info\rb_y,info\rb_z

Next






Dann weiter unten kommt dan meine "Collisions - Funktion" da habe ich auch die Anweisung zum "einsammeln " reingetan.


Code: [AUSKLAPPEN]


Function collision()

Collisions type_player,type_scene,2,2  ;collis Zwischen player u. Terrain
Collisions type_player,type_rubin,2,2   ;collis zwischen player u. dem Baum

;rubine einsammeln

  For info.rubin = Each rubin

    If EntityCollided(player,type_rubin) Then

        FreeEntity info\baum  ;baum löschen

    End If

  Next

End Function

Goldini

BeitragDo, Jan 04, 2007 15:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Also was ist dein Problem im Klartext?

Mfg
Mit diesen Zeilen danke ich einer Person, die mich für so wichtig hält, dass sie sogar einen Club nach mir benannt hat!
Danke! Very Happy

Dottakopf

BeitragDo, Jan 04, 2007 18:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Dache mir schon das das kommt ^^

Sry is vielleicht n bisschen dumm erklärt gewesen.

Die Situation :

momentan sieht so aus , dass ich mit meinem player(mario) über ein terrain (n einfaches plane) laufe. Als deko habe ich ne kleine Rampe (aus milkshape) und 3 Bäume die ich mit "mapdata" also for i = x bäume ... in die welt gesetzt habe.

Ziel des ganzen ist es bäume einzusammeln (die bei mir verwirrenderweise auch rubine gennant werden) Surprised Das klappt auch schon fast so wie ich mir das vorstelle.

Das Problem :

1.
Seitdem des mit dem einsammeln klappt, stimmt die Positionierung der Bäume nicht mehr. Sie müssten eigentlich in regelmäßigen abständen in einer geraden linie stehen -- > was sie aber nicht tun.

2.
Und statt baum für baum einzusammeln, sammelt(löscht) er gleich alle bäume. Das liegt glaube ich daran, dass er den type löscht und nicht das jeweilige Objekt welches man berührt.

Die Frage:

Warum passiert das ? und wie kann ich das richten ?
Konnte leider kein gutes tut zu diesem Thema finden! wenn einer eins wüsste, dann wäre das echt cool wenn er hier den link mal posten könnte

mfg Dottakopf

Goldini

BeitragDo, Jan 04, 2007 19:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Tja das Problem das er alle löscht hab ich auch in "The Mystery World"
sry kann dir nicht helfen Embarassed

Mfg
Mit diesen Zeilen danke ich einer Person, die mich für so wichtig hält, dass sie sogar einen Club nach mir benannt hat!
Danke! Very Happy

5k41

BeitragDo, Jan 04, 2007 20:05
Antworten mit Zitat
Benutzer-Profile anzeigen
das problm ist, das alle "rubine" ja den type_rubin benutzen, heißt bei einer Kollision mit einem baum der den Type_rubin benutzt ( egal welcher ) ist die If abfrage = True und damit wird der type gelöscht. ich würde als lösung kollision zwischen info\baum und type_player prüfen!

MfG
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

Dottakopf

BeitragDo, Jan 04, 2007 21:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja daran dachte ich auch erst. Doch bb spuckt dan die Fehlermeldung "entity does not exist " aus. Sad

Zur veranschaulichung :

Code: [AUSKLAPPEN]

Function collision()

Collisions type_player,type_scene,2,2
Collisions type_player,type_rubin,2,2

;rubine einsammeln

  For info.rubin = Each rubin

    If EntityCollided(info\baum,type_player) Then

      FreeEntity  info\baum

    End If

  Next

End Function


Ich hock mich eza nochmal hin und schreib etz mal n extra progi (aus cube und spheren) vielleicht komm ich ja noch druff. Kann ja ned so schwer sein des noch zum laufen zu bringen Cool
 

bruce85

BeitragDo, Jan 04, 2007 22:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Abend Very Happy

löschen tust du das so:

Code: [AUSKLAPPEN]
Delete  info.rubin


und nicht so:

Code: [AUSKLAPPEN]
FreeEntity  info\baum


MfG Andreas
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250

Goldini

BeitragFr, Jan 05, 2007 11:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin

kann mir das bitte noch jemand das einmal von ganz vorn erklären?
also das mit dem kolidieren.
Mit diesen Zeilen danke ich einer Person, die mich für so wichtig hält, dass sie sogar einen Club nach mir benannt hat!
Danke! Very Happy

5k41

BeitragFr, Jan 05, 2007 12:48
Antworten mit Zitat
Benutzer-Profile anzeigen
also, der type_rubin in dem Fall wird ja von allen "rubinen" benutzt, heißt wenn man auf kollision von player und type_rubin prüft, prüft man nur, ob eine kollision zwischen dem player und irgendeinem objekt vom type_rubin besteht, dass ist solange richtig, bis das objekt mit dem man wirklich kollidiert gelöscht wird, heißt auch solange werden alle rubine, die vorher in der For - Each schleife kommen gelöscht. Desshalb muss man auf kollision zwischen info\baum und type_player testen, da info\baum genau der eine Baum ist und type_player ja auch nur der eine player, da es ja mehr nicht gibt Wink.
Warum das nicht funktioniert, kann ich ohne kompletten Code so nicht sagen!

MfG

~edit~
und bruce hat recht, du musst es so löscen:
Code: [AUSKLAPPEN]

freeentity info\baum ; mesh löschen, da es sonst im speicher bleibt
delete info.rubin       ; type löschen
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

Dottakopf

BeitragFr, Jan 05, 2007 14:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke etz hab ich das Problem gut verstanden !

Ok ich hab mal n extra progi geschreiben wo genau das gleiche Problem drin ist. Es besteht nur aus Spheren und einem cube(als boden). So kann jeder, wenn er lust hat, sich das ganze via strg c und strg v in bb einfügen und schauen was passiert.

Bitte lasst euch von dem code nicht abschrecken ! es schaut schlimmer aus als es ist ^^.

Dieser code erstellt einen player, nen Boden , und drei Kugeln zum einsammeln. Mit Pfeiltasten kann man den Player steuern.

Hoffe ihr könnt den "Wurm" in meinem code entdecken und danke auch schoneinmal im vorraus!


Code: [AUSKLAPPEN]


Graphics3D 800,600,16
SetBuffer BackBuffer()

;global var


Global info.baum
Global tree


;-----------------------


;des type zeug

Type baum
    Field b_x
    Field b_y
    Field b_z
    Field tree       ;muss man den baum hier mit aufnehmen ?
End Type                                                   


Restore baum_pos
Read anzahl

For i = 1 To anzahl
     
     info.baum = New baum
     Read b_x , b_y , b_z
     info\b_x = b_x
     info\b_y = b_y
     info\b_z = b_z
                     
Next

;---------------------------



;bäume erstellen

For info.baum = Each baum

 tree = CreateSphere()
        EntityType tree,type_baum
        PositionEntity tree, info\b_x , info\b_y , info\b_z

Next


;--------------------------

;sachen erstellen / camera / boden / SPIELER

Global cam = CreateCamera()
       MoveEntity cam,0,10,-10


Global boden = CreatePlane()
       EntityColor boden,0,55,0
       EntityType boden, type_boden


Global player = CreateSphere()
       EntityColor player,255,0,255
       EntityType player, type_player
       PositionEntity player,0,1,0




;schleife----------------------

While Not KeyHit(1)

move_player()
move_cam
einsammeln()

UpdateWorld
RenderWorld
Flip

Wend
End

;-------------------------------



Function move_player()

If KeyDown(200) Then MoveEntity player, 0,0, 0.1
If KeyDown(208) Then MoveEntity player, 0,0,-0.1

If KeyDown(203) Then TurnEntity player, 0, 2,0
If KeyDown(205) Then TurnEntity player, 0,-2,0


End Function

;----------------------------

Function move_cam()

PointEntity cam,player,0     ;schicke cam einstellung ... :)

End Function

;----------------------------

Function einsammeln()

If EntityCollided(tree,type_player) Then  ;wie geraten lasse ich baum mit type_player kolli..

FreeEntity tree     ;dann das erstelle löschen ohne den type_baum zu killn

End If       ;rein theoretisch müsste das doch funzen ! aber warum nicht ? :(



End Function

;---------------------------


;die bäume Positionieren
.baum_pos

Data 3
Data 10,1,10
Data 15,1,10
Data 20,1,10


mfg Dottakopf
  • Zuletzt bearbeitet von Dottakopf am Fr, Jan 05, 2007 14:36, insgesamt einmal bearbeitet

5k41

BeitragFr, Jan 05, 2007 14:36
Antworten mit Zitat
Benutzer-Profile anzeigen
da waren aber einige fehler drin!
Code: [AUSKLAPPEN]
Graphics3D 800,600,16
SetBuffer BackBuffer()

;constanten

Const TYPE_PLAYER=1,TYPE_BODEN=2,TYPE_BAUM=3

;-----------------------


;des type zeug

Type baum
    Field b_x
    Field b_y
    Field b_z
    Field tree
End Type                                                   


Restore baum_pos
Read    anzahl

For i = 1 To anzahl
     
     info.baum = New baum
     Read b_x , b_y , b_z
     info\b_x = b_x
     info\b_y = b_y
     info\b_z = b_z
                     
Next

;---------------------------



;bäume erstellen

For info.baum = Each baum

 info\tree  =   CreateSphere()
 EntityType     info\tree,TYPE_BAUM
 PositionEntity info\tree, info\b_x , info\b_y , info\b_z

Next


;--------------------------

;sachen erstellen / camera / boden / SPIELER

Global       cam = CreateCamera()
MoveEntity cam,0,10,-10


Global       boden = CreatePlane()
EntityColor boden,0,55,0
EntityType    boden, TYPE_BODEN


Global          player = CreateSphere()
EntityColor       player,255,0,255
EntityType       player, TYPE_PLAYER
PositionEntity    player,0,1,0


Collisions TYPE_PLAYER,TYPE_BAUM,1,2
Collisions TYPE_PLAYER,TYPE_BODEN,1,2

;schleife----------------------

While Not KeyHit(1)

move_player()
move_cam
einsammeln()

UpdateWorld
RenderWorld
Flip
cls

Wend
End

;-------------------------------



Function move_player()

   If KeyDown(200) Then MoveEntity player, 0,0, 0.1
   If KeyDown(208) Then MoveEntity player, 0,0,-0.1
   
   If KeyDown(203) Then TurnEntity player, 0, 2,0
   If KeyDown(205) Then TurnEntity player, 0,-2,0


End Function

;----------------------------

Function move_cam()

   PointEntity cam,player,0     ;schicke cam einstellung ... :)

End Function

;----------------------------

Function einsammeln()

   For info.baum = Each baum
   
      If EntityCollided(info\tree,type_player) Then  ;wie geraten lasse ich baum mit type_player kolli..
      
         FreeEntity info\tree     ;dann das erstelle löschen ohne den type_baum zu killn
         Delete     info.baum
      
      End If       ;rein theoretisch müsste das doch funzen ! aber warum nicht ? :(
   
   Next

End Function

;---------------------------


;die bäume Positionieren
.baum_pos

Data 3
Data 10,1,10
Data 15,1,10
Data 20,1,10

solltest dich echt nochmal mit Types etc. auseinander setzen!

MfG
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

Dottakopf

BeitragFr, Jan 05, 2007 14:43
Antworten mit Zitat
Benutzer-Profile anzeigen
WoW danke ! Du hast grad nen neuen Fan gewonnen Laughing !

Du hast recht mit types sollte ich mich nochmal auseinander setzten !
Kannte aber bisher auch nur die 2D type (delete usw. dingens) und da wars irgendie leichter.

Naja erstmal ein rießen danke !

ich setz mich gleich mal hin und studire den code.

mfg Dottakopf

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group