"LineTest" , V.1.3 !!!!!! - neues beispiel

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Bms

Betreff: "LineTest" , V.1.3 !!!!!! - neues beispiel

BeitragFr, Sep 10, 2004 13:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Hy. Wollt nen gegner mit laser machen. der soll aber nicht durch hindernisse hindurch zielen können. da hab ich die funktion geschrieben:

sie geht alle Punkte zwischen zwischen zwei punkten ab und testet, ob die angegebene Farbe vorkommt. Wenn ja, liefert sie 1, ansonsten 0.

startx=x-pos1
starty=y-pos1
endx=x-pos2
endy=y-pos2
>halt wie bei "line"

der parameter "farbe" ist halt die farbe als zahl. rot ist(dezimal) -65536
weil bei mir geht nie:
if readpixel(x,y)=$FF0000
warum, keine ahnung. vielleicht liegts ja an was andrem. naja. egal.


so. hier gleich mit Bsp.:

BlitzBasic: [AUSKLAPPEN]

Graphics 640,480,16,2
AppTitle \"LineTest-Funktion von bms\"
SetBuffer BackBuffer()

Color 255,255,0
Line 100,100,100,25
Color 255,0,0
Rect 105,40,80,80
Flip
Color 255,255,0
Text 100,100,LineTest(100,100,100,25,-65536); -65536 = rot
Flip
Delay 1000
Cls
Color 255,255,0
Line 100,100,100,25
Color 255,0,0
Rect 80,40,80,80
Flip
Color 255,255,0
Text 100,100,LineTest(100,100,100,25,-65536)
Flip
Delay 5000


Function LineTest(startx,starty,endx,endy,farbe)
If (startx<=endx)And(starty<=endy)Then
For a=startx To endx
For b=starty To endy
If ReadPixel(a,b)=farbe Then Return 1
Next
Next
EndIf
If (startx>=endx)And(starty<=endy)Then
For a=startx To endx Step -1
For b=starty To endy
If ReadPixel(a,b)=farbe Then Return 1
Next
Next
EndIf
If (startx<=endx)And(starty>=endy)Then
For a=startx To endx
For b=starty To endy Step -1
If ReadPixel(a,b)=farbe Then Return 1
Next
Next
EndIf
If (startx>=endx)And(starty>=endy)Then
For a=startx To endx Step -1
For b=starty To endy Step -1
If ReadPixel(a,b)=farbe Then Return 1
Next
Next
EndIf
End Function


schon lang, gell. davor wollt ichs erst mit
BlitzBasic: [AUSKLAPPEN]

If startx<endx Then richtung1=1 Else richtung1=-1

machen und richtung1(und richtung2 für y)als Step machen.
aber:
00000000000000000000000000000000
0000 step value must be constant 0000
00000000000000000000000000000000
  • Zuletzt bearbeitet von Bms am Sa, Nov 20, 2004 13:52, insgesamt 5-mal bearbeitet

sbrog

BeitragFr, Sep 10, 2004 13:39
Antworten mit Zitat
Benutzer-Profile anzeigen
steps kannst du doch auch in der schleife verändern

stepmanuell =2
for i = 0 to 5 step 1

i = 0+ stepmanuell
stepmanuell = stepmanuell +1

next

simi

BeitragFr, Sep 10, 2004 15:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:

weil bei mir geht nie:
if readpixel(x,y)=$FF0000
warum, keine ahnung. vielleicht liegts ja an was andrem. naja. egal.


In der Onlinehilfe steht, dass es noch Alpha Pixel hat, vornedran, und deshalb müsstest du so abfragen:
if ReadPixel(x,y)=$FFFF0000

Arrow http://www.blitzbase.de/befehle2d/readpixel.htm

rambo256

BeitragFr, Sep 10, 2004 15:44
Antworten mit Zitat
Benutzer-Profile anzeigen
kann man diese Routine eigentlich auch in "Realtime" nutzen,also ist sie schnell genug in einem z.b. 2D-Shooter einzubauen?
Asus F53z

Das Leben ist eine reine Konkatenation...

Bms

BeitragFr, Sep 10, 2004 16:32
Antworten mit Zitat
Benutzer-Profile anzeigen
@simi: danke, hab ich völlig verpennt

@rambo256: glaub, schon. sind ja nur for-next-schleifen, ein paar if-abfragen und readpixel(bzw. readpixelfast wenns braucht). so langsam müsste das eigentlich nicht sein. mal testen...

[edit] man könnte sonst noch zur not die steps "hochdrehn". der gegner soll ja nicht perfekt zielen können, wär ja langweilig. allgemein würde ich aber das zielen nur z.B. 3x pro Sekunde machen. sonst wärs zu fies, wenn dich die ganze zeit so n zieler verfolgt. oder den treffer noch mit
[syntax="bb":1:5334ca9b41]
trefferx=trefferx+rand(-15,15)
treffery=treffery+rand(-15,15)
[/syntax:1:5334ca9b41]
verändern.

rambo256

BeitragFr, Sep 10, 2004 20:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja,k
Aber ich möchte das nicht nur zum zielen verwenden (Hab da schon so etwas ähnliches nur komplexer und mit levelaufstieg usw. ),sondern auch für das Sichtfeld eines Gegners auf einer Tile-map.
Werde es mal ausprobieren,wenn ich soweit bin.
Asus F53z

Das Leben ist eine reine Konkatenation...

Bms

BeitragSa, Sep 11, 2004 9:40
Antworten mit Zitat
Benutzer-Profile anzeigen
oh noch was: am besten 24- oder 32-bit modus verwenden. sonst kommt es zu fehlergebnissen, weil es manche farben im 16bit modus garnicht gibt.
ich versuch mal, so n prog zu schreiben, das alle farben im 16bit-modus testet, ob es sie gibt. wenn nicht, werden die farbwerte in ne datei geschrieben. dann muss man nur schauen, ob die "hindernissfarbe"nicht dabei ist. könnte etwas dauern.
Reblonce (Jump + Run + Shoot - Game; 20 Levels): Download

BladeRunner

Moderator

BeitragSa, Sep 11, 2004 9:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Bms, mach es doch nicht so kompliziert: Du schreibst die zu blockierende Farbe an einen Definierten Pixel (0,0 zB) und liesst sie direkt danach wieder aus. Das Ergebnis liefert den im aktuellen Bildschirmmodus gültigen Farbwert. Den merkst du Dir und schwupp- fröhliches Blocken ist angesagt. Funzt auch Spitze beim berühmt-berüchtigten Maskimage-"Bug" (der ja keiner ist...).
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

The Yeti

BeitragSa, Sep 11, 2004 18:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich könnte das gut gebrauchen, aber ich glaube, da ist ein Fehler drin (vielleicht vertu ich mich, bin ja noch Anfänger):
Dein Code testet nicht nur die Pixel bei der Linie, sondern in dem Rechteck startx,starty,endx,endy

und somit nix weiter als RectsCollide, nur mit Farbprüfung...

Bms

BeitragMo, Sep 13, 2004 15:01
Antworten mit Zitat
Benutzer-Profile anzeigen
hier die verbesserte LineTest-Function(V 1.1 Very Happy ):

BlitzBasic: [AUSKLAPPEN]

Function LineTest(startx,starty,endx,endy,farbe,steps=1)
While (startx<>endx)And(starty<>endy)
If startx<endx Then startx=startx+steps
If startx>endx Then startx=startx-steps
If starty<endy Then starty=starty+steps
If starty>endy Then starty=starty-steps
If (startx>endx-steps)And(startx<endx+steps)Then startx=endx
If (starty>endy-steps)And(starty<endy+steps)Then starty=endy
If ReadPixel(startx,starty)=farbe Then Return 1
Wend
End Function


