Show A Picture
First of all, let's try to show a circle in the game.
We can learn these code from the Help document.
devil = Sprite.new devil.bitmap = Bitmap.new("Graphics/Battlers/075-Devil01") devil.ox = devil.bitmap.width / 2 devil.oy = devil.bitmap.height / 2 devil.x = 320 devil.y = 240 loop do Graphics.update end
This can simply display a picture of the devil.
A Moving Picture
And now, let's try to make this picture move with the time.
devil = Sprite.new devil.bitmap = Bitmap.new("Graphics/Battlers/075-Devil01") devil.ox = devil.bitmap.width / 2 devil.oy = devil.bitmap.height / 2 devil.x = 320 devil.y = 240 loop do Graphics.update devil.x += 1 end
This program can make the picture move on the x axis to the right side.
We should notice that the refresh rate of RPG Maker XP is 20 fps.
Then, we should restrict the devil in the window, or it may move to the outside.
The size of the visiable area is 640*480, and the restraint of x is 640 minus half of the width of the picture.
devil = Sprite.new devil.bitmap = Bitmap.new("Graphics/Battlers/075-Devil01") devil.ox = devil.bitmap.width / 2 devil.oy = devil.bitmap.height / 2 devil.x = 320 devil.y = 240 loop do Graphics.update if devil.x < 640 - devil.bitmap.width/2 devil.x += 1 end end
I found a picture of a circle on the internet.
Then resize the picture and complete the constraints of the other three sides.
$snake = Sprite.new $snake.bitmap = Bitmap.new("Graphics/Pictures/Circle") $snake.zoom_x = 0.1 $snake.zoom_y = 0.1 $snake.ox = $snake.bitmap.width / 2 $snake.oy = $snake.bitmap.height / 2 $snake.x = 320 $snake.y = 240 $direction = 1 def bounderyCheck if $snake.x >= 640 - $snake.bitmap.width/2 * $snake.zoom_x return false end if $snake.x <= $snake.bitmap.width/2 * $snake.zoom_x return false end if $snake.y >= 480 - $snake.bitmap.height/2 * $snake.zoom_y return false end if $snake.y <= $snake.bitmap.height/2 * $snake.zoom_y return false end return true end def move if $direction == 0 return end if $direction == 1 $snake.x += 1 if !bounderyCheck $snake.x -= 1 end end if $direction == -1 $snake.x -= 1 if !bounderyCheck $snake.x += 1 end end if $direction == 2 $snake.y += 1 if !bounderyCheck $snake.y -= 1 end end if $direction == -2 $snake.y -= 1 if !bounderyCheck $snake.y += 1 end end end loop do Graphics.update move end
Control it!
And now, make the program interactive.
$snake = Sprite.new $snake.bitmap = Bitmap.new("Graphics/Pictures/Circle") $snake.zoom_x = 0.1 $snake.zoom_y = 0.1 $snake.ox = $snake.bitmap.width / 2 $snake.oy = $snake.bitmap.height / 2 $snake.x = 320 $snake.y = 240 $direction = 1 def bounderyCheck if $snake.x >= 640 - $snake.bitmap.width/2 * $snake.zoom_x return false end if $snake.x <= $snake.bitmap.width/2 * $snake.zoom_x return false end if $snake.y >= 480 - $snake.bitmap.height/2 * $snake.zoom_y return false end if $snake.y <= $snake.bitmap.height/2 * $snake.zoom_y return false end return true end def move if $direction == 0 return end if $direction == 1 $snake.x += 1 if !bounderyCheck $snake.x -= 1 end end if $direction == -1 $snake.x -= 1 if !bounderyCheck $snake.x += 1 end end if $direction == 2 $snake.y += 1 if !bounderyCheck $snake.y -= 1 end end if $direction == -2 $snake.y -= 1 if !bounderyCheck $snake.y += 1 end end end loop do Graphics.update Input.update if Input.trigger?(Input::RIGHT) $direction = 1 end if Input.trigger?(Input::LEFT) $direction = -1 end if Input.trigger?(Input::DOWN) $direction = 2 end if Input.trigger?(Input::UP) $direction = -2 end move end
A snake!
The following code has bought out a contorllable snake.
$snake = Sprite.new $snake.bitmap = Bitmap.new("Graphics/Pictures/Circle") $snake.zoom_x = 0.1 $snake.zoom_y = 0.1 $snake.ox = $snake.bitmap.width / 2 $snake.oy = $snake.bitmap.height / 2 $snake.x = 10 * $snake.bitmap.width * $snake.zoom_x $snake.y = 8 * $snake.bitmap.height * $snake.zoom_y $snake_body = [$snake] $snake_length = 5 $step = $snake.bitmap.width * $snake.zoom_x for i in 1..$snake_length $snake_body.push(Sprite.new) $snake_body[i].bitmap = Bitmap.new("Graphics/Pictures/Circle") $snake_body[i].zoom_x = 0.1 $snake_body[i].zoom_y = 0.1 $snake_body[i].ox = $snake.bitmap.width / 2 $snake_body[i].oy = $snake.bitmap.height / 2 $snake_body[i].x = $snake_body[i-1].x - $snake.bitmap.width * $snake.zoom_x $snake_body[i].y = $snake.y end $direction = 0 $timer = 0 $time_window = 5 def bounderyCheck if $snake.x >= 640 - $snake.bitmap.width/2 * $snake.zoom_x return false end if $snake.x <= $snake.bitmap.width/2 * $snake.zoom_x return false end if $snake.y >= 480 - $snake.bitmap.height/2 * $snake.zoom_y return false end if $snake.y <= $snake.bitmap.height/2 * $snake.zoom_y return false end return true end def bodyMove for i in 1..$snake_length $snake_body[$snake_length+1-i].x = $snake_body[$snake_length-i].x $snake_body[$snake_length+1-i].y = $snake_body[$snake_length-i].y end end def move if $direction == 0 return end if $direction == 1 $snake.x += $step if !bounderyCheck $snake.x -= $step $direction = 0 return end $snake.x -= $step bodyMove $snake.x += $step end if $direction == -1 $snake.x -= $step if !bounderyCheck $snake.x += $step $direction = 0 return end $snake.x += $step bodyMove $snake.x -= $step end if $direction == 2 $snake.y += $step if !bounderyCheck $snake.y -= $step $direction = 0 return end $snake.y -= $step bodyMove $snake.y += $step end if $direction == -2 $snake.y -= $step if !bounderyCheck $snake.y += $step $direction = 0 return end $snake.y += $step bodyMove $snake.y -= $step end end loop do Graphics.update Input.update if Input.trigger?(Input::RIGHT) if $direction != -1 $direction = 1 end end if Input.trigger?(Input::LEFT) if $direction != 1 $direction = -1 end end if Input.trigger?(Input::DOWN) if $direction != -2 $direction = 2 end end if Input.trigger?(Input::UP) if $direction != 2 $direction = -2 end end if $timer == 0 move end if $timer != $time_window $timer += 1 else $timer = 0 end end
Target
When there is no target, we should generate one.
$snake = Sprite.new $snake.bitmap = Bitmap.new("Graphics/Pictures/Circle") $snake.zoom_x = 0.1 $snake.zoom_y = 0.1 $snake.ox = $snake.bitmap.width / 2 $snake.oy = $snake.bitmap.height / 2 $snake.x = 10 * $snake.bitmap.width * $snake.zoom_x + $snake.ox * $snake.zoom_x $snake.y = 8 * $snake.bitmap.height * $snake.zoom_y + $snake.oy * $snake.zoom_y $snake_body = [$snake] $snake_length = 5 $step = $snake.bitmap.width * $snake.zoom_x $target = Sprite.new $target.bitmap = Bitmap.new("Graphics/Pictures/Circle") $target.zoom_x = 0.1 $target.zoom_y = 0.1 $target.ox = $snake.bitmap.width / 2 $target.oy = $snake.bitmap.height / 2 $target.x = -1 * $snake.bitmap.width * $snake.zoom_x + $snake.ox $target.y = -1 * $snake.bitmap.height * $snake.zoom_y + $snake.oy for i in 1..$snake_length $snake_body.push(Sprite.new) $snake_body[i].bitmap = Bitmap.new("Graphics/Pictures/Circle") $snake_body[i].zoom_x = 0.1 $snake_body[i].zoom_y = 0.1 $snake_body[i].ox = $snake.ox $snake_body[i].oy = $snake.ox $snake_body[i].x = $snake_body[i-1].x - $snake.bitmap.width * $snake.zoom_x $snake_body[i].y = $snake.y end $direction = 0 $timer = 0 $time_window = 5 def generateTarget rx = rand(640/$snake.bitmap.width/$snake.zoom_x).to_i * $snake.bitmap.width * $snake.zoom_x + $snake.ox * $snake.zoom_x ry = rand(480/$snake.bitmap.height/$snake.zoom_y).to_i * $snake.bitmap.height * $snake.zoom_y + $snake.oy * $snake.zoom_y $target.x = rx $target.y = ry end generateTarget def eatCheck if ($target.x - $snake.x).abs < $snake.bitmap.width * $snake.zoom_x and ($target.y - $snake.y).abs < $snake.bitmap.height * $snake.zoom_y generateTarget end end def bounderyCheck ... end def bodyMove for i in 1..$snake_length $snake_body[$snake_length+1-i].x = $snake_body[$snake_length-i].x $snake_body[$snake_length+1-i].y = $snake_body[$snake_length-i].y end end def move ... end loop do Graphics.update Input.update if Input.trigger?(Input::RIGHT) if $direction != -1 $direction = 1 end end if Input.trigger?(Input::LEFT) if $direction != 1 $direction = -1 end end if Input.trigger?(Input::DOWN) if $direction != -2 $direction = 2 end end if Input.trigger?(Input::UP) if $direction != 2 $direction = -2 end end if $timer == 0 move eatCheck end if $timer != $time_window $timer += 1 else $timer = 0 end end
Score and Pause
Then we try to display the score and make it can be paused by user.
$snake = Sprite.new $snake.bitmap = Bitmap.new("Graphics/Pictures/Circle") $snake.bitmap.hue_change(90) $snake.zoom_x = 0.1 $snake.zoom_y = 0.1 $snake.ox = $snake.bitmap.width / 2 $snake.oy = $snake.bitmap.height / 2 $snake.x = 10 * $snake.bitmap.width * $snake.zoom_x + $snake.ox * $snake.zoom_x $snake.y = 8 * $snake.bitmap.height * $snake.zoom_y + $snake.oy * $snake.zoom_y $snake_body = [$snake] $snake_length = 5 $step = $snake.bitmap.width * $snake.zoom_x $target = Sprite.new $target.bitmap = Bitmap.new("Graphics/Pictures/Circle") $target.zoom_x = 0.1 $target.zoom_y = 0.1 $target.ox = $snake.bitmap.width / 2 $target.oy = $snake.bitmap.height / 2 $target.x = -1 * $snake.bitmap.width * $snake.zoom_x + $snake.ox $target.y = -1 * $snake.bitmap.height * $snake.zoom_y + $snake.oy $score = 0 $score_text = Sprite.new $score_text.bitmap = Bitmap.new(640, 30) $score_text.bitmap.draw_text(0, 0, 640, 30, "Score:"+$score.to_s) $state_text = Sprite.new $state_text.y = 30 $state_text.bitmap = Bitmap.new(640, 30) $state_text.bitmap.draw_text(0, 0, 640, 30, "Pause") for i in 1..$snake_length $snake_body.push(Sprite.new) $snake_body[i].bitmap = Bitmap.new("Graphics/Pictures/Circle") $snake_body[i].zoom_x = 0.1 $snake_body[i].zoom_y = 0.1 $snake_body[i].ox = $snake.ox $snake_body[i].oy = $snake.ox $snake_body[i].x = $snake_body[i-1].x - $snake.bitmap.width * $snake.zoom_x $snake_body[i].y = $snake.y end $direction = 0 $timer = 0 $time_window = 5 $game_state = 0 def generateTarget ... end generateTarget def eatCheck ... end def bounderyCheck ... end def bodyMove ... end def move ... end loop do Graphics.update Input.update if Input.trigger?(Input::C) if $game_state == 0 $game_state = 1 $state_text.bitmap.dispose elsif $game_state == 1 $game_state = 0 $state_text.bitmap = Bitmap.new(640, 30) $state_text.bitmap.draw_text(0, 0, 640, 30, "Pause") end end if $game_state == 1 if Input.trigger?(Input::RIGHT) if $direction != -1 $direction = 1 end end if Input.trigger?(Input::LEFT) if $direction != 1 $direction = -1 end end if Input.trigger?(Input::DOWN) if $direction != -2 $direction = 2 end end if Input.trigger?(Input::UP) if $direction != 2 $direction = -2 end end if $timer == 0 move eatCheck end if $timer != $time_window $timer += 1 else $timer = 0 end end end
Game Over
def initGame $snake = Sprite.new $snake.bitmap = Bitmap.new("Graphics/Pictures/Circle") $snake.bitmap.hue_change(90) $snake.zoom_x = 0.1 $snake.zoom_y = 0.1 $snake.ox = $snake.bitmap.width / 2 $snake.oy = $snake.bitmap.height / 2 $snake.x = 10 * $snake.bitmap.width * $snake.zoom_x + $snake.ox * $snake.zoom_x $snake.y = 8 * $snake.bitmap.height * $snake.zoom_y + $snake.oy * $snake.zoom_y $snake_body = [$snake] $snake_length = 5 $step = $snake.bitmap.width * $snake.zoom_x $target = Sprite.new $target.bitmap = Bitmap.new("Graphics/Pictures/Circle") $target.zoom_x = 0.1 $target.zoom_y = 0.1 $target.ox = $snake.bitmap.width / 2 $target.oy = $snake.bitmap.height / 2 $target.x = -1 * $snake.bitmap.width * $snake.zoom_x + $snake.ox $target.y = -1 * $snake.bitmap.height * $snake.zoom_y + $snake.oy $score = 0 $score_text = Sprite.new $score_text.bitmap = Bitmap.new(640, 30) $score_text.bitmap.draw_text(0, 0, 640, 30, "Score:"+$score.to_s) $state_text = Sprite.new $state_text.y = 30 $state_text.bitmap = Bitmap.new(640, 30) $state_text.bitmap.draw_text(0, 0, 640, 30, "Pause(Press C to continue)") for i in 1..$snake_length $snake_body.push(Sprite.new) $snake_body[i].bitmap = Bitmap.new("Graphics/Pictures/Circle") $snake_body[i].zoom_x = 0.1 $snake_body[i].zoom_y = 0.1 $snake_body[i].ox = $snake.ox $snake_body[i].oy = $snake.ox $snake_body[i].x = $snake_body[i-1].x - $snake.bitmap.width * $snake.zoom_x $snake_body[i].y = $snake.y end $direction = 1 $timer = 0 $time_window = 5 $game_state = 0 end initGame def generateTarget ... end generateTarget def eatCheck ... end def bounderyCheck ... end def bodyMove ... end def move ... end def update if Input.trigger?(Input::C) if $game_state == 0 $game_state = 1 $state_text.bitmap.dispose elsif $game_state == 1 $game_state = 0 $state_text.bitmap = Bitmap.new(640, 30) $state_text.bitmap.draw_text(0, 0, 640, 30, "Pause(Press C to continue)") end end if $game_state == 1 if Input.trigger?(Input::RIGHT) if $direction != -1 $direction = 1 end end if Input.trigger?(Input::LEFT) if $direction != 1 $direction = -1 end end if Input.trigger?(Input::DOWN) if $direction != -2 $direction = 2 end end if Input.trigger?(Input::UP) if $direction != 2 $direction = -2 end end if $timer == 0 eatCheck move end if $timer != $time_window $timer += 1 else $timer = 0 end end end def gameOver $state_text.dispose $score_text.dispose for i in $snake_body i.dispose end $target.dispose initGame end loop do Graphics.update Input.update update end
Self collision
def initGame ... end initGame def generateTarget ... end generateTarget def eatCheck ... end def bounderyCheck ... end def selfCollisionCheck for i in 1..$snake_length if ($snake_body[i].x-$snake.x).abs < $snake.ox*$snake.zoom_x and ($snake_body[i].y-$snake.y).abs < $snake.oy*$snake.zoom_y gameOver break end end end def bodyMove ... end def move ... end def update ... end def gameOver ... end loop do Graphics.update Input.update update end
A simple Retro Snaker has been finished!
Demo(Nutstore Account Needed):https://www.jianguoyun.com/p/DYfPnjEQxL7-BxiDy7wC
Github:https://github.com/Karma-Tiumo/RGSS-Explore/tree/master/RetroSnaker