Map wird gestreckt[Erledigt]

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Affenmann

Betreff: Map wird gestreckt[Erledigt]

BeitragDo, Jul 20, 2006 18:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo
Habe folgendes Problem:
Ich habe einen Mapeditor geschrieben und kann die maps auch laden / speichern. Jedoch ist seitdem ich Charakter Speichern / Laden eingebaut habe meine Map immer so komisch gestreckt. Ich Speicher die Map im Mapeditor normal ab. Dann kann ich sie laden mit dem Mapeditor ohne Probleme. Aber im Spiel Lade ich die Map mit genau den gleichen Befehlen und nun wird sie abergestreckt....
Hoffe konnte klar machen was ich meine. Da der Code inzwischen recht langgeworden ist mache ich nur ein paar code schnippsel.

Speichern im Mapeditor:

Code: [AUSKLAPPEN]

If KeyHit(60) Then
dateiname$=Input$("Speichernamen angeben: ")
speichern=WriteFile(Dateiname)
WriteByte speichern,mapx
WriteByte speichern,mapy
For y=0 To mapy
For x=0 To mapx
For z=0 To event
WriteByte speichern,map(x,y,z)
Next
Next
Next

CloseFile speichern
End If


Laden im Mapeditor:
Code: [AUSKLAPPEN]

If KeyHit(61) Then
dateiname$=Input$("Ladenamen angeben: ")
If FileType(dateiname)=1 Then
laden=ReadFile(dateiname)
mapx=ReadByte(laden)
mapy=ReadByte(laden)
For y=0 To mapy
For x=0 To mapx
For z=0 To event
map(x,y,z)=ReadByte(laden)
Next
Next
Next

CloseFile laden
End If
End If


Laden im Spiel:

Code: [AUSKLAPPEN]

dateiname$="Startdorf.map"
If FileType(dateiname)=1 Then
laden=ReadFile(dateiname)
mapx=ReadByte(laden)
mapy=ReadByte(laden)
For y=0 To mapy
For x=0 To mapx
For z=0 To event
map1(x,y,z)=ReadByte(laden)
Next
Next
Next

CloseFile laden
End If


Map zeichnen im Spiel:
Code: [AUSKLAPPEN]

For y = 0 To mapy
For x = 0 To mapx
DrawBlock Boden1,x*16-scrollx,y*16-scrolly,Map1(x,y,0)
Next
Next


MfG Affenmann
  • Zuletzt bearbeitet von Affenmann am Fr, Jul 21, 2006 23:46, insgesamt 2-mal bearbeitet

Kabelbinder

Sieger des WM-Contest 2006

BeitragDo, Jul 20, 2006 21:11
Antworten mit Zitat
Benutzer-Profile anzeigen
sind die Werte für mapy, mapx und event im Spiel die gleichen, wie im Mapeditor?
Werden sie auch in die .map-Datei gespeichert?
<Wing Avenger Download> ◊◊◊ <Macrophage Download>
 

Affenmann

BeitragDo, Jul 20, 2006 21:17
Antworten mit Zitat
Benutzer-Profile anzeigen
jap sind die gleichen und werden auch abgespeichert

5k41

BeitragDo, Jul 20, 2006 22:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!
Bei Mapx und Mapy ist das richtig, aber event wird nicht ausgelesen und gespeichert! Du müsstest sonst beim schreiben :
Code: [AUSKLAPPEN]

WriteByte speichern,mapx
WriteByte speichern,mapy
[b]WriteByte speichern,event[/b]
For y=0 To mapy
For x=0 To mapx
For z=0 To event
WriteByte speichern,map(x,y,z)

das und beim lesen:
Code: [AUSKLAPPEN]

mapx=ReadByte(laden)
mapy=ReadByte(laden)
[b]event=ReadByte(laden)[/b]
For y=0 To mapy
For x=0 To mapx
For z=0 To event

schreiben... ansonsten fällt mir grad nix auf...

MfG
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image
 

Affenmann

BeitragDo, Jul 20, 2006 22:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm
Ne das is richtig so wie es da steht... Die map wird ja gespeichert...
MapX und MapY sind einzelnde Variablen.

Event wird mit im Dim feld gespeichert.

Das Problem ist ja, dass es am anfang perfekt geklappt hat.
Als ich dann bischen am Menü rumgefummelt hab dass man Charakter erstellen und speichern kann lief plötzlich die Map nich mehr richtig. Und wie du siehst wird im Mapeditor und im Spiel die Map auf die gleiche weise gestartet. Und im Mapeditor wird alles richtig dargestellt und auch die events sind da : /

Naja danke das du dir das mal angeschaut hast Wink