zusätzlich gibt es noch den parameter "steps".
Reblonce (Jump + Run + Shoot - Game; 20 Levels): Download

Bms

BeitragSo, Sep 19, 2004 13:10
Antworten mit Zitat
Benutzer-Profile anzeigen
und noch besser: der kollisionspunkt wird jetzt auch noch zurückgeliefert:

BlitzBasic: [AUSKLAPPEN]

Function LineTest$(startx,starty,endx,endy,farbe,steps=1)
While (startx<>endx)And(starty<>endy)
If startx<endx Then startx=startx+steps
If startx>endx Then startx=startx-steps
If starty<endy Then starty=starty+steps
If starty>endy Then starty=starty-steps
If (startx>endx-steps)And(startx<endx+steps)Then startx=endx
If (starty>endy-steps)And(starty<endy+steps)Then starty=endy
If ReadPixel(startx,starty)=farbe Then Return Str$(startx)+\",\"+Str$(starty)
Wend
End Function
Reblonce (Jump + Run + Shoot - Game; 20 Levels): Download

BladeRunner

Moderator

BeitragSo, Sep 19, 2004 20:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry, aber deine Funktion ist simpel gesagt BULLSHIT, da sie in keinster Weise auf die Steigung der Linie zwischen den beiden Geraden eingeht.
Daher beschreibst du einen festen 45°-Winkel zwischen dem Startpunkt und der Koordinate die zuerst mit einer Komponente des Endpunktes übereinstimmt und ab dann wahlweise eine Lot- oder eine Waagerechte. Es findet also KEINE direkte "Sichtprüfung" statt.
Abhilfe schafft eine Verhältnisbestimmung zwischen Höhen- und Breitendifferenz (=Steigung) welche dann als "step"-Verhältnis dient.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Bms

BeitragSo, Okt 03, 2004 18:10
Antworten mit Zitat
Benutzer-Profile anzeigen
nun die verbesserte version (schon v.1.2). zum zeigen, wo er überprüft werden die zu überprüfenden punkte noch mit plot angezeigt(falls ihr linetest verwendet, plot auskommentieren oder löschen!!).der endpunkt ist mousex(),mousey(). hier ist es:

BlitzBasic: [AUSKLAPPEN]

Graphics 640,480,32,1
AppTitle \"LineTest-Funktion von bms\"
SetBuffer BackBuffer()

ClsColor 0,0,0

Repeat
Cls
Color 255,0,0
Rect 150,210,80,80
Color 0,0,0
Rect 0,0,50,50
Color 255,255,0
Text 0,0,ReadPixel(MouseX(),MouseY())
Color 255,255,0
v$=LineTest$(100,100,MouseX(),MouseY(),33488896,12)
Text 300,100,\"hallo\"+v$
Flip
Until KeyDown(1)
End


