Kirjautuminen

Haku

Tehtävät

Keskustelu: Projektit: Tilemap kirjasto peliohjelmointiin

jalski [24.02.2022 18:29:54]

#

Kirjoittelin yhden pekkaspäivän aikana kirjaston, jonka avulla olisi tarkoitus kirjoitella tasohyppely. Tällä hetkellä isoin osa toiminnalisuutta on toteutettu, mutta en ole koodia vielä yrittänyt optimoida.

Olen testannut toimintaa Raspberry PI 4B:llä ja toimii kohtuullisen kivasti. Laitan kirjaston ja koodin saataville tasohyppely demon kanssa kun saan pari juttua vielä toteutettua.

Olisi kiva, jos joku uskaltautuisi kokeilemaan miten alla oleva testiohjelma toimii pöytäkoneella. Paketissa 64-bittiset binäärit useimmille käyttöjärjestelmille. Linux:in päällä toimii myös ilman X-ikkuna tukea ja itse ajaisin niin.

testi ohjelma

_Pete_ [26.02.2022 15:51:54]

#

Onko mukana myös FPS rajoitin? Jos ei niin ei s ovellu lauta peleihin? :)

vesikuusi [26.02.2022 23:04:24]

#

win64: siinä se vieritti ruutua mäpin reunasta reunaan. Näytti toimivan OK? Oletko hankkinut tasohyppelylisenssin viestintävirastolta?

jalski [27.02.2022 13:07:02]

#

vesikuusi kirjoitti:

win64: siinä se vieritti ruutua mäpin reunasta reunaan. Näytti toimivan OK? Oletko hankkinut tasohyppelylisenssin viestintävirastolta?

Viitsitkö vielä kokeilla tätä

Tuo on yksinkertainen kirjastolla tehty tasohyppelyn runko. Kiinnostaa miten pyörii oikealla raudalla.

Pitänee varmaan kysyä viestintäviraston kantakin asiaan... ;)

jalski [27.02.2022 19:56:37]

#

Alla esimerkkinä Super Mario tyylisen tasohyppelyn minimi toteutus. Tältä se siis näyttää.

needs nk/gui
needs nk/keyboard
needs games/state
needs games/tilemap

22 font:system font:new "font1" font:atlas! drop

800 constant SCREEN-WIDTH
600 constant SCREEN-HEIGHT

640 constant VIEWPORT-WIDTH
480 constant VIEWPORT-HEIGHT

SCREEN-WIDTH 2 n:/ VIEWPORT-WIDTH 2 n:/ n:- constant VIEWPORT-X
SCREEN-HEIGHT 2 n:/ VIEWPORT-HEIGHT 2 n:/ n:- constant VIEWPORT-Y

32 constant TILE-WIDTH
32 constant TILE-HEIGHT

64 constant SPRITE-WIDTH
64 constant SPRITE-HEIGHT
SPRITE-WIDTH 2 n:* constant 2X-SPRITE-WIDTH

true constant WAIT-VSYNC

1 60 n:/ constant DT

\ Game states.
0 constant MAIN

{
  bg: "black",
  padding: [0,0],
 flags: [ @nk:WINDOW_NO_SCROLLBAR ]
} constant main-render

"data/mariol.png" img:new constant mariol-img
"data/marior.png" img:new constant marior-img

"data/tiles.png" img:new TILE-WIDTH TILE-HEIGHT "data/level.map" map:load constant level
"data/tiles.png" img:new TILE-WIDTH TILE-HEIGHT "data/collision.map" map:load constant collision
VIEWPORT-WIDTH VIEWPORT-HEIGHT VIEWPORT-X VIEWPORT-Y viewport:new constant vp

level map:rect@ nip 2 a:@ nip constant MAP-WIDTH

0.5 constant GRAVITY

var x
var y
var dx
var dy
var scrollx
var jumping
var scrolling
var flipx
var delay
var frame
[@marior-img, @mariol-img] var, image
var bottom
var top
var left
var right
var time

: init
  \ Initial map position
  0 0 2 a:close dup
  level swap map:pos! drop
  collision swap map:pos! drop

  \ Init player
  160 x !
  224 y !
  0 dx !
  0 dy !
  0 frame !
  5 dup delay ! time !
  false jumping !
  0 scrollx !
  false scrolling !
  0 flipx !
  21 63 2 a:close 42 63 2 a:close 2 a:close bottom !
  21 0 2 a:close 42 0 2 a:close 2 a:close top !
  1 17 2 a:close 7 21 2 a:close 2 a:close left !
  56 21 2 a:close 63 21 2 a:close 2 a:close right ! ;

: animate-player
  -1 time n:+!
  time @ 0 n:> not if
    jumping @ if
      2 frame !
    else
      dx @ 0 n:= not scrolling @ or if
        1 frame n:+!
        frame @ 2 n:mod frame !
      else
        0 frame !
      then
      delay @ time !
    then
  then ;

: draw-player
  x @ y @ SPRITE-WIDTH SPRITE-HEIGHT 4 a:close vp viewport:pos@ nip tilemap:rect-ofs+
  image @ flipx @ a:@ nip
  "white"
  0 frame @ SPRITE-HEIGHT n:* SPRITE-WIDTH SPRITE-HEIGHT 4 a:close
  nk:draw-sub-image ;

