ImagesCollide Bug

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

BlackNetrunner

Betreff: ImagesCollide Bug

BeitragDi, Jan 10, 2006 20:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Leutz!
So ich hab da nen nettes kleines Proggy gecodet. Das Programm bewirkt das wenn ein Bild mit einem Anderen kollidiert dass dann das eine Bild "abgestossen" wird, bzw ist es in meinem RPG dazu gut um Pixelgenau um Objekte herumzulaufen ohne durchzulaufen.
In meinem Falle verwende ich aber KEIN Dim wie man normalerweise in den meissten 2D RPGs verwendet.
Aber seht selbst was ich meine an einem Code Beispiel:

Code: [AUSKLAPPEN]

Graphics 640,480,16

Global      berg            =LoadImage("berg.png")
MaskImage   berg            ,255,0,255

Global      player            =LoadImage("player.png")
MaskImage   player            ,255,0,255

Global      grass            =LoadImage("grass.png")
MaskImage   grass            ,255,0,255

Global          map_pos_x
Global          map_pos_y
Global          map_pos_x_old
Global          map_pos_y_old

Global         frametimer      =CreateTimer(30)
SetBuffer      BackBuffer()


Repeat

   ;draw_map
   TileBlock   grass         ,map_pos_x,map_pos_y
   DrawImage   berg         ,map_pos_x,map_pos_y
   DrawImage   berg         ,map_pos_x,map_pos_y

   ;draw_player
   DrawImage   player         ,320,240
   
   
   ;player_move
   If KeyDown(200) Then ;up
      map_pos_y = map_pos_y + 2
      map_pos_y_old = map_pos_y - 2
   EndIf
   
   If KeyDown(208) Then ;down
      map_pos_y = map_pos_y - 2
      map_pos_y_old = map_pos_y + 2
   EndIf
   
   If KeyDown(205) Then ;right
      map_pos_x = map_pos_x - 2
      map_pos_x_old = map_pos_x + 2
   EndIf
   
   If KeyDown(203) Then ;left
      map_pos_x = map_pos_x + 2
      map_pos_x_old = map_pos_x - 2
   EndIf
   
   
   ;collide_with_berg
   If ImagesCollide(player,320,240,0,berg,map_pos_x,map_pos_y,0) Then
      map_pos_x = map_pos_x_old
      map_pos_y = map_pos_y_old
   EndIf


   Flip
   WaitTimer (frametimer)
   
Until KeyHit(1)


Und so sieht das dann aus:
user posted image

Und jetzt kann man mit den Pfeiltasten um den Berg herumlaufen. Ohne durch ihn durchzugehen Smile
Tja das dachte ich zumindest aber da hat sich ein Bug eingeschlichen

Nämlich wenn man jetzt mahl an die Linke Seite des Berges geht
user posted image

Und dort nun die Linke die Mitlere und die Rechte Pfeiltaste gleichzeitig drückt bewegt sich das Mänchen einfach durch den berg hindurch und das war eigendlich nicht so gedacht Smile
user posted image

Wer kann helfen? Ich denke mal durch einen zusatz Code könnte man diesen Fehler beseitigen. Aber da hab ich kein Plan mehr, das was ich probiert habe funzt nicht.
Wers testen will kan einfach irgendwelche Pix verwenden.

Wer Rechtschreibfehler findet darf sie sich salzen und braten Shocked

5k41

BeitragDi, Jan 10, 2006 21:04
Antworten mit Zitat
Benutzer-Profile anzeigen
mach das mit deinen map_x_old anders!
speicher die nach der kollisionsabfrage einfach so:

map_x_old_pos=map_x_pos

usw...dann sollte es eigentlich funtzen!
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragDi, Jan 10, 2006 21:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Besser ist es diese Zeilen direkt vor den Tastenabfrage-Block zu setzten!
da dort noch keine Kollision stattfand!
Problematisch wird das erst wenn sich auch die Glocke bewegt!
[BB2D | BB3D | BB+]
 

BlackNetrunner

BeitragDi, Jan 10, 2006 21:37
Antworten mit Zitat
Benutzer-Profile anzeigen
meinst du das so:
Code: [AUSKLAPPEN]

   ;collide_with_berg
   If ImagesCollide(player,320,240,0,berg,map_pos_x,map_pos_y,0) Then
      map_pos_x = map_pos_x_old
      map_pos_y = map_pos_y_old
   EndIf

   ;player_move
   If KeyDown(200) Then ;up
      map_pos_y = map_pos_y + 2
      map_pos_y_old = map_pos_y - 2
   EndIf
   
   If KeyDown(208) Then ;down
      map_pos_y = map_pos_y - 2
      map_pos_y_old = map_pos_y + 2
   EndIf
   
   If KeyDown(205) Then ;right
      map_pos_x = map_pos_x - 2
      map_pos_x_old = map_pos_x + 2
   EndIf
   
   If KeyDown(203) Then ;left
      map_pos_x = map_pos_x + 2
      map_pos_x_old = map_pos_x - 2
   EndIf


