0Collision, mit Grafik von Type-variablen als Standort

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

pokop

Betreff: 0Collision, mit Grafik von Type-variablen als Standort

BeitragMo, Jun 13, 2005 15:22
Antworten mit Zitat
Benutzer-Profile anzeigen
So, gleich mal ne doofe überschirft^^

Also mein Problem:
Ich will jetzt bei meinem Code machen, das wenn ein "Wartank" auf einem anderen fährt, das der dann Schaden nimmt, was sich mit diesen Typen schwer machen lässt, weil sie ja alle gleich heißen(oder so)

BlitzBasic: [AUSKLAPPEN]
Graphics 800,600,16,2

Global tank1 = CreateImage(32,32)
Global tank2 = CreateImage(32,32)
Global mouse = CreateImage(16,16)
Global angew = CreateImage(32,32)

SetBuffer ImageBuffer(tank1)
Color 0,0,255
Rect 0,0,32,32
Color 255,255,0
Rect 14,0,4,4

SetBuffer ImageBuffer(tank2)
Color 255,0,0
Rect 0,0,32,32
Color 255,255,0
Rect 14,0,4,4

SetBuffer ImageBuffer(mouse)
Color 255,255,255
Line 0,0,16,8
Line 0,0,8,16
Line 15,8,8,15

SetBuffer ImageBuffer(angew)
Color 255,255,0
Plot 0,0
Plot 0,1
Plot 0,2
Plot 1,0
Plot 1,1
Plot 2,0

Plot 31,0
Plot 31,1
Plot 31,2
Plot 30,0
Plot 30,1
Plot 29,0

Plot 0,31
Plot 0,30
Plot 0,29
Plot 1,31
Plot 1,30
Plot 2,31

Plot 31,31
Plot 31,30
Plot 31,29
Plot 30,31
Plot 30,30
Plot 29,31


SetBuffer BackBuffer()



Type tank
Field x
Field y
Field side
Field energy
Field zielx
Field ziely
Field attack
Field agw
Field shot
Field go
Field updown
Field rightleft
End Type

Global j = 0

For i = 0 To 10

wartank.tank = New tank

wartank\x = Rnd(0,24) * 32
wartank\y = Rnd(0,17) * 32
wartank\zielx = wartank\x
wartank\ziely = wartank\y
wartank\go = 0
wartank\side = 0
wartank\agw = 0
wartank\energy = 32

j = j + 1

Next


HidePointer

Repeat

wartank.tank = First tank

For i = 0 To j - 2


Text 0,i*10,wartank\agw

If MouseDown(1) Then
If ImagesOverlap(mouse,MouseX(),MouseY(),tank1,wartank\x,wartank\y) Then wartank\agw = 1
EndIf

If Not ImagesOverlap(mouse,MouseX(),MouseY(),tank1,wartank\x,wartank\y) Then
If MouseDown(1) Then
For wartannk.tank = Each tank
wartank\agw = 0
Next
EndIf

If MouseDown(2) And wartank\agw = 1
wartank\zielx = MouseX()
wartank\ziely = MouseY()
wartank\go = 1
EndIf
EndIf

If wartank\x = wartank\zielx And wartank\y = wartank\ziely Then wartank\go = 0

If wartank\x < wartank\zielx Then wartank\x = wartank\x + 1
If wartank\x > wartank\zielx Then wartank\x = wartank\x - 1
If wartank\y < wartank\ziely Then wartank\y = wartank\y + 1
If wartank\y > wartank\ziely Then wartank\y = wartank\y - 1

If wartank = Null Then wartank.tank = First tank

DrawImage tank1,wartank\x,wartank\y
If wartank\agw Then DrawImage angew,wartank\x,wartank\y



If wartank\energy <= 0 Then Delete wartank : j = j - 1

wartank = After wartank

Next





DrawImage mouse,MouseX(),MouseY() : Flip : Cls

Until KeyHit(1)
End


Es funktioniert einwandfrei, nur die sachen fahren eben über sich drüber, was ja in wirklichkeit auch passieren kann, also muss der Spieler aufpassen, wie er seine Einheiten schickt.

nochmal zum mitschreiben:

Einheiten fahren über sich drüber(darf schon sein), nur die Einheiten müssen dabei Schaden nehmen!!!!

Das problem ist hier, das ich ja immer nur einen Typ checken kann, also wäre das schwachsinnig:


BlitzBasic: [AUSKLAPPEN]
If ImagesCollide(Tank1,wartank\x,wartank\y,0,Tank1,wartank\x,wartank\y,0)


Das ding würde sich ja dann selbst zerstören...

(help me....)
http://www.abandonia.com/

--->Nikola Tesla<---

Artemis

BeitragMo, Jun 13, 2005 15:31
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
Local wartank_colli.tank
For wartank.tank = Each tank
For wartank_colli.tank = Each tank
If wartank <> wartank_colli
If ImagesCollide(tank1,wartank\x,wartank\y,0,tank1,wartank_colli\x,wartank_colli\y,0) Then zerstören
EndIf
Next
Next



