Ansatz für ein RPG Game

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Mathias-Kwiatkowski

Betreff: Ansatz für ein RPG Game

BeitragDi, März 27, 2007 19:26
Antworten mit Zitat
Benutzer-Profile anzeigen
hier habe mal ein kleinen ansatz für ein RPG umgeschrieben.
Quelle: robsite.de

etwas verbessert ist es auch

Code: [AUSKLAPPEN]
'Grafikmodus etc. initialisieren
Graphics 640, 480, 32

'Kachel erstellen
Global kachel = CreateImage(32,32)
SetColor 50,50,200
DrawRect 0,0,32,32
SetColor 120,120,250
DrawLine 0,0,0,30
DrawLine 0,0,30,0
SetColor 10,10,100
DrawLine 31,31,31,1
DrawLine 31,31,1,31
GrabImage kachel,0,0
Cls
Global Char=CreateImage(32,32)
SetColor 128,0,0
DrawRect 0,0,32,32
SetColor 255,255,0
DrawLine 0,0,0,30
DrawLine 0,0,30,0
SetColor 255,0,0
DrawLine 31,31,31,1
DrawLine 31,31,1,31
SetColor 255,255,255
DrawText "P",32/2-TextWidth("P")/2,32/2-TextHeight("P")/2
GrabImage Char,0,0


'Variablen der "Kamere"
Global cam_x
Global cam_y
Global cam_speed = 32
Global tilemap:Int[100,100]
';px Variable des Spielers
Global px = 10
';py Variable des Spielers
Global py = 7
';Direckt move = 1 damit die Figur auch am Anfang sichbar ist
Global move = 1

'Die Tilemap wird hier erstellt
 
For x = 0 To 99
   For y = 0 To 99
      tilemap(x,y) = 1
   Next
Next

For x = 2 To 97
   For y = 2 To 97
      tilemap(x,y) = 0
   Next
Next

For x = 6 To 93
   For y = 6 To 93
      tilemap(x,y) = Rand(0,1)
   Next
Next

SetColor 255,255,255
'Die Hauptschleife
While Not KeyHit(KEY_ESCAPE)
   Cls
   Cam_Control()
   
   DrawTileMap()
   
   Flip
   
Wend

'Die Sichtbaren Tile werden gezeichnet
Function DrawTileMap()
   cam_x_div = cam_x / 32
   cam_y_div = cam_y / 32

   'Malt 21*16 Tiles statt 100*100 Tiles
   For x = cam_x_div  To cam_x_div + 20
      For y = cam_y_div  To cam_y_div + 15

         If tilemap(x,y) = 1
            DrawImage kachel,x*32-cam_x,y*32-cam_y
         End If
      Next
   Next

End Function


Function Cam_Control()
   'Die Kamera wird hier mit Pfeiltasten gesteuert, Q und A beeinflussen den Speed
   If KeyDown(KEY_LEFT) Then
      
      If tilemap(px-1,py) < 1 Then
         px = px - 1
         move = 1
         cam_x = cam_x - cam_speed Delay 5
      End If
   End If
   If KeyDown(KEY_RIGHT) Then
      
      If tilemap(px+1,py) < 1 Then
         px = px + 1
         move = 1
         cam_x = cam_x + cam_speed Delay 5
      End If
   End If
   If KeyDown(KEY_UP) Then
      
      If tilemap(px,py-1) < 1 Then
         py = py - 1
         move = 1
         cam_y = cam_y - cam_speed Delay 5
      End If
   End If
   If KeyDown(KEY_DOWN) Then
      
      If tilemap(px,py+1) < 1 Then
         py = py + 1
         move = 1
         cam_y = cam_y + cam_speed Delay 5
      End If
   End If

    If move = 1 Then x = px * 32 y = py * 32 DrawImage char,x-cam_x,y-cam_y Delay 45
   
   'Hier wird verhindert, dass die Kamera ausserhalb der Map gerät
   If cam_x < 0 Then cam_x = 0
   If cam_y < 0 Then cam_y = 0
   If cam_x > 99*32-20*32 Then cam_x = 99*32-20*32
   If cam_y > 99*32-15*32 Then cam_y = 99*32-15*32
   
End Function
 

krux

BeitragMi, März 28, 2007 17:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Irgendwie wird die gnze Zeit der Bildschirmrand mitgezogen, es gibt keine Möglichkeit in die Mitte des Bildes zu kommen, ohne die Spielfeldbegrenzung zu nutzen und den bildausschnitt wieder richtig zu rücken. Ob man das ganze wirklich als RPG verwendung finden wird weiß ich nicht, denn die rasterbewegungsunfreiheit ist ja schobn arg veraltert.

Mathias-Kwiatkowski

BeitragDo, März 29, 2007 13:05
Antworten mit Zitat
Benutzer-Profile anzeigen
omg des ist ein ansatz, und habe gesagt das der uhrsprung von robsite kommt! also was will man? ich meine man kann auch etwas selber denken, wie man die figur und den schirm richtig positioniert oder?

