Nächster Gegner

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

sbrog

Betreff: Nächster Gegner

BeitragDi, Jun 15, 2004 22:19
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]

Graphics 800,600

SeedRnd MilliSecs()


gegnerpic = CreateImage(10,10) ;gegnerbild
SetBuffer ImageBuffer(gegnerpic)
Rect 0,0,10,10
SetBuffer BackBuffer()
Type gegner
Field x
Field y
End Type

spielerx= 300
spielery=580

For a=0 To 10 ;10 neue gegner werden erstellt
g.gegner = New gegner
g\x = Rnd(10,790)
g\y = Rnd(10,500)



Next


Repeat
Cls

g = First gegner
kleinsterabstand = abstand(g\x,g\y,spielerx,spielery)
zx =g\x
zy =g\y



For g.gegner = Each gegner
DrawImage gegnerpic,g\x,g\y



If abstand(g\x,g\y,spielerx,spielery) < kleinsterabstand
kleinsterabstand = abstand(g\x,g\y,spielerx,spielery)
zx = g\x
zy = g\y
EndIf

Color 255,0,0
Text g\x,g\y-10,abstand(g\x,g\y,spielerx,spielery)




Next

Color 0,255,0
Text zx,zy-10 ,kleinsterabstand







Color 0,0,255
Oval spielerx,spielery,20,20


If KeyDown(200) Then spielery = spielery-1
If KeyDown(208) Then spielery = spielery+1
If KeyDown(203) Then spielerx = spielerx -1
If KeyDown(205) Then spielerx = spielerx +1

Flip
Until KeyHit(1)



Function abstand(x1,y1,x2,y2)
Return Sqr(((x1 - x2)^2) + ((y1 - y2)^2))
End Function



mit Pfeiltasten bewegen[/syntax]

Markus2

BeitragDi, Jun 15, 2004 23:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Du bist der Held Smile

Klüger wäre ja wenn du nicht jedesmal die Berechnungen doppelt
ausführen würdest Idea

Die Pos. bräuchte man auch nicht extra merken sondern man
könnte sich das Objekt (Type) merken was nur ein Integer ist .

z.B.

local ng.gegner
ng =null
kleinsterabstand =1000000
For g.gegner = Each gegner
entf=abstand(g\x,g\y,spielerx,spielery)
If entf< kleinsterabstand
kleinsterabstand = entf
ng =g
EndIf
Next

if ng<>null then

sbrog

BeitragMi, Jun 16, 2004 13:57
Antworten mit Zitat
Benutzer-Profile anzeigen
dein vorschlag würde nicht ganz hinhauen.
Denn sobald man sich einem anderen Objekt nähert, müsste der Abstand kleiner sein als der bisher kleinste Abstand.
Wenn du z.b bis auf 10 Pixel an gegner 1 rangehst, dann wäre der kleinste abstand 10, wenn du dann später von gegner 2 40 Pixel und von Gegner 1 50 Pixel entfernt bist, ist gegner 1 immer noch der nächste Gegner.

Deine Lösung funktoniert, wenn man sie auf ein Standbild anwendet, sobald man aber den Abstand mehrmals abfragt, versagt sie

ps: dass man das ganze objekt g in einer variable speichern kann, wusste ich nicht, hätte ich sonst auch mit einbezogen

Bob

BeitragMi, Jun 16, 2004 19:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Sbrog.

Bei mir wird (scheinbar) immer der nächst gegner korrekt erkannt.
Was ist den das Problem eigentlich?
Question
Bob

sbrog

BeitragMi, Jun 16, 2004 19:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Es gibt kein direktes Problem. Markus hat nur kritisiert, dass ich den Abstand des ersten Objekts zweimal abfrage.

Bob

BeitragDo, Jun 17, 2004 7:55
Antworten mit Zitat
Benutzer-Profile anzeigen
sbrog hat Folgendes geschrieben:
Es gibt kein direktes Problem.


Ja stimmt. Beitrag ist ja im Code Archiv.
Hab's für ne Art Frage gehalten.
(Mal wieder nicht aufgepasst. Bob. Setzen. 6 Embarassed )

Markus2

BeitragSo, Jun 20, 2004 14:43
Antworten mit Zitat
Benutzer-Profile anzeigen
@sbrog

Zeit ist bei Spielen kostbar .
Aber man könnte den Spieler auslassen in der Schleife oder
den Spieler in andere Types werfen oder ein Kennzeichen
in den Type einsetzen was zwischen gut und böse unterscheidet .

gs = First gegner ;Das ist der Spieler
For g.gegner = Each gegner
if gs<>g then
;Abstand messen
endif

Wenn du Objekt Variablen anlegst zum zwischen speichern
immer dran denken das es das Objekt ja schon gibt und
darum wird auch kein new verwendet .
Wird das Objekt gelöscht kann man es mit = NULL prüfen .

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group