• 【RGSS】RPG-Maker脚本探索:用XP做贪吃蛇


    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

  • 相关阅读:
    position+left+bottom+top+right
    C++中的bool类型
    C++读取ini文件
    菜单中Clean和batch build的作用
    解决连接HIS连接不上数据库的问题
    编译错误ERROR C2027
    C++中枚举类型的作用
    用CTime类得到当前日期 时间
    C++中如何调用DLL文件
    #import "msado15.dll" no_namespace rename("EOF","adoEOF")
  • 原文地址:https://www.cnblogs.com/tiumo/p/11405007.html
Copyright © 2020-2023  润新知