Wie könnte ich am besten anfangen..??

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

x_to

Betreff: Wie könnte ich am besten anfangen..??

BeitragMo, Mai 09, 2005 12:07
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo erstmal..ich hoffe ich kann bei euch hier etwas hilfe finden...Wink

also:

ich würde gern ein programm schreiben das folgende möglichkeiten bietet:

1. eine datei mit maptiles laden, wobei jedes tile exakt hinter dem anderem liegt...-> bitmaplänge = anzahl maptiles*tilebreite/bitmaphöhe = maptilehöhe

2. danach sollte das programm eine datei lesen, worin wahlweise byte- als auch wordweise die werte ausgelesen werden sollten

3. danach den maptiles jeweils den gerade ausgelesen byte/word wert auf dem bildschirm zuordnen....

d.h.: datei(1.byte) = 95 ----> maptile nr.95 auf dem bildschirm bringen
das ist eine art levelmap, die aber nicht von mir stammt...

4. sollte die datei erfolgreich auf den bildschirm gebracht sein, dann soll wahlweise die möglichkeit bestehen den maximalen x wert zu verändern...dann eben das ganze spiel von vorn...

ich hab da auch schon was angefangen:

BlitzBasic: [AUSKLAPPEN]

tilebreite = 16
tilehoehe = 16
tileanzahl = 400
screenbreite = 800
screenhoehe = 600
posx = 0
posy = 0
Levelbreite = 0
Levelhoehe = 0

map = OpenFile (\"levelmap\")

Graphics 800,600,16,3
tilemap = LoadAnimImage(\"tilemap\",tilebreite,tilehoehe,0,tileanzahl)






Repeat ;schleife hauptprogramm
If KeyHit (205)
Levelbreite = Levelbreite + tilebreite

EndIf

If KeyHit (203)
Levelbreite = Levelbreite - tilebreite
If Levelbreite =< 0 Then
Levelbreite = 0
EndIf
EndIf

If KeyHit (208)
Levelhoehe = Levelhoehe + tilehoehe
EndIf

If KeyHit (200)
Levelhoehe = Levelhoehe - tilehoehe
If Levelhoehe =< 0 Then
Levelhoehe = 0
EndIf
EndIf

Print levelbreite
Print levelhoehe

Until KeyHit (1)




ist wie gesagt erst nur ein kleines bißchen, aber was sollte ich als nächstes tun..???

wofür ich das brauch könnte ich auch erklären, wenn es denn jemanden interessieren würde... Rolling Eyes

ich danke euch schon mal... Wink

Hubsi

BeitragMo, Mai 09, 2005 12:29
Antworten mit Zitat
Benutzer-Profile anzeigen
map = OpenFile ("levelmap") -> Das wird nirgends gebraucht? Überbleibsel vielleicht? Very Happy Eine Tilemap ist nicht das einfachste was man machen kann, aber wenn Du dazu entschlossen bist würde ich das ganze anders anpacken. Leg ein Array an mit der Größe der Map in Tiles. Darein lädst Du dann mit zwei For-Schleifen die Tilenummern, ungefähr so:
BlitzBasic: [AUSKLAPPEN]
For y=0 To 40
For x=0 To 80
map(x,y)=ReadByte(file_handle)
Next
Next
Ob Du dabei die Werte als Byte oder Short speicherst hängt von der vorraussichtlichen max. Anzahl Tiles ab, bzw. die Größe der Nummern mit denen Du arbeiten willst (wenn ich das so lese glaub ich selbst nicht das man diesen Satz verstehen kann Very Happy ). Deine Tiles werden üblicherweise als einzelne durchnummerierte *.bmp gespeichert (in Array laden) oder in einem Animimage, ist wohl Geschmackssache Very Happy Das malen geht ähnlich:BlitzBasic: [AUSKLAPPEN]
For y=0 To 40
For x=0 To 80
DrawImage tile(map(x,y)),x*32,y*32 ; bzw. den frame bei animimage
Next
Next
Am besten wäre es noch nur immer den Teil zu malen den man auch wirklich sieht (wenn scrolling eingebaut wird), aber da darfst Du selbst ran Very Happy Schwer ist das auch nicht Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...
 

getlose

BeitragMo, Mai 09, 2005 15:45
Antworten mit Zitat
Benutzer-Profile anzeigen
hier mal ein lösungsweg von mir. kannst du nat. noch erweitern,
zb. mehrere layers etc.

BlitzBasic: [AUSKLAPPEN]

;* Global's

;Mauskkordinaten
Global mx,my,old_mx,old_my
;Maustasten
Global mhit_left,mhit_right,mhit_middle,mdown_left,mdown_middle,mdown_right
;Grafikmodus
Global wx=320,wy=240,cd=16,wm=2
;Map-Daten
Global map_width,map_height,map_px,map_py,map_dx,map_dy
;Tiles
Global tiles
;Map editieren
Global actual_tile=3


;* Dim's

;Tilemap
Dim tile_map(0,0,0)


;* Funktions-Infos

;get_mouse = ruft koordinaten und tasten der maus ab
;flush_mouse = flusht die maus (löscht alte werte)
;create_tile_map = dimensioniert das tile-array und füllt es mit standart-werten
;load_tileset = lädt anhand einer pfadangabe ein tile-set
;draw_tile_map = zeichnet die karte
;edit_tile_map = zum bearbeiten der tiles
;scroll_map = map scrollen



Graphics wx,wy,cd,wm



create_tile_map(100,100,2)
load_tileset(\"tiles.png\")


SetBuffer BackBuffer()
While Not KeyHit(1)
Cls
get_mouse()



If mdown_left=1 Then
edit_tile_map()
EndIf

draw_tile_map()

scroll_map()



flush_mouse()
Flip
Wend

Function get_mouse()
mx=MouseX()
my=MouseY()
If MouseDown(1) Then
mdown_left=1
EndIf
If mdown_left=1 Then
If MouseDown(1)=0 Then
mhit_left=1
EndIf
EndIf

If MouseDown(2) Then
mdown_right=1
EndIf
If mdown_right=1 Then
If MouseDown(2)=0 Then
mhit_right=1
EndIf
EndIf

If MouseDown(3) Then
mdown_middle=1
EndIf
If mdown_middle=1 Then
If MouseDown(3)=0 Then
mhit_middle=1
EndIf
EndIf
End Function


Function flush_mouse()
mdown_left=0
mhit_left=0
mdown_right=0
mhit_right=0
mdown_middle=0
mhit_middle=0
old_mx=mx
old_my=my
FlushMouse()
End Function


Function create_tile_map(width,height,default_tile)
Dim tile_map(width,height,1)
For x=0 To width
For y=0 To height
tile_map(x,y,0)=default_tile
Next
Next
map_width=width
map_height=height
End Function


Function load_tileset(path$)
tmp=LoadImage (path$)
tmp_width=ImageWidth(tmp)/8
tmp_height=ImageHeight(tmp)/8
FreeImage tmp
tiles=LoadAnimImage (path$,8,8,0,(tmp_width*tmp_height))
End Function


Function draw_tile_map()
For x=map_px To map_px+(wx/8)
For y=map_py To map_py+(wy/8)
If Not x+(wx/8)>map_width-1 Then
If Not y+(wy/8)>map_height-1 Then
If Not tile_map(x,y,0)=0 Then
DrawImage tiles,((x-map_px)*8)+map_dx,((y-map_py)*8)+map_dy,tile_map(x,y,0)
EndIf
EndIf
EndIf
Next
Next
End Function


Function edit_tile_map()
For x=map_px To map_px+(wx/8)
For y=map_py To map_py+(wy/8)
If RectsOverlap (mx,my,1,1,((x-map_px)*8)+map_dx,((y-map_py)*8)+map_dy,8,8) Then
tile_map(x,y,0)=actual_tile
EndIf
Next
Next
End Function


Function scroll_map()
If KeyDown(203) Then map_dx=map_dx+2
If KeyDown(205) Then map_dx=map_dx-2
If KeyDown(200) Then map_dy=map_dy+2
If KeyDown(208) Then map_dy=map_dy-2
If map_dx>8 Then map_dx=2 : map_px=map_px-1
If map_dx<0 Then map_dx=6 : map_px=map_px+1
If map_dy>8 Then map_dy=2 : map_py=map_py-1
If map_dy<0 Then map_dy=6 : map_py=map_py+1
If map_px<0 Then map_px=0
If map_py<0 Then map_py=0
If map_px>map_width-(wx/8) Then map_px=map_width-(wx/8)
If map_py>map_height-(wy/8) Then map_py=map_height-(wy/8)
End Function


und das "tileset" Smile

user posted image
 

x_to

BeitragMo, Mai 09, 2005 17:17
Antworten mit Zitat
Benutzer-Profile anzeigen
ich danke euch erstmal und werde das alles probieren...wenns nicht klappen sollte, melde ich mich gerne wieder hier..Wink
 

x_to

BeitragMo, Mai 09, 2005 20:19
Antworten mit Zitat
Benutzer-Profile anzeigen
ok, danke für all die mühe, aber leider waren die listings nicht ganz das, was ich suchte...

lag wohl daran, daß ich das alles etwas falsch erklärt habe...

ich versuchs mal besser:

erstmal hintergrund der ganzen geschichte..:


ich bräuchte solch ein tool um gamemaps von längst vergangener spiele zu erstellen..um genau zu sein von amiga spielen...
vielleicht errinnert ihr euch noch an perlen wie turrican, giana sisters (gibts übrigends mittlerweile als javagame für handys)...
und genau von diesen spielen würde ich gamemaps rippen wollen.
schon damals wurde ja die "kastentechnik" auf dem amiga angewandt, folglich sollte es ein leichtes sein (dachte ich erst) von kompletten memorydumps und den dazugehörigen maptiles solch eine gamemap zu erstellen.
für die maptiles existiert mittlerweile solch ein tool, womit es möglich ist aus diesen memorydumps die tiles zu rippen...

nun kam mir die idee eben gamemaps zu erstellen...

da dachte ich an folgende vorgehensweise:


1. man muß wissen wieviele maptiles vorhanden sind um zu wissen ob die dazugehörigen adressen byteweise (max. $FF => 255) oder wordweise (max. $FFFF => 65535) zugeordnet werden. longwords wurden mit sicherheit nie verwendet
2. wir wissen nun, daß z.B. byteweise alle tileadressen abgelegt wurden
3. der memorydump wird byteweise gelesen und der entsprechend gelesen wert wird durch das maptile graphisch dargestellt...d.h. alle zahlen werden durch grafiken ersetzt..Wink
4. da solch eine gamemap mit höchster wahrscheinlichkeit größer wie der bildschirm sein wird sollte scrolling vorhanden sein.
5. anfangs ist es auch noch nicht möglich wieviele tiles auf der x achse und wieviele auf der y achse sind, d.h. ein arrayerstellen würde nix bringen, es sei denn es ist in der größe variabel..
6. dazu dachte ich daß wenn man z.B. den right arrow key drückt das array um eine tilebreite vergrößert wir und in diesem tile das erste aus der 2. reihe dorthin gezeichnet wird...
7. simultan dazu sollte es sowohl in y richtung als auch in umgekehrter reihenfolge(verkleinern) klappen

ok,das alles scheint momentan sehr kompliziert zu sein, aber ihr seid doch alle fähige männer die das hinkriegen würden...
ich könnte noch vieles über die technik des amiga erzählen, aber das bringt hier wohl auch nicht viel weiter, und ja ich weiß auch daß die ganze sache sehr rechenintensiv wird...
aber ich denk blitzbasic sollte in der lage sein sowas zu bewältigen..Wink

wäre nett wenn ich etwas hilfe bekommen würde...[img][/img]

Alfadur

BeitragMo, Mai 09, 2005 20:37
Antworten mit Zitat
Benutzer-Profile anzeigen
"wir wissen nun, daß z.B. byteweise alle tileadressen abgelegt wurden "

z.b.?? wir müssen es nicht nur vielleicht wissen, das ist eigentlich das einzige was du wissen mußt. wenn du weißt wie das level aufgebaut ist dann ist der rest einfach. aber wieviel layer hat so ein level, wie wirds gespeichert? schätzungsweise ist level und tileset in zwei verschiedenen files gespeichert...
A Cray is the only computer that runs an endless loop in less than four hours.
 

x_to

BeitragMo, Mai 09, 2005 21:39
Antworten mit Zitat
Benutzer-Profile anzeigen
das tileset ist ja als bmp datei verfügbar und wenn es weniger wie 255 tiles sind, dann sind sie byteweise abgelegt...

das tool sollte in erster linie dazu dienen grafisch zu ermitteln wie hoch und wie breit das level ist...und wenns möglich wäre auch an welcher position im speicher...Wink

layer gibts beim miga übrigends nicht..Wink

höchstens playfields und die betragen max. 2...Wink
das tileset wurde vorher übrigends schon aus dem speicher gerippt..Wink

Alfadur

BeitragMo, Mai 09, 2005 21:56
Antworten mit Zitat
Benutzer-Profile anzeigen
ich schätze nicht das du höhe ohne länge und die länge ohne höhe rauskriegen wirst. wenn das byteweise gespeichert wird, ist ja die größe der datei die anzahl der dargestellten tiles. was aber sicher nicht hinkommt, weil irgendwo ja auch die gegner etc gespeichert werden, und die powerups und was es nicht noch alles gibt ...
also wird das auch schon nicht stimmen.
was du machsten könntest, denk ich mir, schau dir die tiles an, schau dir das level an und dann schreib mal die nummern der ersten tiles aneinander und such dann einfach nach der bytefolge... könnte vielleicht gehen ...
A Cray is the only computer that runs an endless loop in less than four hours.
 

x_to

BeitragDi, Mai 10, 2005 21:48
Antworten mit Zitat
Benutzer-Profile anzeigen
ich hab mit bb ein bißchen weiter geübt und das mittlerweile erstellt...

ich würde nur gern jetzt das bild in alle richtungen scrollen...

BlitzBasic: [AUSKLAPPEN]

scrwidth = 800


plwidth = 0

Print plwidth

Graphics scrwidth,600,16,2
tilemap = LoadAnimImage (\"einebmpdatei.bmp\",16,16,0,400)
mapfile = OpenFile (\"binaerdatei\")


.hauptroutine
While Not KeyHit (1)


Gosub mapdraw
Wend




.mapdraw
While Not Eof (mapfile)
DrawImage (tilemap,plwidth,yoff,ReadByte (mapfile))
plwidth = plwidth + 16
If plwidth + 16 => scrwidth Then
yoff = yoff + 16
plwidth = 0
EndIf
Wend
WaitKey
 

hitokiri

BeitragDi, Mai 10, 2005 21:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Uff...also dazu müssten man erstmal wissen, wie dein mapfile aussieht. Also...zeichnest du jedesmal die ganze map, die eventuell grösser als 800x600 ist ? bzw. wie gross ist deine map überhaupt ?

Alfadur

BeitragDi, Mai 10, 2005 22:01
Antworten mit Zitat
Benutzer-Profile anzeigen
naja, das hinmalen scheint ja schon zu funktionieren... wenn du scrollen willst mußt du nur zum x und y noch ein offset dazurechnen ... und das dann bei tastendruck veringern oder vergrößern...
A Cray is the only computer that runs an endless loop in less than four hours.
 

x_to

BeitragMi, Mai 18, 2005 6:54
Antworten mit Zitat
Benutzer-Profile anzeigen
ok, abgesehen von den oben misslungenen versuchen hab ich fast von vorn wieder angefangen..und es beginnt langsam spass zu machen... Rolling Eyes

allerdings hab ich jetzt das problem daß ich kein screenshot (nicht bildschirm, sondern die ganze karte) erstellen kann...siehe subroutine mapsave

BlitzBasic: [AUSKLAPPEN]
levelbreite = 2048
levelhoehe = 0
tilebreite= 16
tilehoehe = 16

Graphics 1024,768,16,2
tilemap = LoadImage (\"c:\1.bmp\")
mapfile = OpenFile (\"c:\level2\")

Gosub mapdraw


.hauptroutine
While Not KeyHit (1)

If KeyHit (205)
SeekFile (mapfile,0)
levelbreite = levelbreite + tilebreite
levelyoff = 0
Cls
Gosub mapdraw
EndIf

If KeyHit (203)
SeekFile (mapfile,0)
levelbreite = levelbreite - tilebreite
levelyoff = 0
Cls
Gosub mapdraw
EndIf

If KeyHit (2) Gosub mapsave
Wend
End



.mapdraw
While Not Eof (mapfile)
byte = ReadByte (mapfile)
DrawImageRect tilemap,levelxoff,levelyoff,(byte*tilebreite),0,tilebreite,tilehoehe
levelxoff = levelxoff + tilebreite
If levelxoff => levelbreite Then
levelyoff = levelyoff + tilehoehe
levelxoff = 0
EndIf
Wend
Return


.mapsave

bild = CreateImage (levelbreite,levelyoff)
SetBuffer ImageBuffer (bild)
Gosub mapdraw
SaveBuffer ImageBuffer(bild), \"c:\screenshot.bmp\"
Return


das teil funktioniert so:

erst wird ein tilemap geladen, worin alle tiles in einer reihe liegen
dann wird eine binärdatei geladen
jedes byte wird gelesen und durch "bytewert*tilebreite" ein tile zugewiesen..
anschließend wird das auf den bildschirm gebracht...
das alles passiert in echtzeit und die levelbreite ist per arrowkeys jederzeit änderbar...

nur mit dem screenshot der ganzen datei hab ich probleme....d.h. ich weiß nicht ob der imagebuffer wirklich richtig angesprochen wurde... Question

hier die dazugehörigen dateien:

http://xto.funpic.de
 

x_to

BeitragDo, Mai 19, 2005 7:23
Antworten mit Zitat
Benutzer-Profile anzeigen
auch ein saveimage statt savebuffer funktioniert nicht...

ich nutze blitz 2D 1.10

ist das noch ein bug..??

Jan_

Ehemaliger Admin

BeitragDo, Mai 19, 2005 8:35
Antworten mit Zitat
Benutzer-Profile anzeigen
hm, update es erstmal, 1.10 ist eine sehr alte Version!
between angels and insects
 

x_to

BeitragDo, Mai 19, 2005 21:49
Antworten mit Zitat
Benutzer-Profile anzeigen
momentan arbeite ich nur mit der demoversion von blitz2d...bestellt ist blitzplus aber mittlerweile...

ich wüßte gern ob es in nachfolgenden versionen funktioniert oder nicht... Wink

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group