HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0705
E.Tアクションゲームの作り方10解決


E.T

リンク

2014/7/5(Sat) 19:37:57|NO.62764

横スクロールのアクションゲームについて質問します。
とりあえずチャレンジしようと思ったんですが具体的にどのような
プログラムを組めばいいかわかりません。
とりあえずhttp://dev.onionsoft.net/seed/info.ax?id=373のようなゲームを作りたいです。
先日とりあえずチャレンジしたんですがマップの作り方で行き詰ってしましました。
どうすればいいか解説お願いします。



この記事に返信する


たんす

リンク

2014/7/7(Mon) 18:41:21|NO.62778

とりあえず、行き詰ったところまでを公開してみては?
今のままでは問題点も分かりません。



E.T

リンク

2014/7/7(Mon) 19:06:59|NO.62779

とりあえずhttp://1drv.ms/1xF8YCBにできている部分をUPしました。
表示されるマップの一番下がなぜか空白になってしまいます。
マップのデータはmapフォルダの001.txtです。



kanahiron

リンク

2014/7/7(Mon) 20:45:21|NO.62780

マップのテキストデータから0,1に変換するときに改行コードを考えていないのが原因じゃないでしょうか
またcellputで画像を置いていますが、横縦のループ回数を決め打ちしているのは何ででしょう…



暇人

リンク

2014/7/7(Mon) 21:55:54|NO.62782

>表示されるマップの一番下がなぜか空白になってしまいます。
マップデータが縦14列なんだから当然じゃ?
32*14=448

地面の部分が抜けてる所があるのはNO.62780の理由で
変換した数と描画時に利用する数が違ってしまってる

notegetかsplitで改行を無くして処理した方が楽
後、map配列は二次元配列で管理したほうが分かりやすい

後からマップデータのサイズが変わってもスクリプトの修正が必要無いようにしたサンプル
スクロールにも対応

//ウィンドウ screen 0 , 640 , 480 title "壁の画像作るのがめんどいのでとりあえずキャラクターで表示" //ERROR onerror *error //ロード中画像 buffer 1 celload "dat\\load.bmp",1,0 //ロード中表示 gsel 0,2 gcopy 1,0,0,640,480 //画像準備 buffer 2 celload "dat\\character.bmp" csrc=stat celdiv csrc,32,32 ////////////////////////////////////////////////////// //変数準備 sdim mapd,4000 //マップデータ読み込み notesel mapd ;noteload "map\\001.txt" //横38、縦15 mapd={" 11111111111111111111111111111111111111 11000000000000000000000000000000000001 10100000000000000000000000000000000001 10010000000000000000000000000000000001 10001000000000000000000000000000000001 10000100000000000000000000000000000001 10000010000000000000000000000000000001 10000001000000000000000000000000000001 10000000100000000000000000000000000001 10000000010000000000000000000000000001 10000000001000000000000000000000000001 10000000000100000000000000000000000001 10000000000010000000000000000000000001 10000000000001000000000000000000000001 11111111111111111111111111111111111111"} noteget mdat,0 mapmaxx=strlen(mdat) mapmaxy=notemax dim map,mapmaxx+1,mapmaxy+1 //一つ多く確保しとくと色々楽なので・・・ repeat mapmaxy noteget mdat,cnt y=cnt repeat mapmaxx map(cnt,y)=peek(mdat,cnt)-'0' loop loop maploopx=limit(ginfo_winx/32+1,0,mapmaxx) //スクロールするには1チップ多く必要なので+1 maploopy=limit(ginfo_winy/32+1,0,mapmaxy) //ロード中非表示 gsel 0,2 cls title "マップX="+mapmaxx+" Y="+mapmaxy *main redraw 0 stick k,$ff if k&1{mapscrollx+3} if k&4{mapscrollx-3} if k&2{mapscrolly+3} //マップデータの縦を画面より大きくすれば縦のスクロールもする if k&8{mapscrolly-3} mapscrollx=limit(mapscrollx,-(mapmaxx-maploopx+1)*32,0) //横スクロール範囲制限 mapindexx=abs(mapscrollx/32) //横に何個ずらすか mscx=mapscrollx\32 //画面左端のチップ描画位置 mapscrolly=limit(mapscrolly,-(mapmaxy-maploopy+1)*32,0) //縦スクロール範囲制限 mapindexy=abs(mapscrolly/32) //縦に何個ずらすか mscy=mapscrolly\32 //画面上端のチップ描画位置 //マップ書き込み y=mapindexy repeat maploopy pos mscx,mscy+cnt*32 //celputはY座標を固定して横に描画サイズ分ずれるので座標の変更は縦が変わる時だけで良い repeat maploopx,mapindexx //cntがmapindexxから始まる celput csrc,map(cnt,y) loop y+ loop await 16 redraw 1 goto *main stop ///////////////////////////////////////////////////// *error dialog "エラーが発生しました",1,"走れJUMP君! ERROR" end



