Wo ist der Fehler (kollision)
Übersicht

pille24Betreff: Wo ist der Fehler (kollision) |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo,
probiere grad ein bisschen mit Blitz Basic rum, habe allerdings probs mit der Kollision. Hier ist der Code: BlitzBasic: [AUSKLAPPEN] Graphics 1024,768,16,1 Leider startet er gar nicht erst das 'Spiel' sondern ebscchwert sich über 'Illegal Memory Address' Ich weiß leider nicht wo der Fehler liegt. HAt jemand vone uch eine Idee? [/code] |
||
![]() |
SoNenTyp |
![]() Antworten mit Zitat ![]() |
---|---|---|
Der Debugger müsste dir eigentlich die Zeile nennen in der der Fehler auftrat.
Code: [AUSKLAPPEN] If KeyDown(205) Then
If KollisionOben = False y1 = y1 - 1 EndIf Außerdem hast du dich hier wohl verschrieben. Das müsste warscheinlich eine 200 sein keine 205. Desweiteren hast du danach ein Endif vergessen und es am ende der Tastenabfrage hin gemacht. Dadurch hat diese abfrage Priorität und die anderen werden nur durchgeführt wenn du die taste 200 (205) drückst. |
||
Gruss Der Typ.
User posted image |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also erstmal solltest du vielleicht deine Formatierungsregeln nochmal überdenken. Es ist echt nicht leicht sich in so einem Code wieder zu finden. ![]() 1) Verwechselst du die x und y -Koordinaten bei der Kollisionsvergabe an Variablen (beispiel: KollisionOben=map(y1-1,x1)... Es steht dem Programmierer frei zu endscheiden, welche Koordinaten zuerst kommt. Weiter unten hast du es aber wieder 'richtig' rum. Somit übereinstimmen die Bewegungskoordinaten mit der der Kollision nicht. Erspare dir weitere Probleme und nimm immer die Reihenfolge des Alphabeth (X,Y,Z). Bei den For/Next-Schleifen kann man dies so machen, wenn man möchte das die Map Zeilenweise gezeichnet werden soll. 2) x1=100 und y1=100 befinden sich bereits ausserhalb des Bildschirmes, was einen Index out of Bounds verursacht. Endscheide dich wie du auf die Map zeichnen und wie du deine Bilder in der Map 'kollidieren' lassen möchtest. Folgende Möglichkeiten: 2a) x1#=100 etc. KollisionOben=map(x1/32,(y1/32)-32) etc. DrawImage spieler,x1,y1 2b) x1%=2 etc. KollisionOben=map(x1,y1-1) etc. DrawImage spieler,x1*32,y1*32 Die beiden unterscheiden sich dadurch, daß bei 2a, eine Bewegungseinheit einen Pixel groß ist, bei 2b, eine Bewegungseinheit einen Tile (32 Pixel) groß ist. Je nachdem was für dich besser passt. 3) Die bereits von SoNenTyp beantwortete Fehlerbeschreibung. 4) Ist kein Fehler aber nicht grad 'reourcesschonend' programmiert. Wozu fragst du bereits im Vorwege den Kollisionsradius ab, auch dann wenn dieser garnicht benötigt wird? Schnellerer Code geht beispielsweise so (ganz ohne KollisionOben/Unten/Links/Rechts -Variable). Code: [AUSKLAPPEN] If KeyDown(203) Then
Oder kürzerer Code aber langsamer...Code: [AUSKLAPPEN] If map(x1-1,y1)=0 Then x1=x1-1 End If End If If KeyDown(203)=1 And map(x1-1,y1)=0 Then x1=x1-1
So, und jetzt erstmal begrüße ich dich als neues Mitglied hier im Forum. Und, überdenke mal deine Formatierungsregeln. Ist mir echt ein Dorn im Auge... /EDIT: Achja, versuche dir mal anzugewöhnen (vielleicht hättest du es ja auch bereits so gemacht), eine Antwort zu schreiben. Auch dann, wenn du nach einer Hilfe keine Probleme mehr haben solltest. Es geht nicht nur mir so, daß es recht 'nervig', 'unschön' etc. ist keine Antwort daraufhin zu bekommen, wenn man zum Teil sehr viel Zeit dafür investiert... |
||
pille24 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
vielen Dank. Das hilft mir enorm.
BlitzBasic ist schon ein bisschen schwieriger als das was ich dovor gemacht habe;) Werde das jetzut erst mal alles verbessern. Aber da werden bestimmt noch mehr fragen kommen. |
||
pille24 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nächste Probleme:
Ich habe es jetzt folgender maßen gemacht: BlitzBasic: [AUSKLAPPEN] KollisionOben=map(x1/32,(y1/32)-32) Das ist die Kollisionsabfrage. x1 und y1 sind so definiert. BlitzBasic: [AUSKLAPPEN] x1#=100 Und die Bewegungsabfrage: BlitzBasic: [AUSKLAPPEN] If KeyDown( 205 ) und dann noch den Spieler zeichnen: BlitzBasic: [AUSKLAPPEN] DrawImage spieler,x1,y1 Jetzt kommt allerdings immer der Fehler bei der allerersten Kollisionsabfrage 'Array Index Out of Bounds'. Und dann noch das Springen: Wie kann ich es machen, dass der SPieler nach einer gewissen ZEit wieder zurückfällt zu seiner ursprünglichen Position? ALso sowas Wie Delay... |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi pille, hatte wohl mein Verstand irgendwo liegen gelassen. Richtig ist...Code: [AUSKLAPPEN] KollisionOben=map(x1/32,(y1/32)-1)
KollisionLinks=map((x1/32)-1,y1/32) KollisionRechts=map((x1/32)+1,y1/32) KollisionUnten=map(x1/32,(y1/32)+1) |
||
pille24 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
vielend dank,
ich hatte mich schon gewundert, aber dann hab ich gedacht, ich fange ja grad erst an, wird schon richig sein. pille24 €dit: funzt mehr oder weniger, die Kollisionsabfrage ist jetzt nämlich irgendiwe ziemlich selsam, d.h. sie stimmt überhaupt nicht. Hier noch mal der Code. Wäre nett wenn du mir noch einmal hilfst. BlitzBasic: [AUSKLAPPEN] Global gr_width = 800 |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo pille, formatiere (einrücke) dein Code mal... Ich habe mir mal dein Code denoch mal angesehen. Die Kollisionsabfrage ist wirklich etwas seltsam gewesen. Dann fiel mir ein, daß man eine Kollisionsprüfung nur dann direkt auf das Dim-Feld machen kann, wenn die Spielfigur sich Tileweise bewegt. Das ist nun mal in deinem Beispiel nicht der Fall. Somit bin ich auf ImagesCollide umgestiegen. Ist zwar nicht so schnell, dafür werden nur die max 4 mögliche Felder um der Spielfigur umrum überprüft. Hier mal die Version.Code: [AUSKLAPPEN] Global gr_width=800
Global gr_height=600 Global gr_bit=16 Global gr_win=2 ;Grafik setzen Graphics gr_width, gr_height, gr_bit, gr_win SetBuffer BackBuffer() ;Bilder laden und vorbereiten Global img_matrix = LoadAnimImage("data\blocks.bmp",32,32,0,10) Global player=LoadImage("data\spl2.bmp") Global monster=LoadImage("data\spl.bmp") MaskImage player,255,0,255 MaskImage monster,255,0,255 ;Konstanten und Vars Const KEY_UP=200 Const KEY_DOWN=208 Const KEY_LEFT=203 Const KEY_RIGHT=205 playerspeed=2 playerx=96 playery=96 ;Die Map Dim map(24,18) Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1 Data 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ;Level einlesen For y=0 To 18 For x=0 To 24 Read map(x,y) Next Next ;monster (zum einsammeln) Dim monsterx(4) SeedRnd MilliSecs() monsterx(1)=Rand(3,7) monsterx(2)=Rand(7,12) monsterx(3)=Rand(12,18) monsterx(4)=Rand(18,23) ;Hauptschleife While Not KeyHit(1) ;Map zeichnen For x=0 To 24 For y=0 To 18 DrawImage img_matrix,x*32,y*32,map(x,y) Next Next If KeyDown(KEY_UP) Then If kollision(playerx,playery-playerspeed)=0 Then playery=playery-playerspeed If KeyDown(KEY_DOWN) Then If kollision(playerx,playery+playerspeed)=0 Then playery=playery+playerspeed If KeyDown(KEY_RIGHT) Then If kollision(playerx+playerspeed,playery)=0 Then playerx=playerx+playerspeed If KeyDown(KEY_LEFT) Then If kollision(playerx-playerspeed,playery)=0 Then playerx=playerx-playerspeed ;MonsterKollision For i=1 To 4 DrawImage monster,monsterx(i)*32,32 If ImagesCollide (player,playerx,playery,0,monster,monsterx(i)*32,32,0) Then Color 255,255,0:Rect playerx-2,playery-2,ImageWidth(player)+4,ImageHeight(player)+4,1 EndIf Next ;Spieler Zeichen DrawImage player,playerx,playery Flip ;Cls Wend End ;Kollisionsprüfung Function kollision(xx,yy) For x=xx/32 To 1+xx/32 For y=yy/32 To 1+yy/32 If map(x,y)=1 Then If ImagesCollide(img_matrix,x*32,y*32,map(x,y),player,xx,yy,0) Then Return 1 End If Next Next End Function |
||
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] u=map((playerx+16)/32,(playery-2)/32,0) ; Oben / Up
ImagesCollide ist recht lahm r=map((playerx+32)/32,(playery+16)/32,0) ; Rechts / Right d=map((playerx+16)/32,(playery+32)/32,0) ; Unten / Down l=map(playerx/32,(playery+16)/32,0) ; Links / Left m=map((playerx+16)/32,(playery+16)/32,0) ; Mitte / Middle ![]() temp=playery/32
damit der Spieler nach einem Sprung bzw. dem landen nicht mitten im Tile steht playery=temp*32 ![]() Ich geh dann mal ins Bett, gute Nacht... |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
![]() |
5k41 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Um erstmal bei deinem Grundcode zu Bleiben...mir ist noch dashier aufgefallen...ich find es etwas erkwürdig das man wenn man taste hoch drück nach unter geht...das müsstest du vielleichtso schreiben wenn sich die map beweget und net der spieler aber in deinem fall ( sry wenn ich das irgendwie falsch verstanden hab ![]() pille24 hat Folgendes geschrieben: If KeyDown(Key_UP) Then If map((playerx/32),(playery/32)-1)=False playery=playery-4 EndIf EndIf ~Edit~ Hubsi ist dieses -2 bei der abfrage für oben beabsichtigt? |
||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Jup, ist volle Absicht ![]() 64/32 == 2 Er würde also ein kleines Stück in den oberen Block reinlaufen können ![]() ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
![]() |
5k41 |
![]() Antworten mit Zitat ![]() |
---|---|---|
ah ok... dann is das verständlich...
sry wegen dem mit der tastenabfrage hatte irgendwie wohl grad einen komischen denkfehler...natürlich ist das so richtig ![]() PS:Bitte keinen BB-Code mehr verwenden...ich kann jetzt schon nen kaffe trinken wärend er mit DSL 1000 versucht die site zu laden ![]() |
||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
pille24 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke euch allen, ich leihe mir heut mal Hack'n'Play aus, da muss ich euch dann nicht immer nerven;)
@Hubsi kannst du deinen Code bisschen besser erläutern? dern versteh ich net so richtich. thx |
||
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
In u,d,r... wird einfach nur der Wert gespeichert welcher entsprechend der Spielerposition in dem Maparray abgelegt ist. Die Tilenummer auf gut deutsch ![]() ![]() if keydown(key_up) and u<=100
playery=playery-4 endif ;entsprechend für die anderen Richtungen ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi Hubsi, bist du dir sicher, daß eine Kollisionskontrolle eines fliessend bewegenden Spieler auf direktem Wege der Mapinformationen ausgelegt werden kann? Das Problem ist das der Spieler ja auch eine gewisse Breite hat. Eine solche Kollisionskontrolle kann nur bei ganzen Tilesprüngen oder fliessenden Bewegungen auf den nächsten Tiles durchgeführt werden. Soll aber dem Spieler die Möglichkeit gegeben werden, daß er auch zwischen Tiles stehen bleiben kann, dann wird das ganze etwas komplizierter da dann mindestens die Breite des Spielers pro Richtung mit der er sich bewegt abgeftragt werden muß. Schlecht zu beschreiben... Ähmmm, habs nähmlich auch so ausprobiert, funzte aber nicht. Bei bestimmten Konstellationen konnte die Spielfigur über einige Tiles durchlaufen. | ||
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das hat sich schon vielfach in der Praxis bewährt ![]() ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group