JNR problem mit Pickups

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Razor1994

Betreff: JNR problem mit Pickups

BeitragDo, Mai 06, 2010 12:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bin an einem kleinen JNR nichts besonderes aber es macht trotzdem dauernd Probleme.^^Und dieses schaffe ich einfach nicht alleine zu lösen. Meine Pickups erscheinen wo sie sollen aber immer wenn meine Figur unter den Items durchgeht werden sie "aufgehoben" ohne das meine Figur sie berührt hätte. Ich habe alles schon 2 mal kontrolliert finde den Fehler aber einfach nicht. Vielleicht könnt ihr mir helfen.
der Code: [AUSKLAPPEN]
;grafik optionen
Global Screen_x = 960
Global Screen_y = 640

Graphics Screen_x, Screen_y, 0, 0
SetBuffer BackBuffer()
frametimer = CreateTimer(30)


Global pickups = LoadImage ("C:\Program Files\Blitz2DDemo\help\resources\samples\Graphics\pickups.bmp")
MaskImage pickups, 255, 0, 255


Type pickup
   Field pickup_x
   Field pickup_y
   Field start_x
   Field start_y
   Field hoehe
   Field breite
End Type

Restore pickups_level1
Read anzahl                     ;der erste Wert in der Dataschleife gibt die Anzahl der Pickups an
For i = 1 To anzahl               ;Zählt durch die einzelnen Einträge 
   info.pickup = New pickup      ;Neue Pickups erstellen
   Read x, y, s_x, s_y, h, b      ;Koordinaten lesen
   info\pickup_x = x            ;x und y Werte an dem Typ übergeben
   info\pickup_Y = y            ;ausserdem die start parameter weil es nur ein ausschnitt ist
   info\start_x = s_x            ;sowie die höhe und die breite
   info\start_y = s_y
   info\hoehe = h
   info\breite = b
Next       


Repeat
Cls

PickupsZeichnen
PickupKollision

Flip
Until KeyHit(1)


; Die pickups malen
Function PickupsZeichnen()
   For info.pickup = Each pickup               ; Alle pickups abfragen
      DrawImageRect pickups, info\pickup_x, info\pickup_y, info\start_x, info\start_y, info\hoehe, info\breite   ;Pickups malen
   Next
End Function

Function PickupKollision()
   For info.pickup = Each pickup   ;Alle Pickups abfragen
      If ImagesCollide (pickups, info\pickup_x, info\pickup_y, 0, player, spieler\x, spieler\y, 0) Then ;Sobald eine Kollision auftritt
         Delete info.pickup   ; Pickup löschen
      EndIf
   Next
End Function

.pickups_level1
Data 25
Data 32,64,204,0,42,33
Data 64,64,204,0,42,33
Data 96,64,204,0,42,33
Data 128,64,204,0,42,33
Data 160,64,204,0,42,33
Data 448,64,204,0,42,33
Data 480,64,204,0,42,33
Data 512,64,204,0,42,33
Data 544,64,204,0,42,33
Data 576,64,204,0,42,33
Data 224,192,204,0,42,33
Data 256,192,204,0,42,33
Data 288,192,204,0,42,33
Data 320,192,204,0,42,33
Data 352,192,204,0,42,33
Data 32,320,204,0,42,33
Data 64,320,204,0,42,33
Data 96,320,204,0,42,33
Data 128,320,204,0,42,33
Data 160,320,204,0,42,33
Data 448,320,204,0,42,33
Data 480,320,204,0,42,33
Data 512,320,204,0,42,33
Data 544,320,204,0,42,33
Data 576,320,204,0,42,33


Der code ist nicht das ganze. Nur der Teil mit den Pickups wenn ihr den Rest auch noch wollt sagt es einfach.
User posted image
kommt in meinen Runescape clan

Hubsi

BeitragDo, Mai 06, 2010 13:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Pack die Items als "normale" Tiles in einen zweiten Layer. Erstens funktioniert ImagesCollide nicht überall richtig und zweitens wird Dir die Art und Weise noch tierisch viel Ärger machen wenn die Maps erstmal größer werden. Tausend mal einfacher ist es noch dazu Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...
 

Razor1994