Ich guck mal weiter ob ich das Problem entdecke.. sitze jetzt schon über einer Stunde dran ; (

MfG
 

Affenmann

BeitragFr, Jul 21, 2006 3:44
Antworten mit Zitat
Benutzer-Profile anzeigen
puh habs hinbekommen.

Nun steh ich vor einem weiteren Problem (hehe keine sorge habe jetzt nich über 3 stunden nach dem fehler gesucht... konnte nur nich schlafen weils so warm ist :/ )

Und zwar werden meine Ratten nur angezeigt wenn ich das in jedem schleifen durchlauf testen lasse ob sie da sind.

Doch das möchte ich garnicht....

funktioniert nicht...
Code: [AUSKLAPPEN]

Dim Ratte.Monster(zahlen)

For s = 1 To zahlen
Ratte(s)=New Monster
Next

For y=0 To mapy
For x=0 To mapx
For s=1 To zahlen
If map1(x,y,1)=2 Then
ratte(s)\locx=x*16
ratte(s)\locy=y*16
End If
Color 255,255,255
Next
Next
Next

Repeat
....
For s=1 To zahlen
DrawImage Ratteset,Ratte(s)\Locx-scrollx,Ratte(s)\Locy-scrolly,0
Next
....


klappt:...
Code: [AUSKLAPPEN]


Dim Ratte.Monster(zahlen)

For s = 1 To zahlen
Ratte(s)=New Monster
Next

Repeat


For y=0 To mapy
For x=0 To mapx
For s=1 To zahlen
If map1(x,y,1)=2 Then
ratte(s)\locx=x*16
ratte(s)\locy=y*16
DrawImage Ratteset,Ratte(s)\Locx-scrollx,Ratte(s)\Locy-scrolly,0
End If
Color 255,255,255
Next
Next
Next


Kann mir bitte jemand erklären warum das obere nicht funktioniert ? ;(

MfG Affenmann

BladeRunner

Moderator

BeitragFr, Jul 21, 2006 15:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Prinzipiell würde ich die Ratten nicht in einem Dim speichern denn Du verschenkst einen der Hauptvorteile von Types: Die Flexibilität der Anzahl.

Anstatt also Code: [AUSKLAPPEN]
dim ratte.monster (zahlen)
zu machen würde ich ein Code: [AUSKLAPPEN]
if map(x,y) =2 then
    ratte.monster=new monster
    ratte\x = x*16
    ratte\y = y^*16
next

und später ein:

Code: [AUSKLAPPEN]
for ratte.monster = each monster
    if ratte\typ = 1 ;nur ein Beispiel, Ratten wären also typ 1, Spinnen typ2 etc..
        drawimage rattenimage,ratte\x,ratte\y
    endif
next
machen.
Damit ist es egal wieviel ratten du erstellst, sie werden alle eingetragen.
Ab davon kannst du mit field typ im typoe monster die voraussetzungen für beliebige Kreaturen schaffen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Affenmann

BeitragFr, Jul 21, 2006 15:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja ehrlich gesagt verstehe ich nich ganz was du meinst dass ich die flexibilität verschenke Smile

Code: [AUSKLAPPEN]

For y = 0 To mapy
For x = 0 To mapx
If map1(x,y,1)=2 Then Rattenzahl=Rattenzahl+1
Next
Next


so wird am anfang ausserhalb der repeat schleife gelesen wieviel ratten es sind... Die Variable is nun schon ein wenig anders als vohin da ich inzwischen mehrere Monster habe Smile

Aber ich änder das mal so wie du das gemacht hast. Vielleicht funktioniert es dann besser. : )
 

Affenmann

BeitragFr, Jul 21, 2006 15:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok läuft nach Wunderbar : )
Doch wie steuer ich den jetzt ein Monster an ?
Bei dem Dim feld hatte ich ja
Ratte(1)\locx usw

Da habe ich ja nix :/

Denke mal dass da dann halt dieses
first
last usw.

Ist dass nicht viel komplizierter als mit Dim-Felder.
Hab mich bis jetzt eigentlich nur mit DimType-Feldern beschäftigt da Dynamische Type-Listen sehr kompliziert aussehen :/

Durch die Berechnung am Anfang weiß ich ja wieviel Ratten auf der Karte sind und somit stimmt die Anzahl der Ratten Smile

Also würde eher lieber das Dim Feld nehmen. Nur bekomme ich dass halt nicht hin dass die Locx und Locy abgespeichert werden ohne dass die Positionen jeden Schleifen durchlauf aktualisiert werden...

BladeRunner

Moderator

BeitragFr, Jul 21, 2006 19:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Genau, mit dem first und after geht das, und es ist wenn man sich ein wenig daran gewöhnt hat wesentlich besser als mit Dims.
Der Punkt ist dass Du einfach alle Ratten durchlaufen kannst ohne Dir Gedanken darüber zu machen wieviele es gibt.
Es ist also unnötig sie zu zählen.
Du lässt einfach mit for each jede Ratte durchlaufen, bewegst sie und zeichnest sie, prüfst auf Kollision etc.
Da die Ratten "ihre" Daten ja immer mit dabei haben ist es unnötig sie nochmal in einem Dimfeld 'einzusperren'.
Spart zudem noch Speicherplatz.

zur absoluten Not könntest Du noch mit ql:Handle und ql:Object arbeiten wenn Du bestimmte Ratten ansprechen willst. Aber überleg mal: Du machst doch die Ratten mit dem Type weil sie uniform sind, d.h. untereinander austauschbar. (Es gibt ja keine Ratten die sich anders verhalten, sie sind eben alle Ratten. Gäbe es noch Superratten definierst du einfach nur nen neuen Typ und schwupp ist der Käse fertig.

Noch besser, Du kannst in deinen Functionen nach der "Gattung" deines Monsters einfach verschiedene Vorgehensweisen definieren und diese werden dann für alle Exemplare durchgeführt.
Oder, wenn etwas bei allen Gattungen gleich ist durchläufst du einfaqch ganz monster ohne auf den Typ zu achten und tust die gleichbleibenden Sachen.

Das ist sehr mächtig, wenn man es erst mal verstanden hat Smile
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Affenmann

BeitragFr, Jul 21, 2006 22:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Super Smile
Dann mache ich dass so
Würdest du mir bitte noch ein kleines Beispiel geben für die Kollisions abfragen ? : D

BladeRunner

Moderator

BeitragFr, Jul 21, 2006 23:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Das entspricht eigentlich nicht meinen Gewohnheiten, aber sei's drum.

Beispiel:
BlitzBasic: [AUSKLAPPEN]
Graphics 640,480
SetBuffer BackBuffer() ;doublebuffering

Type monster ; Deklaration Monster
Field typ
Field x
Field y
End Type
monster1=LoadImage ("deinedatei")
monster2=LoadImage("anderes Bild Wink")
spieler = LoadImage ("spielerbild")

SeedRnd MilliSecs() ;Zufallsgenerator initialisieren

For i = 1 To Rand(20,100) ;zwischen 20 und 100 Monster erschaffen:
mon.monster = New monster
mon\typ = Rand (2) ;es werden 2 Arten von Kreaturen erschaffen
mon\x = Rand(600)
mon\y = Rand (350) ; und diese werden zufällig quer über das Spielfeld verteilt
Next


Repeat ;HAUPTSCHLEIFE

;hier nun Die Bewegung für deinen player, ich lasse ihn hier zufällig laufen:
x=x+Rand(-2,2)
y=y+Rand(-2,2)
If x <0 Then x = 0
If x >640 Then x = 640
If y<0 Then y = 0
If y >400 Then y=400

; nun der Zauber:
For a.monster = Each monster
Select a\typ
Case 1
If ImagesCollide(spieler,x,y,0,monster1,a\x,a\y,0) Then
Text 0,0,"Kollision!!!!"
EndIf
Case 2
If ImagesCollide(spieler,x,y,0,monster2,a\x,a\y,0) Then
Text 0,0,"Kollision!!!! Mit anderem Monster!!!"
EndIf
End Select
Next
Flip
Cls
Until KeyHit(1)
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Affenmann

BeitragFr, Jul 21, 2006 23:42
Antworten mit Zitat
Benutzer-Profile anzeigen
[quote="BladeRunner"]

Beispiel:



; nun der Zauber:
for a.monster = each monster
select a\typ
case 1
if imagescollide(spieler,x,y,0,monster1,a\x,a\y,0) then
text 0,0,"Kollision!!!!"
endif
case 2
if imagescollide(spieler,x,y,0,monster2,a\x,a\y,0) then
text 0,0,"Kollision!!!! Mit anderem Monster!!!"
endif
end select
next
flip
cls
until keyhit(1)
quote]

Vielen Dank doch mir is noch unklar wie ich dass genau schreibe...
Da steht ja if imagescollide(spieler,x,y,0,monster1,a\x,a\y,0) then

Muss ich für jedes Monster jetzt extra monster1 usw schreiben ? Oo

Edit1: Ok habs hinbekommen
Vielen Dank für deine Hilfe Very Happy

BladeRunner

Moderator

BeitragFr, Jul 21, 2006 23:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, monster1 und monster2 sind die Handles der Bilddateien für den Monstertyp.
Also zB monster1 das Bild einer Ratte,
Monster2 das Bild einer Spinne.

Die select case brauchst Du also nur pro Monstertyp, nicht für jedes einzelne Monster.
Wenn Du ein paar beliebige kleine Grafiken lädst wirst Du ja sehen das der Code nur mit diesen 2 Abfragen funktioniert Wink
Es wird nirgends in dem programm festgehalten wieviele Monster erzeugt wurden, es ist aber auch egal, denn mit for each (für alle...) werden ALLE erzeugten Monster durchlaufen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group