Problem mit Sprites

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Kurono
Beiträge: 44
Registriert: 28.10.2006 15:03
Wohnort: Mineral Town
Kontaktdaten:

mhm.......

Beitrag von Kurono »

Also, die Version, die ich von BMP2MAP gefunden habe, zeigt mir halt sone Fehlermeldung an, dass die mapgröße nur 700irgendwas mal sonstwas sein kann, und das ist für mich definitiv ZU KLEIN.
Die Anspielung darauf, dass ich nicht wüsste, wie ich in paint die BMP-Größe verändern kann ist ja wohl...... naja..... wer benutzt schon paint? da gibts ja wohl nun echt andere, bessere programme! aber das sein nun dahingestellt, von grafiken braucht mir keiner was zu erzählen, ich versuch ja nur die handhabung derselben auf pure basic zu lernen! nebenbei würde ich auch echt mal einen kleinen codeschnipsel zum thema objekte sehen!

Sorry, ich will bloß einfach nicht als "absolute beginner" rüberkommen, nur weil ich mich nun mal in die tieferen tiefen der programmierung begeben möchte!
Ich will halt einfach mal ein anspruchsvolleres prog schreiben! :?
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

achso, ok.. ja jetzt entsinne ich mich...
ok, das hatte ich vergessen, streiche mein letztes posting.
das liegt einfach daran, dass ich damals direkt aus nem screen gelesen hab,
und der ist in dem beispiel auf 1024x768 begrenzt.

eigentlich ist bmp2map auch nur ne krücke,
damit man schonmal was mit ner map machen kann,
ohne sich nen editor schreiben zu müssen.

aber eigentlich sollte man sich sowieso nen richtigen editor schreiben.


du kannst dir bmp2map umstricken wenn du willst:
- nimm den screen komplett raus
- lad die grafik in ein image
- änder beim startdrawing auf imageoutput
dann hast du die begrenzung bei der imagegröße,
und die ist 8192x8192 wenn ich mich recht entsinne....

PS:
> wer benutzt schon paint?

ich zum bleistift?

zum pixeln ist es völlig ausreichend,
und um irgendwelche vorab-maps zu erstellen die man per bmp2map umwandeln kann auch.

ich meine, welches programm würdest du zum mal-eben-was-pixeln benutzen?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Kurono
Beiträge: 44
Registriert: 28.10.2006 15:03
Wohnort: Mineral Town
Kontaktdaten:

hmmm.. ja!

Beitrag von Kurono »

:mrgreen: naja, stimmt, zum pixeln ists echt genial, weils so einfach ist!

so, also das mit den objekten hab ich nun voll im griff, nur das mit der tilemap will noch nicht ganz hinhauen, es läuft zwar, aber langsam!
folgendes:
--------------------------
ich habe eine große bmp-map in viele kleine stücke zerlegt, einzelne sprites also, und habe ihnen objekte zugewiesen, damit sie eigenschaften kriegen, wie position, bild, passablität usw....
diese hab ich dann im repeat 4ever anzeigen lassen, je nach position und nummer!
das ganze läuft allerdings bestimmt nicht schneller, als wenn ich ein großes bmp nehme(wenn ich die karte bewege, stockelt es ziemlich)!
woran liegt das? oder bin ich völlig aufm falschen weg?

ansonsten mach ich echt fortschritte! ich hab mir bisher immer das programmieren selbst beigebracht, angefangen hat es mit dem
"game maker" :D so ein billiges, dennoch vielseitiges programm hatte ich seitdem nicht mehr, alledings ist es eine 50\50 drag&drop\script sprache, das hat mich dann schon genervt! naja, egal!

wer war denn bloß alles auf meiner seite? da sind angeblich 80 besucher bisher!!!! :o
und das, obwohl sie doch erst im bau ist!

-------------------------------------------------------------------------------
Noch was: ich hab nun schon öfter tilemap-sys's von anderen gesehen, die benutzen ja nur das:

dim map(1000,1000)

for x = 0 to 1000
for y = 0 to 1000
display sprite(map(x,y),x,y)
next y
next x

so, schön und gut, aber ich will ja auch jedem einzelnem tile eine eigenschaft zuweisen: ob man drüberlaufen kann, ob die pflanze gegossen ist(was sich auf die imagenummer auswirkt), usw...
nimmt das zuviel speicher in anspruch, oder hab ich irgendwo den wurm drin?
ist vielleicht irgendwas zu umständlich? :?
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

also, eigenschaften kannst du zuweisen, wenn du ne structure verwendest:

Code: Alles auswählen

Structure Tile
  Sprite.w
  Passable.b
  Transform.b
  Blinky.b
  Charm.b
  Beauty.b
EndStructure

Dim Map.Tile(1023,1023)
da kannst du irgendwelche eigenschaften reinschreiben, die du brauchst,
hab jetzt mal willkürliche begriffe verwendet.

darstellen wie üblich:

Code: Alles auswählen

For SX=0 To 25
  For SY = 0 To 19
    DisplaySprite( Map( MapX + SX, MapY + SY )\Sprite , 32 * SX, 32 * SY )
  Next
Next
beachte bitte, dass ich nur einen ausschnitt darstelle, der so groß wie der screen ist.
(hier 26/20, für 32x32 tiles auf nem 800x600 screen)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Kurono
Beiträge: 44
Registriert: 28.10.2006 15:03
Wohnort: Mineral Town
Kontaktdaten:

Beitrag von Kurono »

Code: Alles auswählen

;;
;; das ist ein tilemaptest, der leider noch nicht so gan(t)z hinhauen will




InitSprite()
InitKeyboard()

OpenScreen(800,600,16,"Harvest Sunshine")

trigger1 = 0
maxtiles_x = 16/2
maxtiles_y = 11/2    


CreateImage(1,2000,2000)
StartDrawing(ImageOutput())

LoadSprite(20000,"map_farm1.bmp")

DisplaySprite(20000,0,0)

Structure tile
tilex.w
tiley.w
tilepic.w
tilename.s
EndStructure

Dim plate.tile(maxtiles_x,maxtiles_y) ; hiermit wird das array erstellt, welches einzelne
                    ;  eigenschaften eines jeden tiles beinhaltet!


;; also, die forschleife ist nur da, um das bitmap zu splitten und objekte davon
;; zu machen!
For x = 0 To maxtiles_x ; mit der max beschreibe ich die max tiles, die da sind! (^= 800p)
For y = 0 To maxtiles_y
GrabSprite(trigger1,x*50,y*50,(x*50)+50,(y*50)+50)

plate(x,y)\tilepic = trigger1
plate(x,y)\tilex = x*50
plate(x,y)\tiley = y*50

trigger1 = trigger1+1
Next y
Next x

trigger1 = 0

; und entfernen das riesenbitmap!
FreeSprite(20000)

;wieder alles aufm screen zeichnen und tun und machen und so....
StopDrawing()
StartDrawing(ScreenOutput())

Repeat          ;; soooooooooooooo, die schleife!!!
ExamineKeyboard()
FlipBuffers()
ClearScreen(0,0,0)

;; das ist die mapsteuerung
 If KeyboardPushed(#pb_key_left)
  my_x = my_x-5
 EndIf
 
 If KeyboardPushed(#pb_key_right)
  my_x = my_x+5
 EndIf
 
 If KeyboardPushed(#pb_key_down)
  my_y = my_y+5
 EndIf
 
 If KeyboardPushed(#pb_key_up)
  my_y = my_y-5
 EndIf

;; damit werden die einzelnen tiles nacheinader angezeigt
For mapx = 0 To maxtiles_x
For mapy = 0 To maxtiles_y
DisplaySprite(plate(mapx,mapy)\tilepic,(mapx*50)-my_x,(mapy*50)-my_y)
Next mapy
Next mapx









Until KeyboardPushed(#pb_key_escape)




so, das ist der code, das bitmap einfach durch ein 800x600 pixel großes bmp ersetzten (dateinamen auch....) und dann mal austesten!!!

warum funktioniert grabSprite nicht ausserhalb vom bildschirm?

das nervt mich jetzt voll an, ich tret echt voll auf der stelle!

und wenn man die max tiles x am anfang auf einen weniger reduziert, dann läufts zwar, aber langsam, bis man mit den cursortasten das bild ein bisschen an den rand schiebt: dann läufts wie geschmiert!!! woran liegt das bloß??? :cry:
PB 3.94
Harvest Moon 4Ever!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> warum funktioniert grabSprite nicht ausserhalb vom bildschirm?

is doch logisch, weil es etwas aus dem screen-buffer ausliest,
und außerhalb des screens ist kein screen... ;)

deine denkweise ist irgendwie am problem vorbei.

eigentlich benutzt man tiles, weil die gesamte karte aus wiederkehrenden strukturen zusammengesetzt ist.

schau mal hier rein:
http://www.purebasic.fr/german/viewtopi ... 634#116634
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
#NULL
Beiträge: 2239
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

@kurono :shock:
nach einem Startdrawing( ImageOutpu() ) kann man trotzdem kein DisplaySprite() auf das image anwenden, und stukturen und arrays sollte man wirklich nicht im Start/StopDrawing()-block definieren. (u.s.w.u.s.f)

für Kaeru Gamans demo code, kannst du auch das hier verwenden, um sein bild als ganzes zu laden:

Code: Alles auswählen

;##################################
; For n=1 To 8
;   LoadSprite( 100+n, Right("00"+Str(n),3)+".bmp")
; Next
;##################################
UsePNGImageDecoder()
LoadImage(0,"tileset01yi0.png")
For n=1 To 8
  CreateSprite(100+n, 16,16)
  StartDrawing(SpriteOutput(100+n))
    DrawImage(ImageID(0), -(n-1)*18-2, -2)
    ;Circle(7,7,5,$00ff00)
  StopDrawing()
Next
;##################################
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag von dllfreak2001 »

@Kurono
1.
Du solltest dir ein Tileset machen, keine Riesige BMP der MAP.
Dazu nimmst du entweder die Methode mit der einen Grafik aus der
man die einzelnen Bilder rausschneidet (Im Programm) oder die enfachere Methode, indem du jede einzelne Grafik einzeln abspeicherstund die dann reinläds

Code: Alles auswählen

loadsprite(1,Sand.bmp)
loadsprite(2,Dreck.bmp)
loadsprite(3,Wasser.bmp)
loadsprite(4,Grass.bmp)
Das wäre sowas wie ein Tileset.

2.
Die Map soll aus diesen Grafiken zusammengesetzt werden, und zwar im
Programm und nicht schon vorher per Malprogramm.
Eine Map würde ungefähr so aussehen.
zB. per 2D-Array


Code: Alles auswählen

(9x9) => hier => Dim Map.b(8,8)

3-3-3-3-2-1-1-4-4
3-3-3-2-1-1-4-4-4
3-2-1-1-1-4-4-1-1
2-2-1-1-1-1-4-4-4
2-1-1-1-4-4-4-4-4
1-4-4-4-4-4-4-4-4
4-4-4-4-4-4-4-4-4
4-4-4-4-2-4-4-4-4
4-4-4-2-2-2-2-4-4
Die Ziffern stehen dabei für eine Sprite-ID aus Punkt 1.

3.
Du musst die Grafiken ausgeben und zwar so, dass die nicht sichtbaren Tiles auch nicht angezeigt werden.
Das obige Array gibst du dann so aus
Hier ohne das nicht sichtbare Grafiken nicht angezeigt werden, weil
bin faul.
Mit jedes Sprite ist 32x32Pixel groß

Code: Alles auswählen

startdrawing(screenoutput())
for x = 0 to 8:for y = 0 to8
displaysprite(Map(x,y),x*32-Playerposx ,y*32-Playerposy)
next:next
stopdrawing()


=> Wie du siehst wiederholen sich in der map die einzelnen Tiles.
Das hält den Speicherbedarf deines Programms klein und du brauchst nicht jedesmal die Map per Hand in eine Grafikprogramm selbstmalen.
bmp2map erzeugt aus dem Leveleditorkramm eine Bitmap mit RGB-Werten dabei steht jeder RGB-Wert für eine SpriteID.

Meine Map stellt eine kleine Graslandschaft dar in deren linken oberen Ecke ist ein kleiner See. Der einen hübschen Sandstrand hat.
I´a dllfreak2001
Benutzeravatar
Kurono
Beiträge: 44
Registriert: 28.10.2006 15:03
Wohnort: Mineral Town
Kontaktdaten:

Thanxxxxxxxxxxxxxxxxxxx

Beitrag von Kurono »

:allright: SUPER!!!
Echt vielen dank für die hilfe, und entschuldigung, dass ich euch mit so vielen fragen bombardiere! aber ich will einfach ein bisschen mehr als nur die üblichen kleinen progrämmchen schreiben, und dazu muss ich wohl noch viel lernen !
(zitat aus golden boy: "mann, da hab ich ja noch jede menge zu lernen!")

Ich probiers gleich mal aus, mal sehen, krieg ich bestimmt hin!

und-achso: das mit den einzelnen tiles aus nem tileset laden ist schlecht, bei dem, was ich vorhabe, da das spiel sehr detaillreiche tilesets und somit auch maps hat\haben soll. also komm ich wohl nicht drumherum, ein fertiges bmp oder png ect. zu nehmen. zumal ich ja auch schon einen richtig geilen map-editor gefunden habe, mit dem es einfach schneller geht, maps zu erstellen!

aber wie gesagt: wirklich vielen dank für die hilfe!
PB 3.94
Harvest Moon 4Ever!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> also komm ich wohl nicht drumherum, ein fertiges bmp oder png ect. zu nehmen.

du MUSST sogar drumrum kommen,
oder willst du ne 512MB-Graka als mindestanforderung angeben?

es gibt KEIN spiel aufm markt, das ne 2D Map als komplette grafik reinhaut,
das sind alles tilemaps, immer und überall.

oder wie meinst du das jetzt? o_O
irgendwie hab ich grad den eindruck, ich hab dich falsch verstanden...


> zumal ich ja auch schon einen richtig geilen map-editor gefunden habe, mit dem es einfach schneller geht, maps zu erstellen!

da würd ich ebenso drauf wetten, dass das ein tile-map-editor ist.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten