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

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Kaisky007
Beiträge: 83
Registriert: 25.05.2008 20:58

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

Beitrag 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
Zuletzt geändert von Kaisky007 am 03.06.2008 15:53, insgesamt 1-mal geändert.
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag 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
Benutzeravatar
Kaisky007
Beiträge: 83
Registriert: 25.05.2008 20:58

Beitrag 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:
Benutzeravatar
Kaisky007
Beiträge: 83
Registriert: 25.05.2008 20:58

Beitrag 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
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag 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.
Benutzeravatar
Kaisky007
Beiträge: 83
Registriert: 25.05.2008 20:58

Beitrag 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
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Kaisky007
Beiträge: 83
Registriert: 25.05.2008 20:58

Beitrag 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.
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag 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
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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 
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten