Rectsoverlap probleme

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Azran

Betreff: Rectsoverlap probleme

BeitragDo, Dez 10, 2009 18:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey leute

also mein problem is vollgendes eher is es neu frage.
ich wollte mich mal an was proggen. so wie es der zufall so will habe ich zunächst das mit blöcken gemacht und so so da kam ich dann auf 40 blöcke. Die natührlich nicht alle quadratisch sind. so dann habe ich zu jedem block ein Rectsoverlap geschrieben und theoretisch müsste es gehn nur es klappt nicht so ganz. Der bewegende block hält bei "unsichtbaren" wände an und da wo die wände sind fährt er durch. dann habe ich ma getestet was währ wenn alles quatdratisch währ. so da geht es komischer weise nur das wenn ich alles aus quadraten machen müsste um die ka 200 machen bräuchte und da ich das nicht will möchte ich euch fragen ob es vllt nen bessere befehl gibt als rectoverlap was auch für sache geht die zb 20x200 lang sind

ich bedanke mich schon ma im vorraus
Azran

Tennisball

BeitragDo, Dez 10, 2009 18:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Rects = Rechtecke

Zeig uns mal deinen Code oder prüf nochmal nach ob du alles richtig geschrieben hast.

mpmxyz

BeitragDo, Dez 10, 2009 18:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Azran,
wenn Blöcke mit Blöcken kollidieren, ist RectsOverlap schon richtig.
Da der Fehler garantiert im Code liegt, wäre es keine schlechte Idee, wenn du diesen auch zeigst.
Im BBP gibt es nämlich meines Wissens nach keinen Wahrsager. Wink

mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

Azran

BeitragDo, Dez 10, 2009 18:22
Antworten mit Zitat
Benutzer-Profile anzeigen
joa stimmt.
oke das sind jetz nur 4 von den 40 damit es kleiner geht warscheinlich is das rectsoverlap falsch angewendet aber wenn man daraus quadrate machen würde geht es deswegen versteh ich es net

BlitzBasic: [AUSKLAPPEN]
;---------------Header----------------------
AppTitle "Labyrinth"
Graphics 1280,1020,32,2
SetBuffer BackBuffer()
timer=CreateTimer(60)
;-----------------Global----------------------
Global x=40
Global y=40
Global b=20
Global h=20

;---------Labyrinth1_Block_Globals-----------
Global x1=0
Global y1=0
Global b1=1280
Global h1=20

Global x2=0
Global y2=20
Global b2=20
Global h2=1004

Global x3=20
Global y3=980
Global b3=1260
Global h3=20

Global x4=1260
Global y4=20
Global b4=20
Global h4=984

;---------------Schleifenanfang-------------

Repeat

;----------Labyrinth1_Block-------------------
Rect x,y,b,h,0
Rect x1,y1,b1,h1,1
Rect x2,y2,b2,h2,1
Rect x3,y3,b3,h3,1
Rect x4,y4,b4,h4,1


If KeyDown(200) Then
y=y-10
EndIf
If RectsOverlap(x,y,h,b,x1,y1,h1,b1) Then
y=y+10
EndIf

If RectsOverlap(x,y,h,b,x2,y2,h2,b2) Then
y=y+10
EndIf

If RectsOverlap(x,y,h,b,x3,y3,h3,b3) Then
y=y+10
EndIf

If RectsOverlap(x,y,h,b,x4,y4,h4,b4) Then
y=y+10
EndIf


If KeyDown(203) Then
x=x-10
EndIf

If RectsOverlap(x,y,h,b,x1,y1,h1,b1) Then
x=x+10
EndIf

If RectsOverlap(x,y,h,b,x2,y2,h2,b2) Then
x=x+10
EndIf

If RectsOverlap(x,y,h,b,x3,y3,h3,b3) Then
x=x+10
EndIf

If RectsOverlap(x,y,h,b,x4,y4,h4,b4) Then
x=x+10
EndIf


If KeyDown(205) Then
x=x+10
EndIf

If RectsOverlap(x,y,h,b,x1,y1,h1,b1) Then
x=x-10
EndIf

If RectsOverlap(x,y,h,b,x2,y2,h2,b2) Then
x=x-10
EndIf

If RectsOverlap(x,y,h,b,x3,y3,h3,b3) Then
x=x-10
EndIf

If RectsOverlap(x,y,h,b,x4,y4,h4,b4) Then
x=x-10
EndIf
If KeyDown(208) Then
y=y+10
EndIf

If RectsOverlap(x,y,h,b,x1,y1,h1,b1) Then
y=y-10
EndIf

If RectsOverlap(x,y,h,b,x2,y2,h2,b2) Then
y=y-10
EndIf

If RectsOverlap(x,y,h,b,x3,y3,h3,b3) Then
y=y-10
EndIf

If RectsOverlap(x,y,h,b,x4,y4,h4,b4) Then
y=y-10
EndIf


;--------------Schleifenende--------------------
Flip 0
Cls
WaitTimer timer
Until KeyHit(1)
;----------------programm end--------------------

Tennisball

BeitragDo, Dez 10, 2009 18:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist hardgecodet.

Ich würde empfehlen vllt zwei neue Variablen LastXMove und LastYMove einzuführen und damit viel Code zu sparen.

Z.B. beim Runterbewegen wird LastYMove auf 10 gesetzt, beim hochbewegen auf -10
Genau so mit LastXMove nur mit links und rechts.
Bei einer Kollision bewegst du den Spieler einfach -(LastXMove) auf der X-Achse und -(LastYMove) auf der Y-Achse. (Also wieder zurück, was er gerade gelaufen ist)


Dennoch wäre der Fehler bei deinem Code folgender:
Code: [AUSKLAPPEN]
If KeyDown(200) Then
y=y-10
EndIf ;<- dieses EndIf...
If RectsOverlap(x,y,h,b,x1,y1,h1,b1) Then
y=y+10
EndIf
;(...alle anderen RectsOverlap-Abfragen...)
;...muss nach hier


Ansonsten fragst du 4 Mal ab, ob du kollidierst. Also wirst du auch im Fall der Kollision in alle Richtungen 10 Pixel bewegt. Also nach oben und nach unten, nach links und nach rechts -> Keine Veränderung.

Und was ich außerdem empfehlen würde: Types für Wände. Dann musst du nicht jede einzelne Wand abfragen. Schau dir mal ein Type-Tutorial an. Z.B. hier.


mfg,
Tennisball


Edit: Übrigens hast du da Hoehe und Breite vertauscht, wenn b Breite sein soll und h Hoehe
  • Zuletzt bearbeitet von Tennisball am Do, Dez 10, 2009 18:36, insgesamt einmal bearbeitet
 

Lion

BeitragDo, Dez 10, 2009 18:33
Antworten mit Zitat
Benutzer-Profile anzeigen
also ich hab mir jetzt nur das erste rectsoverlap angeguckt, aber du weißt, dass rectsoverlap so funktioniert...?
Rectsoverlap(X1,Y1,Breite von X1,Höhe Von Y1,X2,Y2,Breite Von X2,Höhe von Y2)...
das was du da hast ist was anderes, da zumindest X in verbindung mit X1 steht, wobei X1 0 ist, sprich es hat garkeine breite und kann damit nicht kollidieren.
Wie bei den anderen aussieht weiß ich nich...
Intel Core 2 Quad 4x2.66 ghz - 4gb ddr2 - nvidia GeForce GTX660 2gb
Intel Atom 1x1.83 ghz - 2gb ddr2 - intel GMA 3150 256mb
AMD A10-5750M 4x2.5 ghz - 8 gb ddr4 - AMD R9 M290x
 

Azran

BeitragDo, Dez 10, 2009 19:35
Antworten mit Zitat
Benutzer-Profile anzeigen
zomfg ich habe den fehler!
es lag nicht an dem endif Wink
dadurch das ich b und h nen unterschiedlichen werte hatte und inbei rectsoverlap b und h vertauscht hatte in der reihenfolge hat der somit die kollision genau um 90 grad gedreht gehabt xD
aber danke für die hilfe

mfg
Azran

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group