BeitragDo, Mai 06, 2010 13:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie geht das mit dem 2. Layer?^^
User posted image
kommt in meinen Runescape clan

M0rgenstern

BeitragDo, Mai 06, 2010 13:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, du hast ja sicherlich ein Maparray, sagen wir mal BlitzBasic: [AUSKLAPPEN]
LevelMap(x,y)
.
Dadrin stecken ja deine Mapdaten.
Und du weitest das einfach in die dritte Dimension aus, welche dann deine Layer angiebt.
Dadurch erhälst du also:
BlitzBasic: [AUSKLAPPEN]
Levelmap(x,y,Layeranzahl)


Dadrauf kannst du genauso wie auf ein zweidimensionales Array zugreifen, nur halt mit drei verschachtelten For-schleifen.

Wenn du ein J'N'Run programmieren willst, würde ich dir sowieso raten nen Leveleditor zu programmieren und die Data Strukturen gleich zu vergessen.
Das funktioniert nicht lange.


Lg, M0rgenstern

Hubsi

BeitragDo, Mai 06, 2010 13:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Denkbar simpel:

Dim map(x,y,1)

2 Layer. Persönlich verwende ich grundsätzlich Layer 0 für die eigentliche Map, sprich alles was der Kollision dient, der Layer 1 ist dann für Gimmicks, optische Aufwertungen und dergleichen Kram. Halt das Zeug wo man durchlaufen kann. Die Kollision prüfe ich dann eben nur auf map(x,y,0). Im Layer 1 (sprich map((spielerX+16)/32,(spielerY+16)/32,1) werden dann Medipacks, Handfeuerwaffen der neuesten Generation, tödliche Stacheln oder Diamanten gespeichert und geprüft. Hat zudem den Vorteil das der Layer 1 den Layer 0 übermalen kann, man kann also Butterblumen oder Totenköpfe ohne Aufwand als Gimmick fürs Auge in einer Felsenwand platzieren Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...
 

Razor1994

BeitragDo, Mai 06, 2010 14:01
Antworten mit Zitat
Benutzer-Profile anzeigen
ok soweit kapier ich das ja auch aber ich glaube nicht das mir das bei meinem Problem hilft. Denn 1. Wie mache ich dann das mit dem Pick up aufsammeln ohne imagescollide und 2. Ist mein problem glaube ich etwas anderes. Mein problem ist das wenn ich so 5-7 tiles unter dem item durchlaufe ich es "aufhebe."
User posted image
kommt in meinen Runescape clan

Hubsi

BeitragDo, Mai 06, 2010 14:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Hubsi hat Folgendes geschrieben:
map((spielerX+16)/32,(spielerY+16)/32,1)


Nehmen wir an alle Tiles von 100 bis 200 wären Pickups. Dann sieht es nach obiger Formel so aus:

BlitzBasic: [AUSKLAPPEN]
If map((spielerX+16)/32,(spielerY+16)/32,1)>=100 And map((spielerX+16)/32,(spielerY+16)/32,1)<=200 Then
map((spielerX+16)/32,(spielerY+16)/32,1)=0
Item_wirkt_sich_irgendwie_aus()
EndIf


Es wird einfach die Map verändert, respektive eben der 2. Layer.
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

M0rgenstern

BeitragDo, Mai 06, 2010 14:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, das ist ja kein Problem mehr.
Du rechnest (sofern du das musst) die Position des Spielers in Mapdaten um (weiß jetzt nicht, ob du dich pixelweise oder Tileweise bewegst).
Dann vergleichst du diese neuen Koordinaten mit der der Map in deinem ItemLayer.
Und wenn die Koordinaten übereinstimmen dann kann der Spieler das Item aufnehmen.

Beispiel:
BlitzBasic: [AUSKLAPPEN]

TiemLayer = 2
Tilesize = 32
SpielerX = 64
SpielerY = 64
SpielerXMap = (SpielerX+tilesize/2)/Tilesize
SpielerYMap = (SpielerY+tilesize/2)/Tilesize
If LevelMap(SpielerXMap,SpielerYMap,ItemLayer) = 1 Then
;Code für Item aufsammeln hier
EndIf


Vielleicht hilf das.

Lg, M0rgenstern

EDIT: Verdammt, zu spät.
 

Ava

Gast

BeitragDo, Mai 06, 2010 19:24
Antworten mit Zitat
Naja, diese Layer-Lösung ist aber nicht gerade die optimalste ... auch nicht für einen Anfänger. Dein erster Ansatz war um vieles besser!

Code: [AUSKLAPPEN]
Function PickupKollision ( )

   For info.pickup = Each pickup

      If .... <- an dieser Stelle eine einfache Distanzabfrage oder Rechteck-Kollision prüfen!

         Delete info.pickup

      EndIf

   Next

End Function


Distanzabfrage:
Code: [AUSKLAPPEN]
Sqr ( ( Pickup_Mittelpunkt_x - Player_Mittelpunkt_x ) ^ 2 + ( Pickup_Mittelpunkt_y - Player_Mittelpunkt_y ) ^ 2 <= ( Pickup_Radius + Player_Radius )

Oder eben mit RectsOverlap (gab es bei BB glaube ich? *lang isses her* ^^)

Zusätzliche Layer sind umständlich und unflexibel.

M0rgenstern

BeitragDo, Mai 06, 2010 19:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Naja, diese Layer-Lösung ist aber nicht gerade die optimalste ... auch nicht für einen Anfänger. Dein erster Ansatz war um vieles besser! [...] Zusätzliche Layer sind umständlich und unflexibel.


Also, ich weiß beim besten Willen nicht, was an der Layer Lösung so falsch ist.
Also, ich finde diese Lösung um einiges angenehmer (Editor vorausgesetzt) als jedes Pickup "von Hand" zu setzen.
Jedenfalls gilt das, wenn man die Pickups vorher auf der Karte verteilt.
Sollte es jetzt eher darum gehen, Pickups während dem Spielverlauf zu erstellen (Gegner die diese "droppen") dann ist deine Lösung natürlich die Bessere.

Aber mehrere Layer braucht man bei sowas schon.
Mindestens einer für Kollision und einer für die Tiles selbst.

Lg, M0rgenstern
 

Ava

Gast

BeitragDo, Mai 06, 2010 21:24
Antworten mit Zitat
M0rgenstern hat Folgendes geschrieben:
Also, ich weiß beim besten Willen nicht, was an der Layer Lösung so falsch ist.
Also, ich finde diese Lösung um einiges angenehmer (Editor vorausgesetzt) als jedes Pickup "von Hand" zu setzen.

Völliger Quark. Sobald Du einen Editor verwendet, ist es für das Leveldesign in der Regel relativ pillepalle, wie Du die Daten intern verwaltest. Einmal abgesehen davon, dass manche Konstruktionen eben mehr Möglichkeiten offen halten, als andere ... aber es hält Dich nix davon ab, die Pickup-Position in Deinem Editor (bestenfalls: optional) auf das Tilegrid auszurichten.

M0rgenstern hat Folgendes geschrieben:
Jedenfalls gilt das, wenn man die Pickups vorher auf der Karte verteilt. Sollte es jetzt eher darum gehen, Pickups während dem Spielverlauf zu erstellen (Gegner die diese "droppen") dann ist deine Lösung natürlich die Bessere.

Das Verteilen der Pickups ist immer gleich schwer bzw. einfach. Und - wie Du selbst erkannt hast ^^ - ist Droppen für die Layermethode nicht so schön umsetzbar. *g*

Zitat:
Aber mehrere Layer braucht man bei sowas schon.
Mindestens einer für Kollision und einer für die Tiles selbst.

"Brauchen" tut man ansich überhaupt keinen Layer. Ein Array ist nur meist die einfachste Wahl (und okay oft auch die beste ^^), aber das heisst noch lange nicht, dass man es "braucht". Und was dagegen spricht, sowohl Grafik als auch Kollision in einem einzelnen Array unterzubringen, musst Du mir mal erklären. Rolling Eyes (ja, mir ist durchaus bewusst, dass man das machen kann - aber auch das "muss" man nicht)
 

Razor1994

BeitragFr, Mai 07, 2010 10:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Sry das ich eure Diskussion unterbreche, aber ich habe mich entschieden es vorläufig mit rectsoverlap zu machen. Und es funktioniert jetzt einwandfrei.
User posted image
kommt in meinen Runescape clan

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group