: tile-collision
  \ Sprite top to the top of viewport
  y @ 0 n:< if
    0 y !
    GRAVITY dy !
  then

  \ Platforms
  dy @ 0 n:> if
    collision vp viewport:pos@
    x @ y @ 2 a:close
    ' n:+ a:2map
    bottom @ flipx @ a:@ nip
    ' n:+ a:2map
    tilemap:color
    repeat
      xff7f00ff n:= not if
        break
      else
        -0.5 y n:+!
        collision vp viewport:pos@
        x @ y @ 2 a:close
        ' n:+ a:2map
        bottom @ flipx @ a:@ nip
        ' n:+ a:2map
        tilemap:color
      then
    again

    collision vp viewport:pos@
    x @ y @ 2 a:close
    ' n:+ a:2map
    bottom @ flipx @ a:@ nip
    ' n:+ a:2map
    1 a:@ n:1+ 1 swap a:!
    tilemap:color xff7f00ff n:= if
      0 dy !
      false jumping !
    then
  then

  \ Bottom of sprite
  collision vp viewport:pos@
  x @ y @ 2 a:close
  ' n:+ a:2map
  bottom @ flipx @ a:@ nip
  ' n:+ a:2map
  tilemap:color
  repeat
    xffff00ff n:= not if
      break
    else
      -0.5 y n:+!
      collision vp viewport:pos@
      x @ y @ 2 a:close
      ' n:+ a:2map
      bottom @ flipx @ a:@ nip
      ' n:+ a:2map
      tilemap:color
    then
  again

  collision vp viewport:pos@
  x @ y @ 2 a:close
  ' n:+ a:2map
  bottom @ flipx @ a:@ nip
  ' n:+ a:2map
  1 a:@ n:1+ 1 swap a:!
  tilemap:color xffff00ff n:= if
    0 dy !
    false jumping !
  then

  \ Right side of sprite
  collision vp viewport:pos@
  x @ y @ 2 a:close
  ' n:+ a:2map
  right @ flipx @ a:@ nip
  ' n:+ a:2map
  tilemap:color
  repeat
    xffff00ff n:= not if
      break
    else
      -0.5 x n:+!
      collision vp viewport:pos@
      x @ y @ 2 a:close
      ' n:+ a:2map
      right @ flipx @ a:@ nip
      ' n:+ a:2map
      tilemap:color
    then
  again

  \ Left side of sprite
  collision vp viewport:pos@
  x @ y @ 2 a:close
  ' n:+ a:2map
  left @ flipx @ a:@ nip
  ' n:+ a:2map
  tilemap:color
  repeat
    xffff00ff n:= not if
      break
    else
      0.5 x n:+!
      collision vp viewport:pos@
      x @ y @ 2 a:close
      ' n:+ a:2map
      left @ flipx @ a:@ nip
      ' n:+ a:2map
      tilemap:color
    then
  again ;

: new-win
  {
    name: "main",
    title: "Testing...",
    wide: @SCREEN-WIDTH,
    high: @SCREEN-HEIGHT,
    resizable: false,
    bg: "black"
  }
  nk:win ;

: draw
  level vp tilemap:draw
  draw-player ;

: update
  scan:LEFT nk:scancode? if
    -0.5 dx n:+!
    dx @ -4 n:< if
      -4 dx !
    then
    1 flipx !
    x @ 2X-SPRITE-WIDTH n:< scrollx @ 0 n:> and if
      true scrolling !
      dx @ scrollx n:+!
      scrollx @ 0 n:< if
        0 scrollx !
      then
      level scrollx @ 0 map:move drop
    else
      false scrolling !
    then
  else
    scan:RIGHT nk:scancode? if
      0.5 dx n:+!
      dx @ 4 n:> if
        4 dx !
      then
      0 flipx !
      x @ VIEWPORT-WIDTH 2X-SPRITE-WIDTH n:- SPRITE-WIDTH n:- n:> scrollx @ MAP-WIDTH VIEWPORT-WIDTH n:- n:< and if
        true scrolling !
        dx @ scrollx n:+!
        scrollx @ MAP-WIDTH VIEWPORT-WIDTH n:- n:> if
          MAP-WIDTH VIEWPORT-WIDTH n:- scrollx !
        then
        level scrollx @ 0 map:move drop
      else
        false scrolling !
      then
    else
      0 dx !
      false scrolling !
    then
  then

  scan:UP nk:scancode? jumping @ not and if
    -10.5 dy !
  then

  scrolling @ not if
    dx @ x n:+!
  then
  \ Guard player keeps within allowed bounds
  x @ 0 VIEWPORT-WIDTH SPRITE-WIDTH n:- n:clamp x !
  GRAVITY dy n:+!
  dy @ 0 n:= not if
    true jumping !
  then
  dy @ y n:+!

  tile-collision
  animate-player

  scan:ESCAPE nk:scancode? if
    bye
  then ;

: app:main
  new-win
  WAIT-VSYNC
  DT
  MAIN
  [ ' update ]
  [ ' draw ]
  main-render
  game:init
  init
  game:event-loop ;

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta