RPG Spiel Steuerungsfehler???

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

jonnyboy

Betreff: RPG Spiel Steuerungsfehler???

BeitragSo, März 16, 2008 17:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute, da bin ich wieder mit meinem neuen projekt.
Ich hab seid gestern dem minitaschenrechner nurnoch Blitzbasic gelernt... =P
Gerade versuche ich, ein kleines RPG Spiel zu schreiben.

Das Problem bei meiner Steuerung ist, das ich einfach nicht dahintersteige, wenn ich einmal nach rechts drücke, geht der typ auch eines weiter. aber danach nichtmehr!
wenn ich dann zurück nach links drücke, kommt die Fehlermeldung "Array index out of bounds".

ich hab mir die Steuerung von www.robsite.de von dem Tutorial von Blitzmaster abguckt... und eig ist da nun alles gleich... -.-

Frage: Warum funktioniert meine Steuerung nicht??? Und..wenn es geht...
Embarassed erbitte ich noch um eine kleine erklärung dazu.. denn ich verstehe das Prinzip davon leider noch immer nicht, obwohl ich mich schon lang genug mit befassst habe -.-

Also versteht mich nicht falsch, das ich, sobald etwas nicht klappt, euch frage. Ich habe schon allerlei andere ausführungen ausprobiert und mir den Kopf zerbrochen, worans liegen könnte.


Funktionscode:


Code: [AUSKLAPPEN]
Function typlauf() ;Typ verschieben

If KeyDown (205) Then
If karte(xtry + 1,ytry) < 3 Then
xtry = xtry + 1
move= 1
End If
End If

If KeyDown (203) Then
If karte(xtry - 1,ytry) < 3 Then
xtry = xtry - 1
move= 1
End If
End If

If move = 1 Then spx = xtry * 57
spy = ytry * 57

DrawImage(typ,spx,spy,3)

End Function






für das ganze Game: (falls ihr keinen Fehler im vorigen finden könnt)



Code: [AUSKLAPPEN]
;######################



;LITTLE MAN Version 1.0


;das MiniSpiel,erstellt
;mit Blitz Basic

;von BMC-Games



;######################



Graphics 800, 600

Global karteset = LoadAnimImage("karte.bmp",57,57,0,6) ;KartenSet laden
Global typ = LoadAnimImage("interaktive.bmp",57,57,0,6) ;Figuren laden
MaskImage typ, 255,0,255
Global spx = 0
Global spy = 0


Dim karte(13,9)               ;Level 1

Data 0,0,0,0,0,0,0,0,5,0,5,0,5,5
Data 1,1,0,0,0,5,0,0,2,3,4,0,0,0
Data 0,1,1,5,0,0,0,0,0,0,5,5,5,0
Data 1,1,1,5,0,5,0,0,0,0,5,0,5,5
Data 1,0,0,5,5,0,1,0,5,0,5,5,0,5
Data 0,1,0,5,0,0,0,1,0,5,0,5,5,5
Data 3,3,4,0,0,0,0,1,0,0,0,0,5,0
Data 0,5,2,3,4,5,0,0,0,5,5,5,0,2
Data 0,0,0,5,5,5,0,0,1,1,0,1,0,1
Data 5,5,0,5,0,2,4,0,0,0,1,1,1,0

For y = 0 To 9   ;löschen der Karte
For x = 0 To 13

Read karte(x,y)

Next
Next



Repeat         ;ANFANG HAUPTSCHLEIFE ####################

SetBuffer BackBuffer()

Cls

If KeyDown (1) Then End

mapmalen()
typlauf()

Flip
Forever         ;ENDE HAUPTSCHLEIFE ######################



Function mapmalen() ;Karte zeichnen

For y = 0 To 9
For x = o To 13
DrawImage karteset,x * 57, y * 57,karte(x,y)
Next
Next

End Function


Function typlauf() ;Typ verschieben

If KeyDown (205) Then
If karte(xtry + 1,ytry) < 3 Then
xtry = xtry + 1
move= 1
End If
End If

If KeyDown (203) Then
If karte(xtry - 1,ytry) < 3 Then
xtry = xtry - 1
move= 1
End If
End If

If move = 1 Then spx = xtry * 57
spy = ytry * 57

DrawImage(typ,spx,spy,3)

End Function


EDIT: Codetags eineditiert. MfG BladeRunner

BladeRunner

Moderator

BeitragSo, März 16, 2008 17:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Bitte benutze in Zukunft die Codetags, sie machen deine Postings wesentlich besser zu lesen.
Wenn Du ein Posting verfasst sind sie unter den smileys zu finden. Danke.
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

jonnyboy

BeitragSo, März 16, 2008 19:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für das einfügen der Codetags, Bladerunner, hätte ich auch noch gemacht... =)

Hm... kann mir aber denn keiner helfen? Shocked
 

Bassmaster

BeitragMo, März 17, 2008 9:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier ist ein beispiel Code für Bewegungen in RPG´s :

Code: [AUSKLAPPEN]

Graphics 640,480,32,0

