http://i.imgur.com/oPZ3zOA.png
Napisałem więc taki kod w Scene_Map.update (na końcu):
Kod: Zaznacz cały
if !no_ground?(@player.middle_x,@player.bottom) then
@player.y -= (@player.middle_y / @tileset.tilesize).floor
end
Kod: Zaznacz cały
if !no_ground?(@player.middle_x,@player.bottom) then
@player.y -= (@player.middle_y / @tileset.tilesize).floor
end
Kod: Zaznacz cały
if @move_x > 0 then
@move_x -= 1
@x += 1
elsif @move_x < 0 then
@move_x += 1
@x -= 1
elsif @move_x == 0 then
@moving = false
end
Kod: Zaznacz cały
frame = milliseconds / 90 % @sprite.size
Kod: Zaznacz cały
@v_acc = 1
@max_v_acc = 15
Kod: Zaznacz cały
def fall
if @jump == 0 then
@y += @v_acc
@v_acc = @v_acc * 1.25
@v_acc = @max_v_acc if @v_acc > @max_v_acc
if @dir == :left then
@sprite = @jump_left
elsif @dir == :right then
@sprite = @jump_right
end
end
end
Kod: Zaznacz cały
def reset_acceleration
@v_acc = 1
end
Kod: Zaznacz cały
@player.fall if no_ground?(@player.get_x, @player.get_y)
Kod: Zaznacz cały
if no_ground?(@player.get_x, @player.get_y) then
@player.fall
else
@player.reset_acceleration
end
Kod: Zaznacz cały
def jump
@jump = 15 if @jump == 0
@v_acc = 20
end
Kod: Zaznacz cały
if @jump > 0 then
@y -= 2
Kod: Zaznacz cały
if @jump > 0 then
@y -= @v_acc
@v_acc = @v_acc * 0.75
Kod: Zaznacz cały
@tile_data = []
data_raw = File.read("graphics/tiles/#{@used_tileset.delete(".png")}.pass")
pass = data_raw.scan(/\d+/)
@tile_data = pass.collect! &:to_i
Kod: Zaznacz cały
def get_tile_info(x,y,pos=:down)
tile_x = (x/16).to_i
tile_y = (y/16).to_i
case pos
when :up
tile_y -= 2
when :right
tile_x += 1
tile_y -= 1
when :left
tile_x -= 1
tile_y -= 1
end
return @tile_data[@level[0][tile_y][tile_x]]
end
Kod: Zaznacz cały
if $window.button_down?(KbLeft) and ![1,2].include?(get_tile_info(@player.get_x, @player.get_y, :left)) then
@player.move_left
end
if $window.button_down?(KbRight) and ![1,2].include?(get_tile_info(@player.get_x, @player.get_y, :right)) then
@player.move_right
end
@player.update
if [0,2].include?(get_tile_info(@player.get_x, @player.get_y,:down)) then
@player.fall
else
@player.reset_acceleration
end
if @player.is_jumping? then
if get_tile_info(@player.get_x, @player.get_y,:up) != 0 then
@player.reset_jump
end
end
Kod: Zaznacz cały
if [1,3,5,6].include?(get_tile_info(@player.get_x, @player.get_y,:down)) then
@player.jump
end
Kod: Zaznacz cały
# Initialize:
@spawn_x = x
@spawn_y = y
def respawn
@real_x = @spawn_x
@real_x = @spawn_y
@x = @real_x + (@sprite[0].width / 2)
@y = @real_y + @sprite[0].height
end
Kod: Zaznacz cały
if [0,2,4].include?(get_tile_info(@player.get_x, @player.get_y,:down)) then
@player.fall
if get_tile_info(@player.get_x, @player.get_y,:down) == 4 then
@player.respawn
end
else
Kod: Zaznacz cały
while ![0,2].include?(get_tile_info(@player.get_x, @player.get_y - 1, :down)) do
@player.move_up
end
Kod: Zaznacz cały
def move_up
@y -= 1
end
Kod: Zaznacz cały
if get_tile_info(@player.get_x, @player.get_y,:down) == 5 then
@player.slide_left
elsif get_tile_info(@player.get_x, @player.get_y,:down) == 6 then
@player.slide_right
end
Kod: Zaznacz cały
def slide_left
@x -= random(3,5)
@y -= random(1,4)
@dir = :left
@sprite = @jump_left
end
def slide_right
@x += random(3,5)
@y -= random(1,4)
@dir = :right
@sprite = @jump_right
end
Kod: Zaznacz cały
if in_hidden_entrance then
end
Kod: Zaznacz cały
def in_hidden_entrance
tile_x = (@player.get_x/16).to_i
tile_y = (@player.get_y/16).to_i
if @level[1][tile_y-1][tile_x] > 0 then
return true
else
return false
end
end
Kod: Zaznacz cały
#Update
if in_hidden_entrance then
@hidden_tiles = []
for y in 0...@level[1].size
for x in 0...@level[1][y].size
curx = (x * 16) + 8
cury = (y * 16) + 8
dist = Gosu::distance(@player.get_x, @player.get_y(:center), curx, cury)
if dist < 32 then
@hidden_tiles << [x,y]
end
end
end
else
@hidden_tiles = []
end
Kod: Zaznacz cały
# Zmiana do zwracania wartości y
def get_y(arg = nil)
return @y if arg == nil
return @real_y + @sprite[0].height / 2 if arg == :center
end
Kod: Zaznacz cały
for l in 0...@level.size
for y in 0...@level[l].size
for x in 0...@level[l][y].size
if l == 1 then
if @hidden_tiles.include?([x,y]) then
@tileset[@level[l][y][x]].draw((x*16)-@camera_x,(y*16)-@camera_y,l+1,1,1,Color.new(160,255,255,255))
else
@tileset[@level[l][y][x]].draw((x*16)-@camera_x,(y*16)-@camera_y,l+1)
end
else
@tileset[@level[l][y][x]].draw((x*16)-@camera_x,(y*16)-@camera_y,l+1)
end
end
end
end
Kod: Zaznacz cały
classes = Dir.new("scripts/").entries
classes.delete(".")
classes.delete("..")
for i in 0...classes.size
require "scripts/#{classes[i]}"
end
Kod: Zaznacz cały
class GameCollectible
def initialize(x,y,kind)
end
def update
end
def draw(camera_x, camera_y, z = 1)
end
end
Kod: Zaznacz cały
class GameCollectible
def initialize(x,y,kind)
@x = x
@y = y
@kind = kind
@sprite = Image.load_tiles($window, "graphics/sprites/#{@kind.to_s}.png", 16,16,false)
case @kind
when :gem10
@score = 10
when :gem20
@score = 20
when :gem35
@score = 35
when :gem65
@score = 65
when :gem100
@score = 100
when :gem125
@score = 125
when :coingold
@score = 250
when :coinsilver
@score = 175
end
end
def update
end
def draw(camera_x, camera_y, z = 1)
frame = milliseconds / 150 % @sprite.size
@sprite[frame].draw(@x - camera_x, @y - camera_y, z)
end
end
Kod: Zaznacz cały
@entities = []
load_entities
@entities << GameCollectible.new(275,173,:gem10)
Kod: Zaznacz cały
@entities.each{|en| en.draw(@camera_x, @camera_y)}
Kod: Zaznacz cały
def get_x
return @x + @sprite[0].width/2
end
def get_y
return @y + @sprite[0].height/2
end
Kod: Zaznacz cały
@entities.each{|en|
en.update
dist = Gosu::distance(@player.get_x, @player.get_y(:center), en.get_x, en.get_y)
if dist < 20 then
p "collect!"
end
}
Kod: Zaznacz cały
def get_score
return @score
end
Kod: Zaznacz cały
class Text < Font
def initialize
@font = Font.new($window,"graphics/Cookies.ttf",20)
end
def draw_text(text,x,y,z,scale_x = 1.0, scale_y = 1.0, color = Color.new(255,255,255), mode = :default)
@font.draw(text,x,y,z,scale_x = 1.0, scale_y = 1.0, color = Color.new(255,255,255), mode = :default)
end
end
Kod: Zaznacz cały
$text = Text.new
Kod: Zaznacz cały
$text.draw_text("Score: #{@score}",16,16,10)
Kod: Zaznacz cały
@score += en.get_score
@entities.delete(en)
Kod: Zaznacz cały
@entities << GameCollectible.new(250,178,:coinsilver)
Kod: Zaznacz cały
# Initialize
@gem10_graphic = Image.load_tiles($window, "graphics/sprites/gem10.png", 16, 16, false)
@gem20_graphic = Image.load_tiles($window, "graphics/sprites/gem20.png", 16, 16, false)
@gem35_graphic = Image.load_tiles($window, "graphics/sprites/gem35.png", 16, 16, false)
@gem65_graphic = Image.load_tiles($window, "graphics/sprites/gem65.png", 16, 16, false)
@gem100_graphic = Image.load_tiles($window, "graphics/sprites/gem100.png", 16, 16, false)
@gem125_graphic = Image.load_tiles($window, "graphics/sprites/gem125.png", 16, 16, false)
@coinsilver_graphic = Image.load_tiles($window, "graphics/sprites/coinsilver.png", 16, 16, false)
@coingold_graphic = Image.load_tiles($window, "graphics/sprites/coingold.png", 16, 16, false)
# Click
elsif $window.mouse_x.between?(208,224) and $window.mouse_y.between?(352,368) then
select_object(:gem10)
elsif $window.mouse_x.between?(240,256) and $window.mouse_y.between?(352,368) then
select_object(:gem20)
elsif $window.mouse_x.between?(272,288) and $window.mouse_y.between?(352,368) then
select_object(:gem35)
elsif $window.mouse_x.between?(208,224) and $window.mouse_y.between?(384,400) then
select_object(:gem65)
elsif $window.mouse_x.between?(240,256) and $window.mouse_y.between?(384,400) then
select_object(:gem100)
elsif $window.mouse_x.between?(272,288) and $window.mouse_y.between?(384,400) then
select_object(:gem125)
elsif $window.mouse_x.between?(128,144) and $window.mouse_y.between?(432,448) then
select_object(:coinsilver)
elsif $window.mouse_x.between?(160,176) and $window.mouse_y.between?(432,448) then
select_object(:coingold)
# Draw
frame = milliseconds / 150 % @gem10_graphic.size
@gem10_graphic[frame].draw(208,352,1)
@gem20_graphic[frame].draw(240,352,1)
@gem35_graphic[frame].draw(272,352,1)
@gem65_graphic[frame].draw(208,384,1)
@gem100_graphic[frame].draw(240,384,1)
@gem125_graphic[frame].draw(272,384,1)
frame = milliseconds / 150 % @coinsilver_graphic.size
@coinsilver_graphic[frame].draw(128,432,1)
@coingold_graphic[frame].draw(160,432,1)
# Drawing all objects on map
for i in 0...@objects.size
case @objects[i][0]
when :player
frame = milliseconds / 150 % @player_graphic.size
rx = @objects[i][1] - (@offset_x * 16) + 368
ry = @objects[i][2] - (@offset_y * 16) + 160
@player_graphic[frame].draw(rx,ry,6)
when :gem10
frame = milliseconds / 150 % @gem10_graphic.size
rx = @objects[i][1] - (@offset_x * 16) + 368
ry = @objects[i][2] - (@offset_y * 16) + 160
@gem10_graphic[frame].draw(rx,ry,6)
when :gem20
frame = milliseconds / 150 % @gem10_graphic.size
rx = @objects[i][1] - (@offset_x * 16) + 368
ry = @objects[i][2] - (@offset_y * 16) + 160
@gem20_graphic[frame].draw(rx,ry,6)
when :gem35
frame = milliseconds / 150 % @gem10_graphic.size
rx = @objects[i][1] - (@offset_x * 16) + 368
ry = @objects[i][2] - (@offset_y * 16) + 160
@gem35_graphic[frame].draw(rx,ry,6)
when :gem65
frame = milliseconds / 150 % @gem10_graphic.size
rx = @objects[i][1] - (@offset_x * 16) + 368
ry = @objects[i][2] - (@offset_y * 16) + 160
@gem65_graphic[frame].draw(rx,ry,6)
when :gem100
frame = milliseconds / 150 % @gem10_graphic.size
rx = @objects[i][1] - (@offset_x * 16) + 368
ry = @objects[i][2] - (@offset_y * 16) + 160
@gem100_graphic[frame].draw(rx,ry,6)
when :gem125
frame = milliseconds / 150 % @gem10_graphic.size
rx = @objects[i][1] - (@offset_x * 16) + 368
ry = @objects[i][2] - (@offset_y * 16) + 160
@gem125_graphic[frame].draw(rx,ry,6)
when :coinsilver
frame = milliseconds / 150 % @coinsilver_graphic.size
rx = @objects[i][1] - (@offset_x * 16) + 368
ry = @objects[i][2] - (@offset_y * 16) + 160
@coinsilver_graphic[frame].draw(rx,ry,6)
when :coingold
frame = milliseconds / 150 % @coinsilver_graphic.size
rx = @objects[i][1] - (@offset_x * 16) + 368
ry = @objects[i][2] - (@offset_y * 16) + 160
@coingold_graphic[frame].draw(rx,ry,6)
end
end
# Object info
case @object_held
when nil
when :player
@player_graphic[0].draw($window.mouse_x, $window.mouse_y,10)
when :gem10
@gem10_graphic[0].draw($window.mouse_x, $window.mouse_y,10)
when :gem20
@gem20_graphic[0].draw($window.mouse_x, $window.mouse_y,10)
when :gem35
@gem35_graphic[0].draw($window.mouse_x, $window.mouse_y,10)
when :gem65
@gem65_graphic[0].draw($window.mouse_x, $window.mouse_y,10)
when :gem100
@gem100_graphic[0].draw($window.mouse_x, $window.mouse_y,10)
when :gem125
@gem125_graphic[0].draw($window.mouse_x, $window.mouse_y,10)
when :coinsilver
@coinsilver_graphic[0].draw($window.mouse_x, $window.mouse_y,10)
when :coingold
@coingold_graphic[0].draw($window.mouse_x, $window.mouse_y,10)
end
Kod: Zaznacz cały
def load_entities
for i in 0...@objects.size
case @objects[i][0]
when :player
@player = Player.new(@objects[i][1], @objects[i][2])
when :gem10, :gem20, :gem35, :gem65, :gem100, :gem125, :coinsilver, :coingold
@entities << GameCollectible.new(@objects[i][1], @objects[i][2], @objects[i][0])
end
end
end
Fakt, "trochę" bardzo zaniedbałem te poradniki, i powodów ku temu jest w sumie kilka, głównie brak czasu i motywacji. Ale postaram się jeszcze dzisiaj dokończyć już zaczętą lekcję 8 i wrzucić wam.Hubertov pisze:Co dalej? Czemu nic nie wrzucasz? :(
Kod: Zaznacz cały
when :invulnerability
Kod: Zaznacz cały
when :invulnerability
@score = -1
Kod: Zaznacz cały
if @kind == :invulnerability then
@sprite = Image.load_tiles($window, "graphics/sprites/#{@kind.to_s}.png", 32,32,false)
else
@sprite = Image.load_tiles($window, "graphics/sprites/#{@kind.to_s}.png", 16,16,false)
end
Kod: Zaznacz cały
@entities.each{|en|
en.update
dist = Gosu::distance(@player.get_x, @player.get_y(:center), en.get_x, en.get_y)
if dist < 20 then
@score += en.get_score
@entities.delete(en)
end
}
Kod: Zaznacz cały
if dist < 20 then
if en.get_score < 0 then
p "invulnerability"
@entities.delete(en)
else
@score += en.get_score
@entities.delete(en)
end
end
Kod: Zaznacz cały
#Initialize
@invulnerability = 0
@color_alter = 255
def invulnerable
@invulnerability = 300
@color_alter = 165
end
Kod: Zaznacz cały
if @invulnerability > 0 then
@invulnerability -= 1
@color_alter += 0.3
end
Kod: Zaznacz cały
@sprite[frame].draw(@real_x - camera_x, @real_y - camera_y, z, 1.0, 1.0, Color.new(@color_alter,@color_alter,@color_alter,@color_alter))
Kod: Zaznacz cały
if @invulnerability > 0 then
bar_width = (32 * @invulnerability) / 300
$window.draw_quad(@real_x - camera_x, @real_y - camera_y - 4, Color.new(255,35,35),
@real_x - camera_x + bar_width, @real_y - camera_y - 4, Color.new(35,255,35),
@real_x - camera_x + bar_width, @real_y - camera_y, Color.new(35,255,35),
@real_x - camera_x, @real_y - camera_y, Color.new(255,35,35), z)
end
Kod: Zaznacz cały
return if @invulnerability > 0
Kod: Zaznacz cały
when :gem10, :gem20, :gem35, :gem65, :gem100, :gem125, :coinsilver, :coingold
Kod: Zaznacz cały
@jump_sound = Sample.new($window, "audio/sounds/04-Jump.ogg")
Kod: Zaznacz cały
@jump_sound.play
Kod: Zaznacz cały
if [:gem10, :gem20, :gem35, :gem65, :gem100, :gem125].include?(@kind) then
@sound = Sample.new($window, "audio/sounds/09-Gem.wav")
elsif [:coingold, :coinsilver].include?(@kind) then
@sound = Sample.new($window, "audio/sounds/10-Coin.wav")
elsif @kind == :invulnerability then
@sound = Sample.new($window, "audio/sounds/11-Invincibility.ogg")
end
Kod: Zaznacz cały
@fall = 0
Kod: Zaznacz cały
def fall
if @jump == 0 then
@y += @v_acc
@v_acc = @v_acc * 1.25
@v_acc = @max_v_acc if @v_acc > @max_v_acc
if @dir == :left then
@sprite = @jump_left
elsif @dir == :right then
@sprite = @jump_right
end
@fall += 1 # <<<<<<
end
end
Kod: Zaznacz cały
def reset_acceleration
@v_acc = 1
@fall = 0
end
Kod: Zaznacz cały
if id == KbUp then
if [1,3,4,5,6].include?(get_tile_info(@player.get_x, @player.get_y,:down)) then
@player.jump if @player.get_fall < 5
end
Kod: Zaznacz cały
if [1,3,4,5,6].include?(get_tile_info(@player.get_x, @player.get_y,:down)) then
@player.jump
else
end
Kod: Zaznacz cały
if @player.get_fall < 5 then
@player.jump
end
#=====
@player.jump if @player.get_fall < 5
Kod: Zaznacz cały
if [1,3,4,5,6].include?(get_tile_info(@player.get_x, @player.get_y,:down)) then
@player.jump
elsif @player.get_fall < 5 then
@player.jump
end
Kod: Zaznacz cały
class GameMine
def initialize(x,y)
@x = x
@y = y
@cooldown = random(1,5).to_i * 60
p "Cooldown set at #{@cooldown} frames"
@sprite = Image.load_tiles($window,"graphics/sprites/mine_floor.png", -4, -1, false)
end
def update
end
def get_x
return @x
end
def get_y
return @y
end
def draw(camera_x, camera_y, z = 1)
frame = milliseconds / 150 % @sprite.size
@sprite[frame].draw(@x - camera_x, @y - camera_y, z)
end
end
Kod: Zaznacz cały
if id == KbF9 then
@entities << GameMine.new(314, 208)
end
Kod: Zaznacz cały
@countdown = false
@exploded = false
Kod: Zaznacz cały
def update
return if @exploded
if @countdown then
@cooldown -= 1 if @cooldown > 0
end
if @cooldown == 0 then
@exploded = true
@countdown = false
end
end
Kod: Zaznacz cały
def mine_exploded?
return @exploded
end
Kod: Zaznacz cały
def in_range?(px,py)
end
Kod: Zaznacz cały
def in_range?(px,py)
return if @countdown
return if @cooldown == 0
return if py < (@y - 48)
return if py > (@y + 16)
if Gosu::distance(@x, @y, px,py) < 80 then
p "in range"
@countdown = true
end
end
Kod: Zaznacz cały
if en.is_a?(GameMine) then
en.in_range?(@player.get_x, @player.get_y)
end
Kod: Zaznacz cały
@entities.each{|en|
en.update
if en.is_a?(GameMine) then
en.in_range?(@player.get_x, @player.get_y)
elsif en.is_a?(GameCollectible) then
dist = Gosu::distance(@player.get_x, @player.get_y(:center), en.get_x, en.get_y)
if dist < 20 then
if en.get_score < 0 then
@player.invulnerable
@entities.delete(en)
else
@score += en.get_score
@entities.delete(en)
end
end
end
}
Kod: Zaznacz cały
@beep = Sample.new($window, "audio/sounds/beep.wav")
Kod: Zaznacz cały
if @cooldown % 60 == 0 and @countdown then
@beep.play
end
Kod: Zaznacz cały
def draw(camera_x, camera_y, z = 1)
frame = milliseconds / 150 % @sprite.size
if @countdown and [0,1,2,3,4,5,6].include?(@cooldown % 60) then
@sprite[frame].draw(@x - camera_x, @y - camera_y, z, 1, 1, Color::WHITE)
else
@sprite[frame].draw(@x - camera_x, @y - camera_y, z)
end
end
Kod: Zaznacz cały
if @countdown then
if @cooldown > 60 then
if @cooldown % 60 == 0 then
@beep.play
end
else
if @cooldown % 15 == 0 then
@beep.play
end
end
end
Kod: Zaznacz cały
if en.mine_exploded? then
p "mina wybucha"
if Gosu::distance(@player.get_x, @player.get_y, en.get_x, en.get_y) < 60 then
p "postac ginie"
end
@entities.delete(en)
end
Kod: Zaznacz cały
class GameDynamite
def initialize(x,y)
@x = x
@y = y
@cooldown = 180
@sprite = Image.load_tiles($window, "graphics/sprites/dynamite_floor.png", -4, -1, false)
@beep = Sample.new($window, "audio/sounds/beep.wav")
@explosion_sound = Sample.new($window, "audio/sounds/explosion.wav")
@exploded = false
end
def update
end
def dynamite_exploded?
return @exploded
end
def get_x
return @x
end
def get_y
return @y
end
def draw(camera_x, camera_y, z = 1)
frame = milliseconds / 150 % @sprite.size
@sprite[frame].draw(@x - camera_x, @y - camera_y, z)
end
end
Kod: Zaznacz cały
if id == KbRightControl then
@entities << GameDynamite.new(@player.get_x, @player.get_y)
end
Kod: Zaznacz cały
@y -= @sprite[0].height
Kod: Zaznacz cały
# Initialize
@v_acc = 1
@max_v_acc = 15
def fall
@y += @v_acc
@v_acc = @v_acc * 1.25
@v_acc = @max_v_acc if @v_acc > @max_v_acc
end
def move_up
@y -= 1
end
def get_y(arg = :real)
return @y if arg == :real
return @y + @sprite[0].height if arg == :bottom
end
Kod: Zaznacz cały
elsif en.is_a?(GameDynamite) then
# Gravity effect
if get_tile_info(en.get_x, en.get_y(:bottom), :down) == 0 then
en.fall
end
while ![0,2].include?(get_tile_info(en.get_x, en.get_y(:bottom) - 1, :down)) do
en.move_up
end
Kod: Zaznacz cały
if @cooldown > 60 then
if @cooldown % 60 == 0 then
@beep.play
end
else
if @cooldown % 15 == 0 then
@beep.play
end
end
@cooldown -= 1 if @cooldown > 0
if @cooldown == 0 then
@exploded = true
@explosion_sound.play
end
Kod: Zaznacz cały
if en.dynamite_exploded? then
if Gosu::distance(@player.get_x, @player.get_y, en.get_x, en.get_y) < 60 then
@player.respawn
end
@entities.delete(en)
end