Original:
Code: [AUSKLAPPEN]

   ;player_move
   If KeyDown(200) Then ;up
      map_pos_y = map_pos_y + 2
      map_pos_y_old = map_pos_y - 2
   EndIf
   
   If KeyDown(208) Then ;down
      map_pos_y = map_pos_y - 2
      map_pos_y_old = map_pos_y + 2
   EndIf
   
   If KeyDown(205) Then ;right
      map_pos_x = map_pos_x - 2
      map_pos_x_old = map_pos_x + 2
   EndIf
   
   If KeyDown(203) Then ;left
      map_pos_x = map_pos_x + 2
      map_pos_x_old = map_pos_x - 2
   EndIf
   
   
   ;collide_with_berg
   If ImagesCollide(player,320,240,0,berg,map_pos_x,map_pos_y,0) Then
      map_pos_x = map_pos_x_old
      map_pos_y = map_pos_y_old
   EndIf


So funktioniert das erst recht nicht, da entsteht sogar noch nen kleiner Grafik Bug

Und ausserdem ist das keine Glocke sondern ein Berg Smile Ist nur schlecht gezeichnet. Steht aber im Code.

Probiert doch einfach mal selber:
http://rapidshare.de/files/10798342/Cbug.zip.html

Das Problem ist NUR vorhanden wenn ich 3 Tasten GLEICHZEITIG drücke unzwar die Linke die Mitlere UND die Rechte aufeinmahl. Und das passiert auch nur wenn sich die Figur an einer Schräge, die von Links unten nach Rechts oben verleuft, befindet. Das ist ein merkwürdiger Bug, testet doch bitte mal und kuckt euch den Code genau an.

Ich kann mir vorstellen das ihr die Schnauze voll von Kollisions Topics habt, aber bitte nur dies eine mahl Embarassed

5k41

BeitragDi, Jan 10, 2006 21:48
Antworten mit Zitat
Benutzer-Profile anzeigen
also auf meine art klappts auch im original code super...
Code: [AUSKLAPPEN]

Repeat

   ;draw_map
   TileBlock   grass         ,map_pos_x,map_pos_y
   DrawImage   berg         ,map_pos_x,map_pos_y
   DrawImage   berg         ,map_pos_x,map_pos_y

   ;draw_player
   DrawImage   player         ,320,240
   
   ;player_move
   If KeyDown(200) Then ;up
      map_pos_y = map_pos_y + 2
   EndIf
   
   If KeyDown(208) Then ;down
      map_pos_y = map_pos_y - 2
   EndIf
   
   If KeyDown(205) Then ;right
      map_pos_x = map_pos_x - 2
   EndIf
   
   If KeyDown(203) Then ;left
      map_pos_x = map_pos_x + 2
   EndIf
   
   ;collide_with_berg
   If ImagesCollide(player,320,240,0,berg,map_pos_x,map_pos_y,0) Then
      map_pos_x = map_pos_x_old
      map_pos_y = map_pos_y_old
   EndIf
   
   map_pos_x_old = map_pos_x
   map_pos_y_old = map_pos_y
   
   Flip
   WaitTimer (frametimer)
   
Until KeyHit(1)
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image
 

BlackNetrunner

BeitragDi, Jan 10, 2006 21:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Manchmal hat man echt nen Brett vorm Kopf!
THX!!! Laughing
 

BIG BUG

BeitragDi, Jan 10, 2006 23:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Noch ein bisschen eleganter geht es mit Slidingkollision:
Code: [AUSKLAPPEN]

;Kollisionen
If coll(x,y) Then
   If coll(x_old,y) Then y = y_old
   If coll(x,y_old) Then x = x_old
EndIf

Dadurch, dass die Achseln einzeln geprüft werden, kannst Du dann auch diagonal am Berg entlanglaufen und wirst nur in die Richtung gestoppt, in die es auch wirklich nicht weitergeht.
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)

Goodjee

BeitragMi, Jan 11, 2006 14:49
Antworten mit Zitat
Benutzer-Profile anzeigen
was ist den coll für ein befehl???
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

5k41

BeitragMi, Jan 11, 2006 15:44
Antworten mit Zitat
Benutzer-Profile anzeigen
coll soll glaub ich ein array darstellen...
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

Ctuchik

BeitragMi, Jan 11, 2006 16:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Ne, coll(x,y) soll denke ich eine Funktion sein, die für die übergegebene x und y Position des Männchens die Kollision überprüft!
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!

5k41

BeitragMi, Jan 11, 2006 19:19
Antworten mit Zitat
Benutzer-Profile anzeigen
achos kann auch sein...wieso schreib er nich (wenn es eine funktion ist) die funktion drunter?
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image
 

BIG BUG

BeitragMi, Jan 11, 2006 20:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Jo, sorry sollte eine eigene Funktion sein:
Code: [AUSKLAPPEN]

Function coll(x, y)
.
.
ImagesCollide...
.
.
End Function


Spätestens wenn ein zweiter Berg dazukommt, wird er es so machen müssen... Smile
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group