スキップしてメイン コンテンツに移動

HSPで作っているゲームでキャラが動くようになったよ!

ノーベル賞すごいね!
昨日と今日と続けて日本人がノーベル賞に選ばれていて、ニュースが楽しい。
世界の多くの人類や家畜を救う研究とか知らなかっただけですごい人が日本にいるんだなぁ。
ニュートリノに重さがあったとか、その分野の人にとっては大ニュースなんだろうなぁ。
ヒッグス粒子が重さの粒子とか聞いた気がするけど、それと関係あるのかな?

科学番組は好きだけど、
結局なんとなくしかわからない SakuraCrowd です。₍₍ (ง ˘ω˘ )ว ⁾⁾

進捗報告


先月下旬から作っているゲームなんですが、
マップの上をちょこまかとキャラが移動する仮組みを作ることができました!
ヽ( ´¬`)ノ ワ~イ !!


やしの木とかの前景にはキャラが隠れるようにしました。
あと、おおざっぱですが当たり判定をいれて、障害物がある場所は通れないようにしています。
移動は上下左右にななめを加えて8方向に対応しました。

パソコンもソフトウェアも進化しているらしく、高速化を意識していない処理でもさくさく動きます。ヽ( ´¬`)ノ ワ~イ !!
とはいっても、あからさまに無駄な処理はしないように注意しながら作りました。

おおざっぱな流れをいうと、

  1. 背景画像を描く
  2. キャラクタを描く
  3. 前景画像を描く
  4. 矢印キーの入力を調べて、キャラクタの向きと位置を変えたりする。
  5. 一定間隔でキャラクタのアニメーションのフレームを切り替える

この繰り返しです。

キャラクタは先日のブログに書いた方法で、パーツを重ねて描いています。
前景画像もキャラクタと基本的な処理は同じです。

入力処理


入力処理についてだけ、新しく追加したのでコードを抜粋します。

// 矢印キーにより移動させる
stick key, 15
dx = 0: dy = 0
if key&1 : dx -= 8
if key&4 : dx += 8
if key&2 : dy -= 8
if key&8 : dy += 8
if (dx != 0 or dy != 0) {
ScSpriteMoveBy IDX_SPRITE0, dx, dy, 1, idxPartAtariMap
}
await 33

stick という標準命令で矢印キーの入力状態を取得して、上下左右ごとに押されていたら移動量を変化させています。

ScSpriteMoveBy は自作の命令です。
当たり判定をして、障害物がない場合は指示されたとおりに移動します。


移動のときに進行方向を向くようにしています。

stick の第2引数


stick の 15 という引数は、押しっぱなしを入力として受け取るかを決めるマスク値です。
stick key, 15 だと矢印キーを押しっぱなしで、キャラクタが移動します。
stick key, 0 だと矢印キーを連打して1歩ずつ移動させないといけません。

stick では、ビット単位で入力の有無を表しています。
下位1ビットが左、2ビットが上、3ビットが右、4ビットが下です。

15 はバイナリだと 00001111 となり下位4ビットが全て 1 の状態です。
つまり、上下左右の矢印キーについては、押しっぱなしのときに入力を受け取る設定です。

stick は通常は押された瞬間しかビットを1にしません。
押しっぱなしだと、押された瞬間以外はビットは 0 です。
これが、マスクを指定すると、それに対応したビットは、押しっぱなしの間でもずっとビットが 1 になり、押されていることがわかります。

そういえば stick のほかにも2つほど便利な命令を見つけました。

便利な命令 await


入力処理にもでてきている await という命令は、 wait と似ていて指定した時間だけ待機します。

便利な点は、前回の await 終了時点からの経過時間を計測することです。
wait では wait 33 とすると呼び出しから 330 ミリ秒待ちます。

1回目の await が終わった後、処理に 15 ミリ秒かかったとします。
その後 2 回目の await 33 とすると 33 - 15 = 18 ミリ秒だけその場で待機します。
これにより FPS を簡単に管理することができます。
それと await は wait より 10 倍精度が高く指定でき、 1 ミリ秒単位で指定できます。

便利な命令 redraw


もうひとつの便利な命令は redraw です。
たくさんの描画処理を直接スクリーンにすると、画面がちらついて表示されます。
そのため、バッファに描いてから、完成したバッファの画像をスクリーンに転送するダブルバッファリングなどがあります。
しかし、 redraw を使うことでダブルバッファリングをしなくてもちらつきを防ぐことができます。

具体的には、
  1. redraw 0 // スクリーンに描画処理を反映しない
  2. 任意の描画処理
  3. redraw 1 // スクリーンに描画処理を反映する
というふうに、ちらついてしまう描画処理の間に redraw をはさみます。
redraw は gsel で選択しているスクリーンのみが対象になるので、 redraw の前に gsel でスクリーンの番号を指定したほうがよいです。

予定


次はマップをオートスクロールしたいと思います。

ハロウィン期間中にリリースしたいけど
絵も実装もまだぜんぜん足りないよおおお。。゚(゚´Д`゚)゚。
なるようになるか₍₍ (ง ˘ω˘ )ว ⁾⁾

コメント

このブログの人気の投稿

QTableView で表を表示してみる

タイトルは駄洒落を狙っているわけではありません。 こんばんわ SakuraCrowd です。 今回は今作っているソフトの経過報告です。 最近のブログのパターンは、 「XXX作ったよ。これがスクリーンショットね。あとこんなこと思ったよ。」 という流れですが、 今日はできていないソフトの部分的な話なので、 いつもよりもプログラムちっくな話になると思います。(´Ծ_Ծ´)メガネノトキハマジメブッテル QTableView は GUIライブラリ Qt のクラスです。 それを Python で使うための PySide というライブラリを使っています。 某表計算ソフト っぽい表の GUI です。 このデータの日付が 09/01 なのでおそらくその日に   QTableView 使うぞ!(`・ω・´) とサンプルデータを作ったのでしょう。 Qt Designer という GUI エディタを使うとポトペタでウィンドウを設計できます。 選択できる GUI の中に QTableView と QTableWidget があります。 どちらも上のような表の GUI です。 QTableWidget は 簡単 に値をいれたりできます。 Qt Designer 上で直接編集 することができるので、 サンプルの表を簡単に作ることができます。 それに対して、 QTableView は Qt Designer 上では値を編集できません。たぶん。 QTableView の強みは MVC の構造 を使えることです。 名前のとおり QTableView は View です。 これにデータを管理している Model オブジェクトを設定して使います。 Model クラスを作る手間がかかりますが、 GUI の細かな操作をしなくても Model に応じた表を表示してくれます。 Model は QAbstractTableModel を 継承 して作ります。 コンストラクタで基底クラスの処理を呼び出し、いくつかの純粋仮想関数をオーバーライドします。 def __init__ ( self , parent= None , *args):

LibreOffice Writer 文書の差分 (WinMerge x TortoiseGit) + 社畜PCの原因と対策

お久しぶりです。皆様におかれましてはお風邪などをひかれてはいませんでしょうか。 春と秋だけあればいいのにヽ(`Д´)ノとつい思ってしまう SakuraCrowd です。 今日はいつものような製作日記ではなく、ちょっとした役立つメモを書きました。 タイトルにもあるとおり、 TortoiseGit への WinMerge の導入の仕方です。 今まではソースコードくらいしか差分で確認しなかったので、 TortoiseGit 標準の Diff ツールで問題なかったのですが、 LibreOffice の Writer が最近自分の中で便利だと話題になっていて、それを差分表示するためにちょっと調べてみました。 #Writer は、文章書いて、ちょっと絵をいれたり表を作るのに便利だと思います。 #リッチテキストのエディタを探していて、これが一番よさそうな気がしたので使ってます。 それとブログを書くときはあまり長く書かないつもりだった、 Win7 PC が社畜PCになってしまった際の原因と対策も後半に書きました。割と有用な情報かもしれませんので、時間がありましたらご覧下さい。 まずは TortoiseGit で Writer の odt ファイルを管理して、差分も普通に表示させる方法です。 WinMerge(+plugin) 導入手順 すでに TortoiseGit はインストールしてある前提ではなします。 1.信頼と実績の窓の杜様から WinMerge 日本語版をダウンロードします。 WinMerge - 窓の杜ライブラリ 私の PC は 64 ビット版なのでそちらを選びました。 2.WinMerge をインストールします。 フォルダを指定し普通にインストールできます。 インストール直前の設定で TortoiseGit をチェックしておくと自動的に TortoiseGit の利用する Diff ツールの設定を置き換えてくれるようです。 これの設定は TortoiseGit の設定の Diff ツールの項目で確認できます。 3.LibreOffice Writer のファイルを読むためのプラグインをダウンロードします。 ぐぐって出てくる英語版のDLサイトは応答がなかったりしましたが、日本語版は大

QWidget の選択時のデザインを CSS で変える方法

ひさびさに書きやすいネタができたので、1ヶ月ぶりくらいに書きます。 ここ1ヶ月の作業内容 タイトルのとおりなのですが、 テーマがいきなりマニアックでとまどったり、 デスチェリー農場の続編はどうしたんだよおおおお! とか新作を楽しみにしている生命が宇宙のどこかにいるかもしれないので あらかじめ書いておくと、 ここ1ヶ月は日記ソフトを作ろうと python + pyside + sqlite の勉強をしていました。 勉強というか、ウィンドウ起動から初めて、 GUI をせっせと作ったり、ファイル保存と復元を作ったりしてます。 Copy & Paste や Redo/Undo など未実装の処理も多くあります。 今回は、タブ遷移とかクリックで選択されたウィジェットの、 背景色が変わるとか、 枠線が出るとか そんな設定を CSS で実現します。 PySide と CSS について PySide は前も Raspberry Pi 2 で使う mount コマンドの GUI ツールで使いました。 Python の GUI フレームワークです。 さすがに HSP ほど簡単にウィンドウを出すことはできませんが、 かなり楽だし、 GUI の種類や機能もかなり充実しています。 ある程度 GUI を作っていて、 こんな露骨なウィンドウだと受けが悪いんじゃないかな と思いました。 なんか今っぽいおしゃれなデザインにしたい。 そんな誘惑にかられて調べていると、 CSS でお手軽にデザインを変更 できることがわかりました。 QWidget 派生のオブジェクトを作る際に、 setStyleSheet(str_css)で css を読み込ませることで簡単に実現できます。 次の例では file.css というファイルに書いた css を QWidget 派生クラスのオブジェクトに読み込ませます。 # css の読み込み with open("file.css","r") as f:     self.setStyleSheet("".join(f.readlines())) いろいろな G