Function LineTest$(startx#,starty#,endx#,endy#,farbe,steps#=1)
spx#=(endx#-startx#)/steps# : spy#=(endy#-starty#)/steps#
While (startx#<>endx#)Or(starty#<>endy#)
startx#=startx#+spx# : starty#=starty#+spy#
If (startx#>endx#-10)And(startx#<endx#+10)Then startx#=endx#
If (starty#>endy#-10)And(starty#<endy#+10)Then starty#=endy#
If ReadPixel(Int(startx#),Int(starty#),BackBuffer())=farbe Then Return Int(startx#)+\",\"+Int(starty#)
Color 255,255,0
Plot startx#,starty#
Wend
End Function


jetzt ist es aber kein BULLSHIT mehr, bladerunner.
Reblonce (Jump + Run + Shoot - Game; 20 Levels): Download

BladeRunner

Moderator

BeitragMi, Okt 06, 2004 10:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry wenn ich dir auf den Schlips getreten bin, aber ich muss es auch schon wieder tun:
-Die Line mit der du testest schlägt Haken, also ist die Abfrage ungenau (ein Pixel Verschiebung kann schon den Unterschied zwischen richtig und falsch erkannter Kollision ausmachen). Hierzu ein Screenie:
user posted image
Wie Du siehst ist der Abstand zwischen den Punkten unterschiedlich groß und es ist keine Strecke die du bildest (nicht alle Punkte liegen auf einer Linie).

- Die Funktion übergibt bei mir (mit den eingestellten Werten) nie einen Wert zurück weil die passende Abfrage dazu nie erreicht wird (ich habs mit einem eingefügten Printbefehl überprüft) Also meldet sie ja gar keine Kollision und erfüllt somit ihren Zweck (in deinem Beispiel) nicht.
Erst nachdem ich das Alphabyte bei Farbe mit eingerechnet habe ging die Funktion - hier wäre es ratsamer gewesen ein funktionierendes Beispiel beizulegen ODER in der Funktion mit AND das Alphabyte zu maskieren.

Das Codearchiv ist eigentlich für getestete und funktionsfähige Codeschnipsel gedacht, du solltest deine Codes also etwas besser prüfen bevor du sie postest.
Es wäre schade wenn an sich gute Ideen untergehen weil die Leute die es brauchen könnten nach der dritten fehlerhaften Version entnervt aufgeben.
Gruß BladeRunner
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Bms

BeitragFr, Okt 08, 2004 13:45
Antworten mit Zitat
Benutzer-Profile anzeigen
so zufrieden?

BlitzBasic: [AUSKLAPPEN]

Graphics 640,480,32,1
AppTitle \"LineTest-Funktion von bms\"
SetBuffer BackBuffer()

ClsColor 0,0,0

Repeat

Cls
;rechteck
Color 255,0,0
Rect 150,210,80,80

;Kollision?
Color 255,255,0
Text 300,100,\"Kollision: \"+LineTest$(100,100,MouseX(),MouseY(),$FFFF0000,1000)
Color 0,255,0
Oval MouseX()-2,MouseY()-2,4,4,1
Flip

Until KeyDown(1)
End


Function LineTest$(startx#,starty#,endx#,endy#,farbe,steps#=1)
spx#=(endx#-startx#)/steps# : spy#=(endy#-starty#)/steps#
While (startx#<>endx#)Or(starty#<>endy#)
startx#=startx#+spx# : starty#=starty#+spy#
If (startx#>endx#-2)And(startx#<endx#+2)And(starty#>endy#-2)And(starty#<endy#+2)Then
starty#=endy#:startx=endx
EndIf
If ReadPixel(Int(startx#),Int(starty#),BackBuffer())=farbe Then
Color 0,0,255 : Oval startx-2,starty-2,4,4,1: Return Int(startx#)+\",\"+Int(starty#)
EndIf
Color 255,255,0
If (startx<>endx)Or(starty<>endy) Plot startx#,starty#
Wend
End Function


grüner punkt = aktuelle mausposition
blauer punkt = kollisionspunkt (falls kollision)
Reblonce (Jump + Run + Shoot - Game; 20 Levels): Download

BladeRunner

Moderator

BeitragFr, Okt 08, 2004 22:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Sehr schön Wink
Bei geringen "Steps" ragt der gefundene Kollipunkt etwas in die Fläche rein, aber das ist nit dramatisch (perfekt wäre natürlich wenn die Funktion bei erfolgter Kollisionserkennung zwischen den letzten beiden Punkten nach der "exakten" Grenze sucht.).
Insgesamt nun aber eine rundweg brauchbare Sache.
Gl´unsch dazu von mir Wink
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Bms

BeitragSa, Nov 20, 2004 13:58
Antworten mit Zitat
Benutzer-Profile anzeigen
neues beispiel:
BlitzBasic: [AUSKLAPPEN]

Graphics 640,480,32,1
AppTitle \"LineTest-Funktion von Bernhard M. Stiehle\"
SetBuffer BackBuffer()

ClsColor 0,192,192

Dim punkt(19,2)



Repeat


Cls

ms=MilliSecs()

;mx+my
mx=MouseX():my=MouseY()
;rechteck
Color 255,0,0:Rect 150,210,80,80
;Sieht die Figur den Punkt?
lt$=LineTest$(punkt(a,0),punkt(a,1),x#,y#,$FFFF0000,1000)
If lt$<>\"\" Then xx#=x#:yy#=y#:d=1:a=(a+1)Mod 19;punkt nicht gesehen -> nächster punkt & xx/yy-save
If d Then Text xx#,yy#,\"Ich kann den Punkt nicht sehen\"
If d Then d=d+1:If d=100 Then d=0
;Winkel ausrechnen + bewegen
winkel=(ATan2(x#-punkt(a,0),y#-punkt(a,1))+180)Mod 360
If lt$=\"\" Then x#=x#+Sin#(winkel):y#=y#+Cos#(winkel)
;nächster punkt, falls erreicht
If (Int(x#)=punkt(a,0))Or(Int(y#)=punkt(a,1))Then punkt(a,2)=0:a=(a+1)Mod 19
If punkt(a,2)=0 Then a=(a+1)Mod 19
;punkte malen+verbinden
For b=0 To 19
If punkt(b,2)Then Oval punkt(b,0),punkt(b,1),3,3
Next
;Text
If lt$<>\"\" Then Color 255,255,0:Text 300,100,\"Kollision: \"+lt$
;neuen punkt setzen
If MouseHit(1)Then punkt(aa,0)=mx:punkt(aa,1)=my:punkt(aa,2)=1:aa=(aa+1)Mod 19
;\"figur\" malen
Color 128,0,255
Oval x-2,y-2,4,4
;Mauszeiger malen
Color 0,255,0
Rect mx,my,3,3
;fps
If MilliSecs()-ms Then Text 320,240,1000/(MilliSecs()-ms)
;buffer wechseln
Flip


Until KeyDown(1)
End









Function LineTest$(startx#,starty#,endx#,endy#,farbe,steps#=1)
spx#=(endx#-startx#)/steps# : spy#=(endy#-starty#)/steps#
While (startx#<>endx#)Or(starty#<>endy#)
startx#=startx#+spx# : starty#=starty#+spy#
If (startx#>endx#-2)And(startx#<endx#+2)And(starty#>endy#-2)And(starty#<endy#+2)Then
starty#=endy#:startx=endx
EndIf
If ReadPixel(Int(startx#),Int(starty#),BackBuffer())=farbe Then
Color 0,0,255 : Oval startx-2,starty-2,4,4,1: Return Int(startx#)+\",\"+Int(starty#)
EndIf
Color 255,255,0
If (startx<>endx)Or(starty<>endy) Plot startx#,starty#
Wend
End Function


mit einem mausklick kann man der "figur"(lilaner kreis) einen neuen waypoint geben. falls keine wegpunkte mehr aktiviert sind, rudert er n bissl verrückt herum und zeigt auf alle unaktivierten punkte(*lutvl*).
leider funktionieren nicht alle punkte(beweis: den 1.waypoint an den oberen rand setzen: er sieht ihn nicht).
die zahl in der mitte sind die fps.
Reblonce (Jump + Run + Shoot - Game; 20 Levels): Download

Kabelbinder

Sieger des WM-Contest 2006

BeitragSa, Nov 20, 2004 20:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Cooles Ding! Aber wenn du richtige Waypoints machst, würde ich den Waypoint einfach löschen wenn zwischen ihm und dem vorherigen keine direkte Verbindung bestehen kann.
Aber sonst Linetest technisch sehr schön, finde ich. Smile
<Wing Avenger Download> ◊◊◊ <Macrophage Download>

eXceptION

BeitragSo, Nov 21, 2004 14:09
Antworten mit Zitat
Benutzer-Profile anzeigen
suche "Brezenham's Line Algorithm" bei google...

vielleicht ist da was zum lernen?! Rolling Eyes
Norweger...

Spreche aber verdammt gut 8086

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group