Seite 1 von 2

Ich check nicht wie ich Element Kollision mache. [Gelöst]

Verfasst: 01.06.2008 14:22
von Kaisky007
Hallo!
Ich hab da ma ne frage:
Wie kann ich machen das der Gegner, den ich abgeschossen habe verschwindet?
Bisher habe ich es nur so hinbekommen, das der aller neuste Gegner abgeschossen werden kann. Wenn ein weiterer kommt kann der nicht mehr abgeschossen werden?
Ps: sagt nicht "du bistt total dämlich, das is doch ganz leicht"
Ich kann eben noch nicht so viel. Die Beispiele haben mir auch nicht geholfen, da steige ich nicht durch.

Code: Alles auswählen

InitSprite()

InitKeyboard()

OpenScreen(800,600,32,"Vollbild")

Structure Schuss 
  SchussX.f
  SchussY.f 
EndStructure

Structure Ufo1
  Ufo1X.f
  Ufo1Y.f
EndStructure

Global NewList Schuss.Schuss()

Global NewList Ufo1.Ufo1()

LoadSprite(1,"F:\Kai´s Spiel\Pics\Shuttle32x32.bmp",0)
LoadSprite(2,"F:\Kai´s Spiel\Pics\Schuss8x16.bmp",0)
LoadSprite(3,"F:\Kai´s Spiel\Pics\Ufo1.bmp",0)

IchX = 384
IchY = 550

SW = 0

Pause = 0

SWA = 0
SWB = 0
SWC = 1

Weapen = 2

UK = 0

Repeat

UK + 1

Pause + 1

ClearScreen(0+256*0+256*256*0)

ExamineKeyboard()

If Weapen = 1
  SWA = 0
EndIf