erst legst du einen zweiten zugriif auf die tanks fest!
dann läufst du alle tanks durch!
für jeden tank läufst du nochmals alle tanks durch!
wenn die tanks nicht glecih sind (also nich dieselben), prüfst du ob die beiden collidieren!

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragMo, Jun 13, 2005 16:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann hast du aber viel doppelte Abfragen mit drin,
ich löse das immer so
BlitzBasic: [AUSKLAPPEN]
For W1.tank = Each tank 
W2.tank = After W1.tank
While W2.tank <> Null
If ImagesCollide(tank1,W1\x,W1\y,0,tank1,W2\x,W2\y,0) Then
W1\Schaden = W1\Schaden -10
W2\Schaden = W2\Schaden -10
End If
W2.tank = After W2.tank
Wend
Next



Wenn es einer nicht versteht dann erkläre ich das auch noch!
[BB2D | BB3D | BB+]

Ctuchik

BeitragMo, Jun 13, 2005 18:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Schlaue Methode Smile
Wieder was gelernt!
Dankeschöön! Very Happy

MfG Ctuchik
Zu den Nebenwirkungen gehören trockener Mund, Übelkeit, Erbrechen, Harnstau, schmerzhafter rektaler Juckreiz, Halluzinationen, Demenz, Psychose, Koma, Tod und Mundgeruch!
Magie eignet sich nicht für alle!
Fraget euren Arzt oder Apotheker!

pokop

BeitragDi, Jun 14, 2005 14:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Häääää?
und wo krieg ich jetzt nen zweiten her? Die sind doch alle vom selben type...
(ich glaub ich sth auf der Leitung...)
http://www.abandonia.com/

--->Nikola Tesla<---

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragDi, Jun 14, 2005 14:47
Antworten mit Zitat
Benutzer-Profile anzeigen
das spielt keine Rolle!
hier mel eine dolle Erklärung!
Stell dir vor du hast einen Kateikasten(Wartank)

nun nimmst du eine Wäschklammer auf der W1 steht und klemmst diese an die erste Karte!

jetzt zauberst du eine zweite mit der Aufschrift W2 aus der Tasche
und klemmst diese an der Karte hinter der Klammer W1

Und schon hast du deine verschiedene Typeeinträge aus dem gleichem type Namen!

vielleicht reicht das schon um es zu verstehen!
denn diese Types funktionieren wirklich wie ein Kateikasten!
[BB2D | BB3D | BB+]

pokop

BeitragDi, Jun 14, 2005 14:56
Antworten mit Zitat
Benutzer-Profile anzeigen
(des will nicht in meinen Schädel rein!)

Aber wie sag ich dem computer, das er jetzt die zweite klammer auch an DIE Karte hängen soll?
http://www.abandonia.com/

--->Nikola Tesla<---

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragDi, Jun 14, 2005 15:26
Antworten mit Zitat
Benutzer-Profile anzeigen
also mit der Schleife setzt du die W1 auf die erste Karte


For W1.Tank = Each W1.Tank

Next
wenn das Next kommt wird die W1 Klammer eins weiter gesetzt, das bedeutet das alle durchlaufen werden!

mit
w2.tank = after w1.tank
setzt du die 2. Klammer auf die nächste Karte hinter W1

und mit
w2.Tank = after w2.Tank
wird die w2 Klammer einfach ein weitergesetzt!

Bist du am Ende der Katei und es gibt keine karte mehr
ist w2.Tank = Null , dann steckt die Klammer auf keiner Karte
[BB2D | BB3D | BB+]
 

hitokiri

BeitragDi, Jun 14, 2005 19:29
Antworten mit Zitat
Benutzer-Profile anzeigen
@rallimen: genial Smile
würde mich allerdings schonmal interessieren inwiefern es bei geringer anzahl types wirklich schneller als die beiden for each ist, könnte mir vorstellen dass das zweimal after eventuell langsamer ist als eine for each

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragDi, Jun 14, 2005 19:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich denke mal das das grundsätzlich schneller ist als die 2 For..Next Schleifen!
Aber werde es gleich mal testen!

Viel zeitsparender ist das was in der Schleife steht, da diese Abfragen
um mehr als 50% reduziert werden!
und bei colli abfragen ist das sehr zum Vorteil!

[EDIT]
die After Version benötigt nur 30 - 50% der Zeit, dabei spielt es keine Rolle ob es nur 1 Type ist oder es 10000 sind!

Und die Abfragen die drin stehen reduzieren sich genau um 50%
da in der For For Schleife ja jedesmal auch If W1 <>W2 stehen muß
[BB2D | BB3D | BB+]
 

hitokiri

BeitragDi, Jun 14, 2005 21:49
Antworten mit Zitat
Benutzer-Profile anzeigen
dass sich die abfragen um 50% reduzieren war mir klar, dachte nur, dass vielleicht das "after" command langsamer sein könnte als das for each, weil ich dachte, dass er bei after jedes mal erst testet, ob noch ein weiteres danach existiert, während er bei for each einfach einen wert immer dekrementiert bis er auf 0 ist. *kopfkratz*...hoffe irgendjemand kapiert was ich meine... aber egal Smile
danke rallimen

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group