E.T

リンク

2014/7/7(Mon) 22:47:08|NO.62783

上のプログラムはだいたい理解でかました
当たり判定はどのようにすればいいのでしょうか?



メソ

リンク

2014/7/7(Mon) 23:58:07|NO.62784

当たり判定も
dim hantei,38,15
とかで作って

自己座標x,yが移動した時にその先が0以外である場合〜とか
まずマップのナンバーから当たり判定を取得
repeat y
repeat x
if map(x,y) = 0: hantei(x,y) = 0
if map(x,y) = 1: hantei(x,y) = 1
if map(x,y) = 2: hantei(x,y) = 1
if map(x,y) = 3: hantei(x,y) = 0
以降も任意で
loop
loop

移動した先が0で無い場合戻るif hantei(x,y) ! 0: x - a
aは移動した時のベクトル値をそのままマイナスする
とか
移動先が0で無い場合移動できないif 移動キー & hantei(x+a,y+b) ! 0:
とかでそもそも移動そのものを止めるか



E.T

リンク

2014/7/8(Tue) 06:54:33|NO.62785

改造してみてプレイヤーを表示させてみようとしたらなぜか表示されません…


//ウィンドウ screen 0 , 640 , 480 title "" //ERROR onerror *error //ロード中画像 buffer 1 celload "dat\\load.bmp",1,0 //ロード中表示 gsel 0,2 gcopy 1,0,0,640,480 //画像準備 buffer 2 celload "dat\\character.bmp" csrc=stat celdiv csrc,32,32 ////////////////////////////////////////////////////// //変数準備 sdim mapd,4000 sdim map,4000 x=1:y=1 //マップデータ読み込み notesel mapd ;noteload "map\\001.txt" //横38、縦15 mapd={" 11111111111111111111111111111111111111 10000000000000000000000000000000000001 10000000000000000000000000000000000001 10000000000000000000000000000000000001 10000000000000000000000000000000000001 10000000000000000000000000000000000001 10000000000000000000000000000000000001 10000000000000000000000000000000000001 10000000000000000111110000000000000001 10000000000000000000000000000000000001 10000000000000000000010000000000000001 10000000000000000000000000000000000001 10000000000001111111110000000000000001 10000000000011111111110000000000000001 11111111111111111111111111111111111111"} noteget mdat,0 mapmaxx=strlen(mdat) mapmaxy=notemax dim map,mapmaxx+1,mapmaxy+1 //一つ多く確保しとくと色々楽なので・・・ repeat mapmaxy noteget mdat,cnt y=cnt repeat mapmaxx map(cnt,y)=peek(mdat,cnt)-'0' loop loop maploopx=limit(ginfo_winx/32+1,0,mapmaxx) //スクロールするには1チップ多く必要なので+1 maploopy=limit(ginfo_winy/32+1,0,mapmaxy) //ロード中非表示 gsel 0,2 cls title "マップX="+mapmaxx+" Y="+mapmaxy *main gosub *mapmain //マップ gosub *idou //移動 goto *main /*------------------------------------------------------------------------------*/ *mapmain redraw 0 stick k,$ff if k&1{mapscrollx+3} if k&4{mapscrollx-3} if k&2{mapscrolly+3} //マップデータの縦を画面より大きくすれば縦のスクロールもする if k&8{mapscrolly-3} mapscrollx=limit(mapscrollx,-(mapmaxx-maploopx+1)*32,0) //横スクロール範囲制限 mapindexx=abs(mapscrollx/32) //横に何個ずらすか mscx=mapscrollx\32 //画面左端のチップ描画位置 mapscrolly=limit(mapscrolly,-(mapmaxy-maploopy+1)*32,0) //縦スクロール範囲制限 mapindexy=abs(mapscrolly/32) //縦に何個ずらすか mscy=mapscrolly\32 //画面上端のチップ描画位置 //マップ書き込み y=mapindexy repeat maploopy pos mscx,mscy+cnt*32 //celputはY座標を固定して横に描画サイズ分ずれるので座標の変更は縦が変わる時だけで良い repeat maploopx,mapindexx //cntがmapindexxから始まる celput csrc,map(cnt,y) loop y+ loop await 16 redraw 1 return /*------------------------------------------------------------------------------*/ *idou //左へ getkey ki,37 if ki=1 and map(x-1,y) ! 0 : ppx-1 //右へ getkey ki,39 if ki=1 and map(x+1,y) ! 0 : ppx+1 gsel 0,1 celput csrc,3 return /*------------------------------------------------------------------------------*/ ///////////////////////////////////////////////////// *error dialog "エラーが発生しました",1,"" end