If Weapen = 2
  If KeyboardPushed(#PB_Key_Space)
    If SWA > 20
      SWA = 20
    EndIf
    If SWA < - 20
      SWA = 20
    EndIf
    SWA + SWB
    If SWA > 0
      SWB - 1
    EndIf
    If SWA < 1
      SWB + 1
    EndIf
  Else
    SWB = -5
  EndIf
EndIf

If Weapen = 3
  If KeyboardPushed(#PB_Key_Space)
    SWA + 15
    If SWA > 15
      SWA = -15
    EndIf
  EndIf
EndIf

If Weapen = 4
  If KeyboardPushed(#PB_Key_Space)
    If SWC = 1
      SWB = 5
      SWC = 0
    EndIf
    SWA + SWB
    If SWA > 25
      SWB = -5
    EndIf
    If SWA < -25
      SWB = 5
    EndIf
  EndIf
EndIf

If KeyboardPushed(#PB_Key_Left)
  If IchX > 0
    IchX - 5
  EndIf
EndIf

If KeyboardPushed(#PB_Key_Right)
  If IchX < 768
    IchX + 5
  EndIf
EndIf

If KeyboardPushed(#PB_Key_Space) And Pause > -1
  Pause = 0 
  AddElement(Schuss()) 
  Schuss()\SchussX = IchX + 12 + SWA
  Schuss()\SchussY = IchY 
EndIf

If UK > 3
  UK = 0
  AddElement(Ufo1())
  Ufo1()\Ufo1X = Random(816) - 16
  Ufo1()\Ufo1Y = -16
EndIf

lcount.l = CountList(Schuss())

Ufo1Z.l = CountList(Ufo1())

DisplayTransparentSprite(1,IchX,IchY)

If lcount > 0
  For n = 0 To lcount  - 1
  SelectElement(Schuss(), n)      
If Schuss()\SchussX + 8 > Ufo1()\Ufo1X And Schuss()\SchussX < Ufo1()\Ufo1X + 16 And Schuss()\SchussY + 16 > Ufo1()\Ufo1Y And Schuss()\SchussY < Ufo1()\Ufo1Y + 16
  DeleteElement(Schuss(),1)
  DeleteElement(Ufo1(),1)
EndIf
  Schuss()\SchussY - 16
  DisplayTransparentSprite(2,Schuss()\SchussX ,Schuss()\SchussY)
Next
  FirstElement(Schuss())
  For n = 0 To lcount - 1
  If Schuss()\SchussY < -1
    DeleteElement(Schuss(),1)
  EndIf
  NextElement(Schuss()) 
Next
EndIf

If Ufo1Z > 0
  For n1 = 0 To Ufo1Z  - 1
  SelectElement(Ufo1(), n1)
    Ufo1()\Ufo1Y + 1
  If Ufo1()\Ufo1Y > 600
    DeleteElement(Ufo1(),1)
  EndIf
  DisplayTransparentSprite(3,Ufo1()\Ufo1X ,Ufo1()\Ufo1Y)
Next
  FirstElement(Ufo1())
  For n1 = 0 To Ufo1Z - 1
  NextElement(Ufo1()) 
Next
EndIf

FlipBuffers()

If KeyboardPushed(#PB_Key_Escape)
  End
EndIf

ForEver

Verfasst: 01.06.2008 14:27
von gnasen

Code: Alles auswählen

If lcount > 0 
  For n = 0 To lcount  - 1 
  SelectElement(Schuss(), n)      
If Schuss()\SchussX + 8 > Ufo1()\Ufo1X And Schuss()\SchussX < Ufo1()\Ufo1X + 16 And Schuss()\SchussY + 16 > Ufo1()\Ufo1Y And Schuss()\SchussY < Ufo1()\Ufo1Y + 16 
  DeleteElement(Schuss(),1) 
  DeleteElement(Ufo1(),1) 
EndIf 
  Schuss()\SchussY - 16 
  DisplayTransparentSprite(2,Schuss()\SchussX ,Schuss()\SchussY) 
Next 
  FirstElement(Schuss()) 
  For n = 0 To lcount - 1 
  If Schuss()\SchussY < -1 
    DeleteElement(Schuss(),1) 
  EndIf 
  NextElement(Schuss()) 
Next 
EndIf
Ich habs mir nicht wirklich angeschaut, aber scheinbar fehlt da eine Abfrage:

Du Fragst:
Jeder Schuss -> Bin ich aufm Ziel?
Die Antwort -> Du bist (nicht) auf dem letzten hinzugefügten Ufo

Warum?
Du prüfst für alle Schüsse, ob sie auf einem Ufo sind. Du musst allerdings alle Ufos prüfen, da die Ufo Liste auf dem letzten Element "steht" und auch nur dieses prüft:

Code: Alles auswählen

Foreach Schuss()
  Foreach Ufo()
  
  ;prüfen

  next
next

Verfasst: 01.06.2008 14:40
von Kaisky007
Das klingt ja ganz gut =)

nur habe ich keine ahnung wo das foreach hinkommt, und wo das andere hinkommt...
wär nett wenn du es mir sagst :allright:

Verfasst: 01.06.2008 15:45
von Kaisky007
Habs jetzt hinbewkommen, aber leider Spinnt der nen bischen.
1. Die Wellen Linie ist verschwunden, stattdessen bewegen sich alle schüsse gleichzeitig nach links und rechts.
2. Ein GrafikFehler denke ich, denn wenn ich irgendwo hinschieße kommt woanders wieder der schuss, aber nur blass, und irgendie durcheinander...
habe ich vielleicht doch etwas falsch gemacht?

Code: Alles auswählen

If lcount > 0
  For n = 0 To lcount  - 1
  SelectElement(Schuss(), n)
  ForEach Schuss() 
    ForEach Ufo1()
      If Schuss()\SchussX + 8 > Ufo1()\Ufo1X And Schuss()\SchussX < Ufo1()\Ufo1X + 16 And Schuss()\SchussY + 16 > Ufo1()\Ufo1Y And Schuss()\SchussY < Ufo1()\Ufo1Y + 16
        DeleteElement(Schuss(),1)
        DeleteElement(Ufo1(),1)
      EndIf
    Next
  Next
  Schuss()\SchussY - 16
  DisplayTransparentSprite(2,Schuss()\SchussX ,Schuss()\SchussY)
Next
  FirstElement(Schuss())
  For n = 0 To lcount - 1
  If Schuss()\SchussY < -1
    DeleteElement(Schuss(),1)
  EndIf
  NextElement(Schuss()) 
Next
EndIf

Verfasst: 01.06.2008 16:22
von gnasen
Du wirst es wahrscheinlich nicht hören wollen, aber DU musst das selbst verstehen. Du öffnest Threads ohne Ende und stellst zu allen Kleinigkeiten Fragen.
Klar kann man nicht alles wissen, jeder fängt mal klein an. Oder hat einfach mal ein Brett vor dem Kopf, ist ja alles OK.

Deswegen mein Tipp, wie ich sowas mache:
Nimm dir ein Blatt Papier und einen Stift. Mal dir eine mögliche Situation auf. Meinetwegen mit einem Schuss und einem Ufo und löst das Problem. Jetzt malst du einen weiteren Schuss hinzu und löst das Problem. Nun ein weiteres Ufo und löst das Problem.
Jetzt wird dir etwas auffallen, es gibt schon 4 Mögliche Kollisionen:
Schuss 1 <-> Ufo 1
Schuss 1 <-> Ufo 2
Schuss 2 <-> Ufo 1
Schuss 2 <-> Ufo 2
Nun überlegst du, wie man das auf einen Code für X Ufos und Y Schüsse reduzieren kann.

Verfasst: 01.06.2008 16:48
von Kaisky007
brauche ich dazu einen bestimmten befehl? wenn ja, komme ich nie drauf.
wenns nur variablen rechnung ist, is es ziemlich kompliziert...

Vielleicht muss ich nur die ufos abfragen, wo auch ein schuss ist.das heißt wenn man links ist und schießt, werden die rechten ufos nicht abgefragt

Verfasst: 01.06.2008 16:51
von STARGÅTE
Was er damit sagen will ist. Du hast mal wieder einfach nur blind irgend ein Code in deinen reinkopiert ohne dir gedanken zu machen was dort überhaupt passiert.

Du hast die Kollisionsschleifen einfach in deine bereits vorhandene Schussschleife eingefügt, was dazu führte das du für jeden Schuss noch mal jeden Schuss durchgegangen bist, was totaler quark ist.

Mit dem Aufmalen der Situation... sowas nennt man auch Struktogramm.

Aufgeräumt und korregiert.

Code: Alles auswählen

If lcount > 0 
 
 ForEach Schuss() 
    ForEach Ufo1() 
      If Schuss()\SchussX + 8 > Ufo1()\Ufo1X And Schuss()\SchussX < Ufo1()\Ufo1X + 16 And Schuss()\SchussY + 16 > Ufo1()\Ufo1Y And Schuss()\SchussY < Ufo1()\Ufo1Y + 16 
        DeleteElement(Schuss(),1) 
        DeleteElement(Ufo1(),1) 
      EndIf 
    Next 
    Schuss()\SchussY - 16 
    DisplayTransparentSprite(2,Schuss()\SchussX ,Schuss()\SchussY) 
  Next 

  ForEach Schuss() 
    If Schuss()\SchussY < -1 
      DeleteElement(Schuss(),1) 
    EndIf 
  Next 

EndIf

Verfasst: 01.06.2008 17:03
von Kaisky007
Thx, klappt, bis auf eins: nach ner weile stürzt das Programm ab wenn ich einen getroffen habe. Und dann is im text die zeile rot, die dazu da ist, das die ufos sich bewegen

Code: Alles auswählen

If Ufo1Z > 0
  For n1 = 0 To Ufo1Z  - 1
  SelectElement(Ufo1(), n1)
    Ufo1()\Ufo1Y + 1 <<<<<<<<<-------Das ist falsch sagt er
  If Ufo1()\Ufo1Y > 600
    DeleteElement(Ufo1(),1)
  EndIf
  DisplayTransparentSprite(3,Ufo1()\Ufo1X ,Ufo1()\Ufo1Y)
Next
  FirstElement(Ufo1())
  For n1 = 0 To Ufo1Z - 1
  NextElement(Ufo1()) 
Next
EndIf
Das mit den Code kopieren, das stimmt, aber ich lese mir das schon ständig durch, probiere zu verstehen, aber versteh nicht.
Ich bin nur 12 jahre alt, habe große vorbilder und probiere das täglich 6 stunden lang zu erreichen, aber ich weiß nicht wie ich mir helfen kann.
Das problem ist jetzt das ich manche grund befehle nicht verstehe, addelement habe ich jetzt schon halbwegs drauf, aber z.B. das mit den zählen, oder der befehl foreach oder for to verstehe ich nicht. Egal ob es im hilfeordner, in tutorials oder hier ist. Das war schon immer so, trotdem helfen mir beispiele am besten weiter und wenn ich es dann auf dem bildschirm habe, alles ist richtig, und ich es mir genau anschau, verstehe ich es manchmal, manchmal nicht.
Wohnt ganz rein zufällig jemand in der nähe von hanover?
Ich habe mir schon immer untericht gewünscht. Kenne aber niemanden der das macht.

Verfasst: 01.06.2008 17:25
von gnasen
Wenn du TS hast, könnte ich dir den einfachen Umgang mit Listen durchaus erklären. Das alles zu tippen würde mich Wahnsinnig machen :D

Verfasst: 01.06.2008 17:26
von STARGÅTE
Ich erklär das mal:

Du gehst in eine Schleife rein, und hast VORHER ermittelt wie viele elemente die Liste enthält, zB 3.
das heißt deine Schleife läuft von 0 bis 2

Nun kommt es zum Fall das ein Element gelöscht wird, das heißt alle nachfolgenden Elemente rutsch eins vor.
zB das Element an Position 1 wird gelöscht, also rutsch das Element auf Position 2 auf 1.

Nun geht die schleife aber trotzdem bis zu 2, wo aber gar keins mehr ist => ERROR

Abhilfe:
Lass dieses For To in verbindung mit LinkedListen immer weg ! Nimm lieber Foreach:
Und mach auf dem DeleteElement(Ufo1(), 1) lieber ein einfaches DeleteElement(Ufo1()) und danach ein Continue, das heißt, beim Löschen eines Elementes setzt er die Schleife Fort, ohne den Code danach auszuführen, sost würdest du dort auch n Fehler früher oder später bekommen.

Code: Alles auswählen

  ForEach Ufo1()
    Ufo1()\Ufo1Y + 1
    If Ufo1()\Ufo1Y > 600 
      DeleteElement(Ufo1()) 
      Continue
    EndIf 
    DisplayTransparentSprite(3,Ufo1()\Ufo1X ,Ufo1()\Ufo1Y) 
  Next