PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tutorialidee: "RGSS games from scratch"



DFYX
10.03.2013, 21:18
Bei meiner Arbeit an RbRgss (wer es auf dem BMT nicht mitbekommen hat: eine Version von RGSS, die auch auf Linux und Mac läuft) kam mir eine Idee für eine Tutorialreihe und mich würde mal interessieren, ob ihr sowas lesen wollen würdet.

RGSS ist an sich eine recht generische Engine für 2D-Spiele, mit der man ohne Probleme auch Point & Click Adventures, Beat 'em Ups und Puzzlegames erstellen könnte. Der RPG Maker XP/VX/Ace bringt da lediglich noch ein paar zusätzliche Skripte mit, die die Engine auf RPGs zuschneiden. Die Tutorials würden sich damit befassen, wie man Spiele entwickelt, die keinerlei Funktionen nutzen, die direkt vom Maker kommen. Vorteil daran ist, dass man tatsächlich auch komplett ohne den Maker arbeiten kann. Man braucht lediglich die Runtime, also Game.exe, RGSS_**.dll und Game.ini. Alles Andere lässt sich in einem beliebigen Texteditor schreiben.

Ein kurzes Minimalbeispiel:


sprite = Sprite.new
bitmap = Bitmap.new 'Graphics/Characters/042-King01'
sprite.bitmap = bitmap
sprite.src_rect = Rect.new(0, 0, bitmap.width / 4, bitmap.height / 4)

frame = 0
ANIM_SPEED = 0.1
MOVE_SPEED = 3
while true
Input.update
if Input.press?(Input::UP)
sprite.y -= MOVE_SPEED
sprite.src_rect.y = 3 * sprite.src_rect.height
frame += ANIM_SPEED
end
if Input.press?(Input::LEFT)
sprite.x -= MOVE_SPEED
sprite.src_rect.y = 1 * sprite.src_rect.height
frame += ANIM_SPEED
end
if Input.press?(Input::RIGHT)
sprite.x += MOVE_SPEED
sprite.src_rect.y = 2 * sprite.src_rect.height
frame += ANIM_SPEED
end
if Input.press?(Input::DOWN)
sprite.y += MOVE_SPEED
sprite.src_rect.y = 0 * sprite.src_rect.height
frame += ANIM_SPEED
end

sprite.src_rect.x = (frame.to_i % 4) * sprite.src_rect.width
Graphics.update
end

Zeigt ein Charaktersprite an, das sich über den Bildschirm bewegen lässt.

Edit: Kleinigkeit im Code gefixt. Da war noch was RbRgss-spezifisches drin, was nicht nötig war.

Lares Yamoir
11.03.2013, 15:10
Ich fände es interessant solche Tutorials zu lesen, auch wenn ich das nicht umittelbar brauche (Habe schon Erfahrung mit Programmiersprachen und auch einige kleine Skripte im XP-RGSS umgesetzt). Ich denke aber, dass gerade Anfänger damit lernen könnten, wie RGSS funktioniert etc. Und vllt gibts dadurch ja auch mehr Variationen im Gameplay. Also ich find die Idee super^^.

netwarrior
11.03.2013, 18:04
Dieses Tutorial würde mich interessieren.
Ich bin dann gespannt, was noch alles aus dem ACE rauszuholen ist.

netwarrior

CapSeb
18.03.2013, 16:44
Das wäre überragend! Würde ich definitiv lesen.
Es ist immer gut Informationen von Leuten zu erhalten, die mehr zu einem umfangreichen Thema wie diesem wissen. Vielleicht ließe sich das Ergebnis auch als Diskussionsgrundlage für Vertiefungen nutzen. Also ich wäre dabei.

Blacky89
18.03.2013, 20:11
Fänd ich auch gut, da ich schon länger die Szene zwar verfolge, aber selbst noch nie (ernsthaft) ein
Spiel gemacht hab. Nun überleg ich aber, wirklich mal eins zu machen und da wäre RGSS schon nicht
schlecht, da man im VX Ace bestimmt sehr viel damit machen könnte.

Cornix
18.03.2013, 20:13
Ich könnte vielleicht ein wenig helfen falls gebraucht. Als ich damals noch mit dem XP gearbeitet habe, habe ich meine Projekte alle komplett mit RGSS in Ruby programmiert. Ich hatte damals aufgegeben wegen dem schrecklichen Scripteditor im Maker.

DFYX
18.03.2013, 21:34
Ich hatte damals aufgegeben wegen dem schrecklichen Scripteditor im Maker.
Arbeitsschritt 1: dafür sorgen, dass der Maker Code aus externen Dateien lädt und dann mit Sublime Text arbeiten. Funktioniert problemlos und sorgt direkt für eine saubere Projektstruktur. Das Ganze ist in zwei Zeilen erledigt.



$:.push(File.expand_path('../lib', __FILE__))
require 'main'


Lädt die lib/main.rb im Projektverzeichnis und von da aus lässt sich dann problemlos weiterer Code laden.

Edit: wenn man will, kann man sogar für diesen Schritt auf den Maker verzichten. Das Dateiformat der Scripts.rxdata ist extrem simpel.
Edit 2: Ich hab euch mal ein kleines Beispielprojekt zusammengepackt, das wirklich nur noch die allernötigsten Dateien enthält. Dementsprechend lässt sich das Projekt auch nicht mehr im Maker öffnen. Die Scripts.rxdata enthält exakt ein Script mit dem oben geposteten Code. 17185

Cornix
18.03.2013, 21:50
Ja, ich kenne diese Möglichkeit.
Ich hatte es einmal ausprobiert aber das war mir alles damals schon nervtötend.
Der XP war auch nicht sehr schnell im Vergleich mit dem Ace oder anderen Möglichkeiten.
Ich fühlte mich davon einfach irgendwann zu stark eingeengt.

Falls jemand großes Interesse hat ein ganzes Projekt selbst in Ruby zu schreiben und über den Maker laufen zu lassen, dann würde ich das nur empfehlen wenn es kein großes Projekt werden soll.
Wenn man sich ernsthaft die Arbeit machen will Programmieren zu lernen, eine Programmiersprache anzueignen und dann ein ganzes Spiel zu schreiben, dann kann man auch eigentlich sofort etwas "solideres" nehmen als den RPG-Maker.
Aber allgemein ein netter Einstieg ins Programmieren. Man kann schnell und einfach ein Ergebnis zu dem sehen was man geschrieben hat.

DFYX
18.03.2013, 22:13
Der Punkt ist, dass sich dieses Tutorial in keiner Form um den Maker drehen wird. RGSS ist eine vollkommen generische 2D-Engine, der es völlig egal ist, ob du damit ein RPG, einen Shooter oder ein Point & Click Adventure machst. Wir werden in den Tutorials den Maker an sich überhaupt nicht verwenden.

Hier nochmal zwei Beispielprojekte mit dem Code aus dem Eingangspost:
RGSS 1.02 (RPG Maker XP) (http://wecallit42.de/temp/RGSSFromScratchXP.zip)
RGSS 3.01 (RPG Maker VX Ace) (http://wecallit42.de/temp/RGSSFromScratchAce.zip)

Ihr müsst keinen der beiden Maker (und auch kein RTP) installiert haben, um mit diesen Projekten zu arbeiten. Sie unterscheiden sich im Wesentlichen nur in der Game.exe, der Game.ini und der RGSSxxx.dll. Außerdem musste ich in der RGSS 3.01 Version noch zwei Schriftarten aus dem RTP kopieren, da die vorausgesetzt werden, selbst wenn ich sie gar nicht verwende.

Und noch ein Edit: Ruby ist im Übrigen durchaus eine vollwertige Programmiersprache, auch wenn sie meistens eher im Bereich Webentwicklung anzutreffen ist. Beispielsweise setzen Twitter, Github und viele andere (http://rubyonrails.org/applications) auf Ruby.

Cherry
25.03.2013, 14:30
Der zweite Link ist derselbe wie der erste.

DFYX
25.03.2013, 20:03
Ups, geändert (Man hätte sich aber auch anhand des Dateinamens denken können, wie der andere Link lautet)

Doktor von Stein
25.03.2013, 22:03
Die Idee, allein über die "Sprache" RGSS Spiele zu schreiben, hat mich auch schon sehr oft beschäftigt. Das dabei natürlich Dinge wie Plattformunabhängigkeit flöten gehen, damit muss man umgehen. Aber es hilft ungemein, die Sprache von Grund auf zu lernen. Ich habe da auch direkt mal ein Beispiel dabei: Eine sehr einfache Snake-Variante.

Download: Snake.rar (http://www.mediafire.com/?hdg7emghg2q804e)

Code:


class Game

def main
@direction = 0
@tick = 0
@tick_max = 10
@parts = []
@parts[0] = Sprite.new
@parts[0].bitmap = Bitmap.new(16, 16)
@parts[0].bitmap.fill_rect(Rect.new(0, 0, 16, 16), Color.new(200, 200, 200))
@parts[0].x = 320
@parts[0].y = 240
@block = Sprite.new
@block.bitmap = Bitmap.new(16, 16)
@block.bitmap.fill_rect(Rect.new(0, 0, 16, 16), Color.new(255, 255, 255))
@block.x = rand(39)*16
@block.y = rand(29)*16
Graphics.transition
loop do
Graphics.update
Input.update
update
break if $scene != self
end
end

def update
@tick += 1
if @tick >= @tick_max
@tick = 0
case @direction
when 0
@parts[-1].y -= 16
reset if @parts[-1].y <= -16
when 1
@parts[-1].x += 16
reset if @parts[-1].x >= 640
when 2
@parts[-1].y += 16
reset if @parts[-1].y >= 480
when 3
@parts[-1].x -= 16
reset if @parts[-1].x <= -16
end
follow if @parts.length > 1
end
if Input.trigger?(Input::UP)
@direction = 0
elsif Input.trigger?(Input::RIGHT)
@direction = 1
elsif Input.trigger?(Input::DOWN)
@direction = 2
elsif Input.trigger?(Input::LEFT)
@direction = 3
end
if @parts[-1].x == @block.x && @parts[-1].y == @block.y
new_part
@block.x, @block.y = rand(39)*16, rand(29)*16
end
reset if crushing?
end

def reset
@parts.each{|p| p.dispose}
@parts = []
@parts[0] = Sprite.new
@parts[0].bitmap = Bitmap.new(16, 16)
@parts[0].bitmap.fill_rect(Rect.new(0, 0, 16, 16), Color.new(200, 200, 200))
@parts[0].x = 320
@parts[0].y = 240
@direction, @tick, @tick_max = 0, 0, 10
@block.x, @block.y = rand(39)*16, rand(29)*16
end

def new_part
@parts.unshift(Sprite.new)
@parts[0].bitmap = Bitmap.new(16, 16)
@parts[0].bitmap.fill_rect(Rect.new(0, 0, 16, 16), Color.new(255, 255, 255))
@parts[0].x = -16
@parts[0].y = -16
@tick_max -= 1 if (@parts.length % 5 == 0) && @tick_max > 2
end

def follow
for i in 0..@parts.length-3
@parts[i].x = @parts[i+1].x
@parts[i].y = @parts[i+1].y
end
case @direction
when 0
x = @parts[-1].x
y = @parts[-1].y + 16
when 1
x = @parts[-1].x - 16
y = @parts[-1].y
when 2
x = @parts[-1].x
y = @parts[-1].y - 16
when 3
x = @parts[-1].x + 16
y = @parts[-1].y
end
@parts[-2].x = x
@parts[-2].y = y
end

def crushing?
x = @parts[-1].x
y = @parts[-1].y
for i in 0..@parts.length-2
if @parts[i].x == x && @parts[i].y == y
return true
end
end
return false
end

end

(Bitte keine Kommentare zu meinem schlechten Schreibstil :D - Ist schon relativ alt.)

Wenn Interesse da ist, kann ich das sehr gerne näher erläutern.

Cornix
25.03.2013, 22:20
Ich habe noch ein oder zwei Projekte mit dem RPG-Maker XP für welche ich komplette (oder fast komplette) eigene Engines geschrieben habe.
Auch relativ alte Arbeiten, aber vielleicht kann der ein oder andere Gefallen an den Subsystemen finden.