Kollisionsangabe

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Lorne
Beiträge: 31
Registriert: 30.05.2008 15:45
Wohnort: Hohenlohe
Kontaktdaten:

Kollisionsangabe

Beitrag von Lorne »

Hallo,
wie kann ich, bei einem Spiel wie Snake, die Berührung angeben?
Weil wenn ich ja

Code: Alles auswählen

If 1X And 1Y = 2X And 2Y
 Punkte = Punkte +10
EndIf
mache dann müssen sich die Gegenstände ja genau treffen.
Wie geht das dass man auch wenn man streif es als getroffen zählt?
Also das ich die komplette Breite beider Grafiken nutzen kann.

Gruß Lorne
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Denk mal ein bißchen nach :)

Kleiner Tip: Die Breite läßt sich ja auch in Pixeln ausdrücken, also hast Du nicht nur die Positionen der linken oberen Ecke einer Grafik, sondern auch die der rechten oberen Ecke, der linken unteren Ecke und der rechten unteren Ecke ;)

Noch ein Tip: Hol Dir ein Blatt Papier und zeichne das einfach mal auf, und zeichne auch die Positionen mit einem kleinen X an... vielleicht hilft Dir das weiter.
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

Du musst auch die Breite und Höhe der Grafik wissen:

Vereinfacht angenommen die MittelPunkte der Grafik sind :
x und y und die Breite/Höhe Width und Height:

Code: Alles auswählen

If Abs(xGrafik2-xGrafik1) < WidthGrafik1/2+WidthGrafik2/2 And Abs(yGrafik2-yGrafik1) < HeightGrafik1/2+HeightGrafik2/2
  ;kollision
EndIf

Sry habe eben was geändert!
Zuletzt geändert von STARGÅTE am 03.06.2008 17:21, insgesamt 1-mal geändert.
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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

die formeln für die berechnung findest du auch hier:
http://www.purebasic.fr/german/viewtopic.php?t=9093
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Daß Du die halbe Breite als Width bezeichnest ist schon etwas arg. Dann schreib lieber Width / 2 hin, das ist um einiges verständlicher.
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

jo ok sehe ich hier im Anfängerbereich ein.
Aber da Width/2 zeitverschwendung ist (beim berechnen) kann man sich gleich am anfang Definieren das Width = 32 ist wenn das Bild 64 ist.
Und es dnan so angezeigt wird:
DisplaySprite(Sprite, x-Width, y-Height)

klar kann man dann auch am Anfang HalfWidth=Width/2 Definieren aber ...

naja

habs oben umbenannt
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
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Gilt nicht nur für den Anfänger-Bereich ;) sondern grade auch Profis sollten (Variablen)namen verwenden, die möglichst genau aussagen, was sie beinhalten ;) und in diesem Fall wäre es nicht nur ungenau, sondern sogar völlig falsch (bzw. irreführend).

In vielen Fällen wird man für die Width und Height wohl sowieso Konstanten benutzen, und ein /2 ist da keine Zeitverschwendung. Bei Variablen zwar schon, aber da ist der Unterschied sooooooo minimal (ein Bitshift nach rechts ist eine einzige (!) Operation), daß er a) nicht der Reder wert ist und man b) für sowas nicht die Lesbarkeit des Codes opfern sollte :)

HalfWidth usw. ist auch käsig irgendwie, also bei solchen Minimal-Kleinigkeiten darf bei mir ruhig 'ne vermeintlich überflüssige Berechnung drin sein ;)
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
Kaisky007
Beiträge: 83
Registriert: 25.05.2008 20:58

Beitrag von Kaisky007 »

löl, warum immer mit widht und height?

für anfänger ist es so verständlicher:

mal angenommen deins ist 30x30 Pixel groß, gehts so:

If 1X < 2X + 30 And 1X + 30 > 2X And 1Y < 2Y + 30 And 1Y + 30 > 2Y
einfach mit kleiner und größer zeichen, capitschke??
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Ja ist unter Umständen wirklich verständlicher, aber Width und Height benutzt man, weil man generell keine "magic numbers" benutzen sollte ;)

Und mit 1X wirst Du beim Kompilieren sicherlich auch ein paar Problemchen kriegen ;)

Also warum nicht so:

Code: Alles auswählen

If xPos1 > xPos2 - Width And xPos1 < xPos2 + Width
    If yPos1 > yPos2 - Height And yPos1 < yPos2 + Height
        ; Kollision
    EndIf
EndIf
Setzt aber voraus, daß Width und Height für beide Sprites gleich ist.
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
Lorne
Beiträge: 31
Registriert: 30.05.2008 15:45
Wohnort: Hohenlohe
Kontaktdaten:

Beitrag von Lorne »

Hallo,
danke schon einmal für die Hilfe.
Also ich habe das nun so gemmacht:

Code: Alles auswählen

If SpriteCollision(0,UFOX,UFOY,5,SteinX,SteinY) Or SpriteCollision(1,UFOX,UFOY,5,SteinX,SteinY) Or SpriteCollision(2,UFOX,UFOY,5,SteinX,SteinY) Or SpriteCollision(3,UFOX,UFOY,5,SteinX,SteinY)
 SteinX=Random(789)
 SteinY=Random(583)
 Punkte = Punkte +10
EndIf
Leider verschwindet der Stein zufrüh wenn ich nach rechts fliege und wenn ich nach links fliege muss ich mit dem Ufo darüber bis er verschwindet.
Ich habe das mit der Höhe und Breite nicht ganz verstanden, kann das daran liegen? Wenn ja, wie baue ich die dann in den Code ein?
Das Ufo ist 32x32 Pixel groß und der Stein 10x16 Pixel.
Antworten