man fragt doch einfach nur ab ob pers. am rand des screens ist und je nach rand soll der einfach einen schirm weiter scrollen, des ist glaube ich nicht so schwer!

und funktionieren tut's auch!

Mathias-Kwiatkowski

BeitragDo, März 29, 2007 13:19
Antworten mit Zitat
Benutzer-Profile anzeigen
aber damit auch dein gewissen beruhigt ist .- hier bitte -.

der code wo der screen nur noch dann mitläuft wenn du am ende weitergehst!

Code: [AUSKLAPPEN]
'Grafikmodus etc. initialisieren
Graphics 640, 480, 32

'Kachel erstellen
Global kachel = CreateImage(32,32)
SetColor 50,50,200
DrawRect 0,0,32,32
SetColor 120,120,250
DrawLine 0,0,0,30
DrawLine 0,0,30,0
SetColor 10,10,100
DrawLine 31,31,31,1
DrawLine 31,31,1,31
GrabImage kachel,0,0
Cls
Global Char=CreateImage(32,32)
SetColor 128,0,0
DrawRect 0,0,32,32
SetColor 255,255,0
DrawLine 0,0,0,30
DrawLine 0,0,30,0
SetColor 255,0,0
DrawLine 31,31,31,1
DrawLine 31,31,1,31
SetColor 255,255,255
DrawText "P",32/2-TextWidth("P")/2,32/2-TextHeight("P")/2
GrabImage Char,0,0

Global max_x:Int=23
Global max_y:Int=17

'Variablen der "Kamere"
Global cam_x
Global cam_y
Global cam_speed = 32
Global tilemap:Int[100,100]
';px Variable des Spielers
Global px = 10
';py Variable des Spielers
Global py = 7
';Direckt move = 1 damit die Figur auch am Anfang sichbar ist
Global move = 1

'Die Tilemap wird hier erstellt
 
For x = 0 To 99
   For y = 0 To 99
      tilemap(x,y) = 1
   Next
Next

For x = 2 To 97
   For y = 2 To 97
      tilemap(x,y) = 0
   Next
Next

 

SetColor 255,255,255
'Die Hauptschleife
While Not KeyHit(KEY_ESCAPE)
   Cls
   Cam_Control()
   
   DrawTileMap()
   
   Flip
   
Wend

'Die Sichtbaren Tile werden gezeichnet
Function DrawTileMap()
   cam_x_div = cam_x / 32
   cam_y_div = cam_y / 32

   'Malt 21*16 Tiles statt 100*100 Tiles
   For x = cam_x_div  To cam_x_div + 20
      For y = cam_y_div  To cam_y_div + 15

         If tilemap(x,y) = 1
            DrawImage kachel,x*32-cam_x,y*32-cam_y
         End If
      Next
   Next

End Function


Function Cam_Control()
   'Die Kamera wird hier mit Pfeiltasten gesteuert, Q und A beeinflussen den Speed
   If KeyDown(KEY_LEFT) Then
       
      If tilemap(px-1,py) < 1 Then
         px = px - 1
         move = 1
         If px-cam_x/32<3 Then cam_x = cam_x - cam_speed-max_x*32+128 Delay 5
      End If
   End If
   If KeyDown(KEY_RIGHT) Then
       
      If tilemap(px+1,py) < 1 Then
         px = px + 1
         move = 1
         If px-cam_x/32>max_x-4 Then cam_x = cam_x + cam_speed+max_x*32-128 Delay 5
      End If
   End If
   If KeyDown(KEY_UP) Then
       
      If tilemap(px,py-1) < 1 Then
         py = py - 1
         move = 1
         If py-cam_y/32<3 Then cam_y = cam_y - cam_speed-max_y*32+128 Delay 5
      End If
   End If
   If KeyDown(KEY_DOWN) Then
       
      If tilemap(px,py+1) < 1 Then
         py = py + 1
         move = 1
         If py-cam_y/32>max_y-3 Then cam_y = cam_y + cam_speed+max_y*32-96 Delay 5
      End If
   End If

    If move = 1 Then x = px * 32 y = py * 32 DrawImage char,x-cam_x,y-cam_y Delay 45
   
   'Hier wird verhindert, dass die Kamera ausserhalb der Map gerät
   If cam_x < 0 Then cam_x = 0
   If cam_y < 0 Then cam_y = 0
   If cam_x > 99*32-20*32 Then cam_x = 99*32-20*32
   If cam_y > 99*32-15*32 Then cam_y = 99*32-15*32
   
End Function


umrechnen in den verschiedenen auflöäsungen könnt ihr aber oder?

FOODy

BeitragDo, März 29, 2007 13:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn man nach links oder nach oben gehen will, wird bereits beim 3ten Block die Sicht verändert.

Was das mit nem RPG zu tun hat, weiß ich beim besten Willen nicht.
Sieht mehr nach so nem Pacman oder mit etwas Fantasie sogar nach einem Bomberman Ansatz aus.

Ich persöhnlich finde das es, so wie es im moment ist, im Codearchiv nichts zu suchen hat.
Böse meine ich das nicht aber das sieht mir alles andere als Qualitativ und gebräuchlich aus.
Könnte mehr eine Codevorlage für Neulinge sein, mehr aber auch nicht.

Bitte den Post jetzt nicht als Angriff oder sogar als Böse bewerten.
Es ist wirklich eine gut gemeinte Kritik und ich wünsche dir weiterhin viel Spaß beim Coden.


Gruß,
FOODy


PS:
Du könntest den Code eventuell erweitern, indem du z.b. ein Inventar einbaust oder ein Chatsystem mitm NPCs.
Dann wäre der erste Schritt für einen RPG-Ansatz getan.
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB
 

krux

BeitragDo, März 29, 2007 21:09
Antworten mit Zitat
Benutzer-Profile anzeigen
sowas find ich immer zu geil, die kamera zentriert sich stets auf den Weg, den man hinter sich hat, und das was vorne ist, das sieht man nicht, obwohl eigentlich genau das wichtig wäre.aber egal, mach draus was du willst.

Mathias-Kwiatkowski

BeitragDo, März 29, 2007 22:07
Antworten mit Zitat
Benutzer-Profile anzeigen
ist es so schwer die cam auf dem player zu setzen?

das ist doch echt kiki mit etwas überlegung geht das TIPP CAM_X & CAM_Y sind für die kamera da, player px & py... im titel steht übrigens ansatz, wenn es nun also einer gebrauchen kann soll dieser es verwenden, und sein ding draus machen, werde hier kaum ein game ablegen....

Suco-X

Betreff: .......

BeitragFr, März 30, 2007 0:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Titel ist einfach falsch gewählt. Versteh mich nicht falsch, aber ein RPG Ansatz, sofern sowas Sinn machen sollte, dürfte wohl anders aussehen und sollte mindestens einen Umfang von 10.000 Zeilen haben. Es ist so, als ob ich sagen würde, dass unteres ein Weltraum Shooter Ansatz wäre..

Code: [AUSKLAPPEN]

Strict

Type TSchuss
   Field X:Float, Y:Float
   Field Speed:Float
   Field Image:TImage
   Field Link:TLink
   
   Function Create:TSchuss(Image:TImage, X:Float, Y:Float, Speed:Float, List:TList)
      Local Instance:TSchuss
      Instance = New TSchuss
      Instance.Image = Image
      Instance.X = X
      Instance.Y = Y
      Instance.Speed = Speed
      Instance.Link = List.AddLast(Instance)
      Return Instance
   End Function
   
   Method Update()
      X:+Speed
      
      If x>GraphicsWidth()
         Link.Remove()
      EndIf
   End Method
   
   Method Draw()
      SetColor 255,255,255
      DrawImage Image,x,y
   End Method
   
End Type




Graphics 800,600,0

Local SchussList:TList
Local px:Float, py:Float
Local Raumschiff:TImage, Schuss:TImage

Schuss     = CreateImage(16, 16)
Raumschiff = CreateImage(100,50)

SetColor 150,0,0
DrawRect 0,0,100,50
GrabImage(Raumschiff,0,0)

Cls

SetColor 0,0,255
DrawOval 0,0,16,16

GrabImage(Schuss,0,0)

Cls


SchussList = New TList
px = 100
py = GraphicsHeight()*0.5


Repeat
   Cls
   
   
   If KeyDown(KEY_RIGHT)
      px:+3.0
   ElseIf KeyDown(KEY_LEFT)
      px:-3.0
   EndIf
   
   If KeyDown(KEY_UP)
      py:-3.0
   ElseIf KeyDown(KEY_DOWN)
      py:+3.0
   EndIf
   
   If KeyHit(KEY_SPACE)
      Local Obj:TSchuss
      Obj = TSchuss.Create(Schuss, px+100, py+25-8, 7.0, SchussList)
   EndIf
   
   
   SetColor 255,255,255
   DrawImage Raumschiff, px, py
   
   For Local s:TSchuss = EachIn SchussList
      s.Update()
      s.Draw()
   Next     
   
   Flip
Until KeyHit(KEY_ESCAPE)
End



Wenn du also stolz bist, etwas programmiert zu haben, kannst du es uns gerne zeigen. Aber überleg dir das nächste mal besser unter welchem Titel du deine Sachen präsentierst.
Mfg
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

BladeRunner

Moderator

BeitragFr, März 30, 2007 10:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Und da es nicht wirklich der Riesenbringer ist (v.a. da es BMax nicht wirklich nutzt):
~VERSCHOBEN~
Dieser Thread passte nicht in das Forum, in dem er ursprünglich gepostet wurde.
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 BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group