Global Tileset = LoadAnimImage("tileset2.png" ,32,32,0,19)
Global char     = LoadImage  ("char2.png")
MaskImage char ,255,255,255


;---- Haus Tiles -----------------------------------------------





;----------------------------------------------------------------



;-----------------------------------
Global ppx = 10*32 ;X-Position des Charackters
Global ppy = 7*32  ;Y-Position des Charackters

Global py = 7      ;Kollisions X-Position des Charackters
Global px = 10     ;Kollisions Y-Position des Charackters

Global scrolly     ;Die Variable fr die ScrollY-Position
Global scrollx     ;Die Variable fr die ScrollX-Position

Global gold = 10     ;start geld
;--------------------------------




Dim map(25,25)


; 0 = wiese
; 1 = sand
; 2 = hebel
; 3 = wasser
; 4 = tür
; 5 = feuer
; 6 = baum

;haus fängt ab 8 an

;26 nach rechts   ;26 nach unten
Data 5,5,5,5,5, 5,5,5,5,5, 5,5,5,5,5, 5,5,5,5,5, 5,5,5,5,5, 5

Data 5,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 1,1,1,1,1, 0,0,0,0,0, 5
Data 5,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 1,1,1,1,1, 0,0,0,0,0, 5
Data 5,0,0,0,0, 0,0,6,0,0, 0,0,0,0,0, 1,1,1,1,1, 0,0,0,0,0, 5
Data 5,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 1,1,1,1,1, 1,0,0,0,0, 5
Data 5,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 1,1,7,1,1, 0,0,0,0,0, 5

Data 5,5,5,5,5, 5,5,4,5,5, 5,5,4,5,5, 5,5,5,5,5, 5,5,5,5,5, 5
Data 5,0,0,0,0, 0,0,2,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 5
Data 5,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 5
Data 5,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 5
Data 5,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 5

Data 5,0,0,0,0, 0,0,0,0,0,    8,0,0,0,0,        0,0,0,0,0, 0,0,0,0,0, 5
Data 5,0,0,0,0, 0,0,0,0,0,    9,0,0,0,0,        0,0,0,0,0, 0,0,0,0,0, 5
Data 5,0,0,0,0, 0,0,0,0,0, 10,0,0,0,0,        0,0,0,0,0, 0,0,0,0,0, 5
Data 5,0,0,0,0, 0,0,0,0,0, 11,0,0,0,0,        0,0,0,0,0, 0,0,0,0,0, 5
Data 5,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,          0,0,0,0,0, 0,0,0,0,0, 5

Data 5,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 5
Data 5,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 5
Data 5,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 5
Data 5,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 5
Data 5,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 5

Data 5,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 5
Data 5,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 5
Data 5,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 5
Data 5,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 5

Data 5,5,5,5,5, 5,5,5,5,5, 5,5,5,5,5, 5,5,5,5,5, 5,5,5,5,5, 5




For x = 0 To 25
For y = 0 To 25
Read map(x,y)
Next
Next



Repeat
SetBuffer BackBuffer()
Cls


For x = 0 To 25
For y = 0 To 25

DrawBlock tileset,x*32-scrollx,y*32-scrolly,map(x,y)  ;map malen
Next
Next

DrawImage char,ppx-scrollx,ppy-scrolly   ;figur male



;----Bewegungsroutinen----------------------------------------------------------------------------------

Print "------"
Print "px"
Print px
Print "------"

Print "------"
Print "py"
Print py
Print "------"

Print "------"
Print "ppx"
Print ppx
Print "------"

Print "------"
Print "ppy"
Print ppy
Print "------"

Select move
 
 ;links
   Case 1
      ;Spielerposition ndern
      scrollx = scrollx - 2
      ppx = ppx - 2
      ;Variable, die zhlt wie weit der Spieler bereits bewet wurde
      counter=counter+1
      If counter = 16 Then
         px = px - 1
         counter = 0
         move = 0
      EndIf
   
;Rechts
   Case 2
      ;Spielerposition ndern
      scrollx = scrollx + 2
      ppx = ppx + 2
      ;Variable, die zhlt wie weit der Spieler bereits bewet wurde
      counter = counter+1
      If counter = 16 Then
         px = px + 1
         counter = 0
         move = 0
      EndIf


;runter
Case 3
    ;Spielerposition ndern
      scrolly = scrolly + 2
      ppy = ppy + 2
      ;Variable, die zhlt wie weit der Spieler bereits bewet wurde
      counter = counter+1
      If counter = 16 Then
         py = py + 1
         counter = 0
         move = 0
      EndIf


;rauf
Case 4
    ;Spielerposition ndern
      scrolly = scrolly - 2
      ppy = ppy - 2
      ;Variable, die zhlt wie weit der Spieler bereits bewet wurde
      counter = counter+1
      If counter = 16 Then
         py = py - 1
         counter = 0
         move = 0
      EndIf

End Select

;Cursor Rechts
If KeyDown(205) Then
   ;Kollision checken, wie ihr es schon kennt
   If map(px+1,py) < 3 Then
      ;der nchste Tastatur-eingabe-impuls wird mglich sobald die vorige Bewegung abgeschlossen ist
      ;das heit in der Zeit wo keine Tastatur-eingabe erfolgen kann wird zur Zeit gescrollt
      If move=0 Then
         ;die Scrollroutine move=2   (  Case 2 ) wird aufgerufen
         move = 2
      End If
   End If
End If

;Cursor Links
If KeyDown(203) Then
   ;Kollision checken, wie ihr es schon kennt
   If map(px-1,py) < 3 Then
      ;der nchste Tastatur-eingabe-impuls wird mglich sobald die vorige Bewegung abgeschlossen ist
      ;das heit in der Zeit wo keine Tastatur-eingabe erfolgen kann wird zur Zeit gescrollt
      If move=0 Then
         ;die Scrollroutine move=1    ( Case 1 ) wird aufgerufen
         move = 1
      End If
   End If
End If


;runter key
   If KeyDown(208) Then
      If map(px,py+1) < 3 Then
         If move = 0 Then
         move = 3           
         End If
      End If
   End If




;rauf key
   If KeyDown(200) Then
      If map(px,py-1) < 3 Then
         If move = 0 Then
         move = 4           
         End If
      End If
   End If




      
Flip
Forever
   
   

jonnyboy

BeitragMo, März 17, 2008 11:50
Antworten mit Zitat
Benutzer-Profile anzeigen
J, nach diesem Muster hab ichs ja auch gemacht.. nach dem RPG-tutvon Blitzmaster mit dem "char"... und nach dem Prinzip ist es ja auch aufgebaut... Idea Naja, ich schau nochmalgenau, wo der fehlerist, trozdem danke.. Smile

SpionAtom

BeitragMo, März 17, 2008 13:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi. Folgendes ist mir aufgefallen:
Codeeinrückungen helfen bei der Lesbarkeit ungemein!
Setbuffer gehört vor die Schleife.
Kommentar lautet: Lesen der Karte, nicht löschen der Karte.
"If KeyDown (1) Then End" kann man gut an den Schleifenkopf oder ans Schleifenende packen.

Der Hund liegt in der Function typlauf begraben.
Die Variablen xtry und ytry sind nicht bekannt. Sie sind bei jedem Functionsaufruf zurück auf null gesetzt, mach sie global und es funktioniert.

und hier der (etwas verbesserte) Code:
Code: [AUSKLAPPEN]
;######################



;LITTLE MAN Version 1.0


;das MiniSpiel,erstellt
;mit Blitz Basic

;von BMC-Games



;######################



Graphics 800, 600, 0, 2

Global karteset = LoadAnimImage("d:\bild.jpg",57,57,0,6) ;KartenSet laden
Global typ = LoadAnimImage("d:\pic.jpg",57,57,0,6) ;Figuren laden
MaskImage typ, 255,0,255
Global spx = 0, spy = 0
Global xtry = 0, ytry = 0


Dim karte(13,9)               ;Level 1

Data 0,0,0,0,0,0,0,0,5,0,5,0,5,5
Data 1,1,0,0,0,5,0,0,2,3,4,0,0,0
Data 0,1,1,5,0,0,0,0,0,0,5,5,5,0
Data 1,1,1,5,0,5,0,0,0,0,5,0,5,5
Data 1,0,0,5,5,0,1,0,5,0,5,5,0,5
Data 0,1,0,5,0,0,0,1,0,5,0,5,5,5
Data 3,3,4,0,0,0,0,1,0,0,0,0,5,0
Data 0,5,2,3,4,5,0,0,0,5,5,5,0,2
Data 0,0,0,5,5,5,0,0,1,1,0,1,0,1
Data 5,5,0,5,0,2,4,0,0,0,1,1,1,0

For y = 0 To 9   ;Lesen der Karte
   For x = 0 To 13
      Read karte(x,y)
   Next
Next

   SetBuffer BackBuffer()

   Repeat         ;ANFANG HAUPTSCHLEIFE ####################
      Cls
      mapmalen()
      typlauf()
      Flip
   Until KeyDown(1)



Function mapmalen() ;Karte zeichnen
   For y = 0 To 9
      For x = o To 13
         DrawImage karteset,x * 57, y * 57,karte(x,y)
      Next
   Next
End Function


Function typlauf() ;Typ verschieben

   If KeyDown (205) Then
      If karte(xtry + 1, ytry) < 3 Then
         xtry = xtry + 1
         move= 1
      End If
   End If

   If KeyDown (203) Then
      If karte(xtry - 1,ytry) < 3 Then
         xtry = xtry - 1
         move= 1
      End If
   End If

   If move = 1 Then spx = xtry * 57
   spy = ytry * 57

DrawImage(typ,spx,spy,3)

End Function


Der nächste Schritt wäre zu überprüfen, ob die Figur über den Rand der Karte hinausläuft, denn dann läufst du auch aus dem Map-array raus und es gibt ne Fehlermeldung.
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

jonnyboy

BeitragMo, März 17, 2008 15:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Viiielen Dank,Spion Atom, jez hab ichs gecheckt Wink

Großes Lobv auch an das Forum, hier erhält man wirklich konstruktive Hilfe... BIG UP!!! Laughing

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group