E.T

リンク

2014/7/8(Tue) 17:56:18|NO.62788

新しくhttp://1drv.ms/1xF8YCBに更新したものをUPしました。
もう少し動きはよくできないでしょうか?
32ドットずつの移動のやり方しか分からないです。
それと画面の上や下、左、右など端に近づいたら画面をスクロールさせるには
どうしたらいいですか?



暇人

リンク

2014/7/9(Wed) 00:38:47|NO.62791

NO.62788のは中身同じ?(zipファイル名は違ってたけど・・・)
なのでNO.62788がどこまで出来てるのかわからないけど
画面端を越えてそちらにスクロールできるならスクロールするサンプル

//ウィンドウ screen 0 , 640 , 480 title "壁の画像作るのがめんどいのでとりあえずキャラクターで表示" //ERROR onerror *error //ロード中画像 buffer 1 celload "dat\\load.bmp",1,0 //ロード中表示 gsel 0,2 gcopy 1,0,0,640,480 //画像準備 buffer 2 celload "dat\\character.bmp" csrc=stat celdiv csrc,32,32 celload "dat\\character.bmp" //描画基点をキャラ中心にしたいので自分キャラ用にロード myid=stat celdiv myid,32,32,16,16 ////////////////////////////////////////////////////// //変数準備 sdim mapd,4000 //マップデータ読み込み notesel mapd ;noteload "map\\001.txt" //横20*2、縦15*3 (必ず1画面分の倍数にする必要がある) mapd={" 1111111111111111111111111111111111111111 1100000000000000000000000000000000000001 1010000000000000000000000000000000000001 1001000000000000000000000000000000000001 1000100000000000000000000000000000000001 1000010000000000000000000000000000000001 1000001000000000000000000000000000000001 1000000100000000000000000000000000000001 1000000010000000000000000000000000000001 1010000000000000000000010000000000000001 1001000000000000000000001000000000000001 1000100000000000000000000100000000000001 1000010000000000000000000010000000000001 1000000000100000000000000000000000000001 1000000001000000000000000000000000000001 1000000001000000000000000000000000000001 1000000000100000000000000000000000000001 1000000000010000000000000000000000000001 1000000000010000000000000000000000000001 1000000000010000000000000000000000000001 1100000000000000000000000000000000000001 1010000000000000000000000000000000000001 1100000000000000000000000000000000000001 1010000000000000000000010000000000000001 1001000000000000000000001000000000000001 1000100000000000000000000100000000000001 1000010000000000000000000010000000000001 1000000000100000000000000000000000000001 1000000000010000000000000000000000000001 1000000000010000000000000000000000000001 1000000000010000000000000000000000000001 1010000000000000000000000000000000000001 1100000000000000000000000000000000000001 1010000000000000000000010000000000000001 1001000000000000000000001000000000000001 1000100000000000000000000100000000000001 1000010000000000000000000010000000000001 1000001000000000000000000001000000000001 1000000100000000000001000000000000000001 1000000010000000000000100000000000000001 1000000001000000000000010000000000000001 1000000001000000000000000000000000000001 1000000000100000000000000000000000000001 1000000000010000000000000000000000000001 1111111111111111111111111111111111111111"} noteget mdat,0 mapmaxx=strlen(mdat) mapmaxy=notemax dim map,mapmaxx+1,mapmaxy+1 //一つ多く確保しとくと色々楽なので・・・ repeat mapmaxy noteget mdat,cnt y=cnt repeat mapmaxx map(cnt,y)=peek(mdat,cnt)-'0' loop loop maploopx=(ginfo_winx/32) scrmaxx=-(mapmaxx-maploopx)*32 maploopy=(ginfo_winy/32) scrmaxy=-(mapmaxy-maploopy)*32 //ロード中非表示 gsel 0,2 cls title "マップX="+mapmaxx+" Y="+mapmaxy mpx=320 mpy=240 *main redraw 0 stick k,$ff if k&1{//左に移動 mpx-3 if mpx<0 {//画面左端を越えた if mapscrollx < 0 {//左にスクロールできる mapscrollx+ginfo_winx //一画面分スクロール mpx+ginfo_winx //キャラ座標を一画面分右に移動して右端に移動 }else{//もう左にはスクロールできない mpx=0 } } } if k&4{ mpx+3 if mpx>ginfo_winx { if mapscrollx > scrmaxx{ mapscrollx-ginfo_winx mpx-ginfo_winx }else{ mpx=ginfo_winx } } } if k&2{ mpy-3 if mpy<0 { if mapscrolly ! 0 { mapscrolly+ginfo_winy mpy+ginfo_winy }else{ mpy=0 } } } if k&8{ mpy+3 if mpy>ginfo_winy { if mapscrolly ! scrmaxy{ mapscrolly-ginfo_winy mpy-ginfo_winy }else{ mpy=ginfo_winy } } } mapindexx=abs(mapscrollx/32) //横に何個ずらすか mapindexy=abs(mapscrolly/32) //縦に何個ずらすか //マップ書き込み y=mapindexy repeat maploopy pos 0,cnt*32 //celputはY座標を固定して横に描画サイズ分ずれるので座標の変更は縦が変わる時だけで良い repeat maploopx,mapindexx //cntがmapindexxから始まる celput csrc,map(cnt,y) loop y+ loop pos mpx,mpy celput myid,1+(gettime(7)/200)\2 //キャラ座標をチップサイズで割ればmap(,)のインデックスになる(スクロール分を足せばスクロール後のインデックスになる) //逆にインデックスにチップサイズを掛ければスクリーン座標になる(スクロール分を足してるとマップ空間の座標になる) if map(mpx/32+mapindexx,mpy/32+mapindexy) {color 100,100,100:pos mpx-16,mpy-32:mes "接触 \nX("+(mpx/32+mapindexx)+")\nY("+(mpy/32+mapindexy)+")"} await 16 redraw 1 goto *main stop ///////////////////////////////////////////////////// *error dialog "エラーが発生しました",1,"走れJUMP君! ERROR" end



E.T

リンク

2014/7/9(Wed) 18:58:19|NO.62792

ありがとうございます。
これでアクションゲームの作り方がわかりました。
また何かあったらお願いします。



ONION software Copyright 1997-2021(c) All rights reserved.